语言参考1.类型1.1简介1.2Float浮点型浮点数的精度有限例如floor((0.1+0.7)*10)通常返回7,而不是预期的8,因为结果的内部表达式实际上类似于7.9999999999999991118...1.3StringString字符串最大可以达到2GB。一个字符串可以用4种方式表示:单引号双引号语法结构nowdoc语法结构1.4ArrayarrayPHP中的实际数组以上是一个有序映射。映射是一种将值与键相关联的类型。这种类型在很多方面进行了优化,因此可以将其视为真正的数组,或列表(向量)、哈希表(它是map的一种实现)、字典、集合、堆栈、队列以及更多可能性。由于数组元素的值也可以是另一个数组,树结构和多维数组也是允许的。1.5资源资源类型资源资源是一个特殊的变量,它持有对外部资源的引用。资源是通过专用函数来创建和使用的,以释放资源。引用计数系统是Zend引擎的一部分,可以自动检测资源何时不再被引用(与Java相同)。在这种情况下,该资源使用的所有外部资源都将被垃圾收集系统释放。因此,很少需要手动释放内存。1.6NULL特殊的NULL值表示一个变量没有值。NULL类型的唯一可能值是NULL。如果一个变量被赋值为NULL并且没有被unset()赋值,那么它被认为是NULL1.7伪类型伪类型在PHP文档中用来表示参数可以使用的类型和值。请注意,它们不是PHP语言中的原生类型。因此,自定义函数中不能使用伪类型进行类型约束(typehint)2.变量2.1变量作用域变量的作用域是定义它的上下文(即它的有效作用域)。大多数PHP变量只有一个作用域。这个单一作用域范围还包括由include和require引入的文件,其中变量$a将在包含文件b.inc中生效。但是,在用户自定义函数中,会引入局部函数作用域。函数内部使用的任何变量默认都会限制在局部函数的范围内2.2变量variable$a='hello';$$a='world';echo"$a${$a}";3。常量3.1魔法常量名称说明__LINE__文件中的当前行号__FILE__文件的完整路径和文件号__DIR__文件所在目录__FUNCTION__函数名__CLASS__类名__TRAIT__特征名__METHOD__类的方法名__NAMESPACE__当前命名空间的名称(区分大小写)4.运算符4.1算术运算符//power$a=3;$b=2;回声$a**$b;4.2位运算符按位运算符允许计算和操作整数中指定的位示例名称结果$a&$bAnd(按位与)将$a和$b中的位设置为1到1$a竖线(注1)$bOr(按位或)将$a和$b的任何位设置为1到1$a^$bXor(按位异或)将设置$a和$b中的一个为1,另一个设置为0to1~$aNot(按位取反)将$a中的0位置1,反之$a<<$bShiftleft(左移)设置$a将$a中的位向左移$b次(每次移位表示“乘以2”)$a>>$bShiftright(右移)将$a中的位向右移动$b次(每次移位表示“除以2”)注1:这里的“竖条”垂直bar是“|”,这里markdown的支持好像有点问题4.3比较运算符比较运算符,顾名思义,允许比较两个值ExamplenameResult$a==$bisequaltoTRUEif$a类型转换后等于$b$a===$b是一致的ntTRUE如果$a等于$b并且它们属于同一类型$a!=$b不是EtcTRUE,如果$a不等于$b$a<>$b在类型转换后为TRUE,如果$a不等于$b$a!==$b不等于TRUE,如果$a不等于$b,或者它们属于不同类型$a<$b小于TRUE如果$a严格小于than$b$a>$b大于TRUE如果$a严格大于$b$a<=$b小于或等于TRUE如果$a小于或等于$b$a>=$b大于等于TRUE,如果$a大于等于$b$a<=>$b飞船运算符(组合比较运算符)当$a小于时返回a小于,等于than,equalto,greaterthan$b,Integervaluesgreaterthan0PHP7开始提供.$a??$b??$cNULL合并运算符从左到右第一个存在且不为NULL的操作数。如果两者都未定义且不为NULL,则返回NULL。PHP7开始提供4.4执行运算符PHP支持一个执行运算符:反引号(``)。请注意,这不是单引号!PHP将尝试将反引号的内容作为shell命令执行并返回其输出(即可以分配给变量而不是简单地丢弃到标准输出)。使用反引号运算符“`”与函数shell_exec()具有相同的效果4.5数组运算符示例名称结果$a+$bunionof$aand$bunion$a==$bisequalif$aand$b具有相同的键/值对TRUE$a===$bcongruent如果$a和$b具有相同顺序的相同键/值对并且类型$a!=$b不等于$a不等于$b则为TRUEbTRUE$a<>$b不等于TRUE如果$a不等于$b$a!==$b不等于TRUE如果$a不完全等于$b4.6使用类型运算符instanceof判断一个PHP变量是否属于某个类的实例instanceof也可以用来判断一个变量是否是继承自父类的子类的实例instanceof也可以用来判断一个变量是否实现了某个接口对象实例5.流程控制5.1流程控制的替代语法PHP提供了一些流程控制的替代语法,包括if、while、for、foreach和switch。替代语法的基本形式是将左花括号({)替换为冒号(:),将右花括号(})替换为endif;,endwhile;,endfor;,endforeach;和结束开关;if(true):echo"run\n";endif;5.2do-while5.3breakbreak结束当前for、foreach、while、do-while或switch结构的执行break可以接受一个可选的数字参数来决定有多少跳出循环的次数5.4continue在循环中继续该结构用于跳过本循环中的其余代码,如果条件计算结果为真则开始下一个循环。continue接受一个可选的数字参数来确定要跳到循环末尾的循环次数。默认值为1,即跳转到当前循环的末尾。5.5declaredeclare结构体用于设置一段代码的执行指令declare(ticks=1);//每次tick事件调用的函数functiontick_handler(){echo"tick_handler()called\n";}register_tick_function('tick_handler');$a=1;if($a>0){$a+=2;print($a);}5.6requirerequire几乎和include完全一样,只是处理失败的方式不同。require在出错时引发E_COMPILE_ERROR级别的错误。也就是说,它会导致脚本停止,include只会产生一个警告(E_WARNING),而脚本会继续运行。6.函数6.1用户自定义函数当有条件地定义一个函数时,必须在调用该函数之前定义它。PHP不支持函数重载,也不能取消定义或重新定义声明的函数,但要避免超过100-200级的递归函数/方法调用,因为它可能会使堆栈崩溃并终止当前脚本。无限递归可以被认为是一种编程错误6.2可变函数PHP支持可变函数的概念。这意味着如果变量名后有圆括号,PHP将寻找与变量值同名的函数并尝试执行它。可变函数可以用来实现一些用途,包括回调函数和函数表functionfoo(){echo"Infoo()
\n";}$func='foo';$func();//Thiscallsfoo()6.3匿名函数匿名函数(Anonymousfunctions),也叫闭包函数(closures),允许临时创建一个没有指定名称的函数。最常用作回调函数(callback)参数的值$greet=function($name){printf("Hello%s\r\n",$name);};$greet('World');$greet('PHP');7.类和对象7.1基本概念每个类的定义都以关键字class开头,后面是类名,再后面是一对大括号,里面包含了类的属性和方法的定义。一个类可以包含它自己的常量、变量(称为“属性”)和函数(称为“方法”)。当在类定义内部调用方法时,有一个伪变量$this7.2会自动加载在编写面向对象(OOP)程序时,许多开发人员会为每个类创建一个新的PHP文件。这可能会引起麻烦:在每个脚本的开头,您需要包含(include)一长串(每个类一个文件)。在PHP5中,这不再是必需的。spl_autoload_register()函数可以注册任意数量的自动加载器,并在使用尚未定义的类和接口时自动加载它们。通过注册自动加载器,脚本引擎有最后一次机会在PHP失败并出现错误之前加载所需的类spl_autoload_register(function($class_name){require_once$class_name.'.php';});$obj=newMyClass1();$obj2=newMyClass2();7.3构造函数和析构函数构造函数PHP5允许开发人员将类中的方法定义为构造函数。一个有构造函数的类,每次创建一个新的对象都会调用这个方法,所以非常适合在使用对象析构函数之前做一些初始化工作PHP5引入了析构函数的概念,这和其他面向对象语言类似,例如C++。当对象的所有引用被删除或对象被显式销毁时,析构函数将被执行。7.4抽象类PHP5支持抽象类和抽象方法。不能实例化定义为抽象的类。任何一个类,如果其中至少有一个方法被声明为abstract,那么这个类就必须被声明为abstract。定义为abstract的方法只声明其调用方法(参数),不能定义其具体的功能实现。内容接口是通过interface关键字来定义的,就像定义一个标准类一样,但是接口中定义的所有方法都是空的。接口中定义的所有方法都必须是public的,这是接口特性的实现(implements)要实现一个接口,使用implements操作符。接口中定义的所有方法都必须在类中实现,否则会报致命错误。一个类可以实现多个接口,多个接口的名称用逗号隔开。7.6Trait从PHP5.4.0开始,PHP实现了一种代码重用的方法,叫做traitTrait,这是为单继承语言准备的类似于PHP的一种代码重用机制。为了减少单一继承语言的局限性,Trait使开发者可以在不同的层次结构中自由地复用独立类中的方法。Trait和Class组合的语义定义了一种降低复杂性并避免与传统多重继承和Mixin类相关的典型问题的方法。Trait和Class相似,但只是旨在以细粒度和一致的方式组合功能。不能由特征本身实例化。它在传统继承的基础上增加了横向组合的特性;也就是说,应用程序的几个类之间不需要继承7.7匿名类7.8魔法方法__construct(),__destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset()、__sleep()、__wakeup()、__toString()、__invoke()等方法在PHP中被称为“魔法方法”(Magicmethods)7.9Final关键字PHP5添加了final关键字。如果父类中的方法声明为final,则该方法不能被子类覆盖。如果一个类被声明为final,则不能被继承8.生成器9.预定义变量名用途超全局变量超全局变量是一个内置变量,在所有作用域内始终可用$GLOBALS指的是在全局作用域内所有可用的变量$_SERVER服务器和执行环境信息$_GETHTTPGET变量$_POSTHTTPPOST变量$_FILESHTTP文件上传变量$_REQUESTHTTP请求变量$_SESSIONS会话变量$_ENV环境变量$_COOKIEHTTPCookies$php_errormsg之前的错误信息$HTTP_RAW_POST_DATA原生POST数据$http_response_headerHTTP响应头$argc编号ofparameterspassedtothescript$argv传递给脚本的参数数组《PHP 面试问答》结合实际的PHP面试,系统总结了面试中的各种问题,力求提供简洁准确的答案。如果大家在PHP面试中遇到问题,欢迎提Issues交流。包括网络协议、数据结构与算法、PHP、Web、MySQL、Redis、Linux、安全、设计模式、架构、自我介绍、离职原因、职业规划、准备题等。
