本文目录:
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: 常量增强,可变函数参数,命名空间增强
1. PHP5.2以前。
#__autoload
function __autoload($classname)
{
require_once("{$classname}.php")
}
但该函数已经不被建议使用,原因是一个项目中仅能有一个这样的 __autoload() 函数,因为 PHP 不允许函数重名。取而代之:
spl_autoload_register(function($classname)
{
require_once("{$classname}.php")
});
约束类型:
// 限制第一个参数为 MyClass, 第二个参数为可执行类型,第三个参数为数组
function MyFunction(MyClass $a, callable $b, array $c)
{
// ...
}
2. PHP5.2
json_encode和json_decode
3. PHP5.3
弃用的功能:
register_globals (将post,get自动转化成变量)
if(isAuth())
$authorized = true;
if($authorized)
include("page.php");
如果访问 /auth.php?authorized=1 来定义该变量值,绕过身份验证。
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();
}