本文目录:
PHP5.2 之前:autoload, PDO 和 MySQLi, 类型约束
PHP5.2:JSON 支持
PHP5.3:弃用一些功能、匿名函数,新增魔术方法,命名空间,后期静态绑定,Heredoc 和 Nowdoc, const, 三元运算符,Phar
PHP5.4:Short Open Tag, 数组简写形式,trait, 内置 Web 服务器,细节修改,移除safemode
PHP5.5:yield, list() 用于 foreach, 细节修改
PHP5.6: 常量加强,可变函数参数,命名空间加强php
1. PHP5.2之前。web
#__autoload function __autoload($classname) { require_once("{$classname}.php") }
但该函数已经不被建议使用,缘由是一个项目中仅能有一个这样的 __autoload() 函数,由于 PHP 不容许函数重名。取而代之:json
spl_autoload_register(function($classname) { require_once("{$classname}.php") });
约束类型:segmentfault
// 限制第一个参数为 MyClass, 第二个参数为可执行类型,第三个参数为数组 function MyFunction(MyClass $a, callable $b, array $c) { // ... }
2. PHP5.2数组
json_encode和json_decode服务器
3. PHP5.3函数
弃用的功能:post
register_globals (将post,get自动转化成变量)ui
if(isAuth()) $authorized = true; if($authorized) include("page.php");
若是访问 /auth.php?authorized=1 来定义该变量值,绕过身份验证。spa
Magic Quotes(自动转义用户输入)
Safe Mode
新增的功能:
匿名函数
function aa($func){ echo $func(); } aa(function(){ return 'AA'; }); $a = function(){ return 123; }; //这个分号必须有,要不报错 echo $a();
魔术方法:新增__invoke(), __callStatic()魔术方法
命名空间:
<?php // 命名空间的分隔符是反斜杠,该声明语句必须在文件第一行。 // 命名空间中能够包含任意代码,但只有 **类, 函数, 常量** 受命名空间影响。 namespace XXOO\Test; // 该类的完整限定名是 \XXOO\Test\A , 其中第一个反斜杠表示全局命名空间。 class A{} // 你还能够在已经文件中定义第二个命名空间,接下来的代码将都位于 \Other\Test2 . namespace Other\Test2; // 实例化来自其余命名空间的对象: $a = new \XXOO\Test\A; class B{} // 你还能够用花括号定义第三个命名空间 namespace Other { // 实例化来自子命名空间的对象: $b = new Test2\B; // 导入来自其余命名空间的名称,并重命名, // 注意只能导入类,不能用于函数和常量。 use \XXOO\Test\A as ClassA }
Heredoc 和 Nowdoc
$name = "MyName"; echo <<< TEXT My name is "{$name}". TEXT; #result: My name is "MyName".
Nowdoc
$name = "MyName"; echo <<< 'TEXT' My name is "{$name}". TEXT; #result: My name is "{$name}"
Nowdoc 的行为像一个单引号字符串,不能在其中嵌入变量,和 Heredoc 惟一的区别就是,三个左尖括号后的标识符要以单引号括起来。
const 能够用在class外部,像define,但不能进行运算
<?php const E = 123; class A{ const A = 123; } #错误的写法 const E = 123 * 123;
三元运算符简写
#旧的 echo $a ? $a : "No Value"; #新的 echo $a ?: "No Value"; //三元运算符的简写,其中 true的那个位置是给的 问号 前面的值 $a = 'aa'; echo isset($a) ?: 'bbb'; 返回 1
后期静态绑定:
class ATest { public function say() { echo 'Segmentfault'; } public function callSelf() { self::say(); } public function callStatic() { static::say(); } } class BTest extends ATest { public function say() { echo 'PHP'; } } $b = new BTest(); $b->say(); // output: php $b->callSelf(); // output: segmentfault $b->callStatic(); // output: php
4. PHP5.4
Short Open Tag 自 PHP5.4 起老是可用
数组的简写
$arr = array(1, 2, 3); $arr = [1, 2, 3]
trait 是为相似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减小单继承语言的限制,使开发人员可以自由地在不一样层次结构内独立的类中复用 method
#trait 实现多继承 // trait不能被单独实例化,只能被类所包含 trait SayWorld { public function sayHello() { echo 'World!'; } } class MyHelloWorld { // 将SayWorld中的成员包含进来 use SayWorld; } $xxoo = new MyHelloWorld(); // sayHello() 函数是来自 SayWorld 构件的 $xxoo->sayHello();
内置web服务器
5. PHP5.5
yield关键字用于当函数须要返回一个迭代器的时候, 逐个返回值。
function number10() { for($i = 1; $i <= 10; $i += 1) yield $i; } #结果 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
list() 用于 foreach
能够用 list() 在 foreach 中解析嵌套的数组:
$array = [ [1, 2, 3], [4, 5, 6], ]; foreach ($array as list($a, $b, $c)) echo "{$a} {$b} {$c}\n"; #result: 1 2 3 4 5 6
6. PHP5.6
const支持计算
更好的可变函数参数用于代替 func_get_args()
function add(...$args) { $result = 0; foreach($args as $arg) $result += $arg; return $result; } $arr = [2, 3]; add(1, ...$arr); #result: 6
命名空间加强。能够在里面定义常量和方法
namespace Name\Space { const FOO = 42; function f() { echo __FUNCTION__."\n"; } } namespace { use const Name\Space\FOO; use function Name\Space\f; echo FOO."\n"; f(); }