【转】PHP 5.3 5.4 5.5 5.6特色

前二日,PHP5.6已经发布了。大概大家有的是人都停留在5.2临时吗。

PHP5.3

(2009-2012)

PHP5.3
算是叁个要命大的更新,新增了大批量新特点,同时也做了一部分不向下包容的改动。

弃用的职能

以下多少个效益被弃用,若在布局文件中启用,则 PHP 会在运作时发出警告。

Register Globals

那是 php.ini 中的多个抉择(register_globals),
开启后会将有所表单变量($_GET和$_POST)注册为全局变量.
看下边包车型客车例证:

 

1
2
3
4
if(isAuth())
    $authorized = true;
if($authorized)
    include("page.php");

那段代码在通过认证时,将 $authorized 设置为 true. 然后基于 $authorized
的值来支配是还是不是出示页面.

但出于并没有先行把 $authorized 开始化为 false, 当 register_globals
打开时,大概访问 /auth.php?authorized=1 来定义该变量值,绕过身份验证。

该特征属于历史遗留难点,在 PHP4.2 中被暗许关闭,在 PHP5.4 中被移除。

Magic Quotes

对应 php.ini 中的选项 magic_quotes_gpc,
那个特点同样属于历史遗留难点,已经在 PHP5.4 中移除。

该特征会将富有用户输入进行转义,那看起来不错,在率先章大家提到过要对用户输入举行转义。
唯独 PHP 并不知道哪些输入会进入 SQL , 哪些输入会进来 Shell,
哪些输入会被出示为 HTML, 所以很多时候那种转义会挑起混乱。

Safe Mode

许多虚拟主机提供商使用 Safe Mode 来隔开多个用户,但 Safe Mode
存在诸多题目,例如有个别扩大并不根据 Safe Mode 来举行权力控制。
PHP官方推荐使用操作系统的体制来进展权力隔开分离,让Web服务器以不一致的用户权限来运作PHP解释器,请参见第壹章中的最小权限原则.

匿名函数

也叫闭包(Closures),
平常被用来一时半刻性地开创三个无名函数,用于回调函数等用途。

 

1
2
3
4
5
6
$func = function($arg)
{
    print $arg;
};
 
$func("Hello World");

如上代码定义了多个匿名函数,并赋值给了 $func.
能够看看定义匿名函数照旧采取 function
关键字,只可是省略了函数名,直接是参数列表。

下一场大家又调用了 $func 所储存的匿名函数。

匿名函数还足以用 use 关键字来捕捉外部变量:

 

1
2
3
4
5
6
function arrayPlus($array, $num)
{
    array_walk($array, function(&$v) use($num){
        $v += $num;
    });
}

地点的代码定义了2个 arrayPlus() 函数(那不是匿名函数),
它会将三个数组($array)中的每一项,加上2个点名的数字($num).

在 arrayPlus() 的兑现中,大家运用了 array_walk()
函数,它会为一个数组的每一项执行三个回调函数,即我们定义的匿名函数。
在匿名函数的参数列表后,大家用 use 关键字将匿名函数外的 $num
捕捉到了函数内,以便领悟到底应该加上有点。

魔术点子:__invoke(), __callStatic()

PHP
的面向对象种类中,提供了多少“魔术点子”,用于落实类似别的语言中的“重载”,如在走访不设有的质量、方法时接触有些魔术点子。

乘势匿名函数的投入,PHP 引入了三个新的魔术点子 __invoke().
该魔术方法会在将2个指标作为函数调用时被调用:

 

1
2
3
4
5
6
7
8
9
10
class A
{
    public function __invoke($str)
    {
        print "A::__invoke(): {$str}";
    }
}
 
$a = new A;
$a("Hello World");

出口毫无疑问是:

 

1
A::__invoke(): Hello World

__callStatic() 则会在调用一个不存在的静态方法时被调用。

命名空间

PHP的命名空间:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
// 命名空间的分隔符是反斜杠,该声明语句必须在文件第一行。
// 命名空间中可以包含任意代码,但只有 **类, 函数, 常量** 受命名空间影响。
namespace XXOOTest;
 
// 该类的完整限定名是 XXOOTestA , 其中第一个反斜杠表示全局命名空间。
class A{}
 
// 你还可以在已经文件中定义第二个命名空间,接下来的代码将都位于 OtherTest2 .
namespace OtherTest2;
 
// 实例化来自其他命名空间的对象:
$a = new XXOOTestA;
class B{}
 
// 你还可以用花括号定义第三个命名空间
namespace Other {
    // 实例化来自子命名空间的对象:
    $b = new Test2B;
 
    // 导入来自其他命名空间的名称,并重命名,
    // 注意只能导入类,不能用于函数和常量。
    use XXOOTestA as ClassA
}

越来越多关于命名空间的语法介绍请参见PHP官网

命名空间时常和 autoload 一同使用,用于机动加载类完成公文:

 

1
2
3
4
5
spl_autoload_register(
    function ($class) {
        spl_autoload(str_replace("\", "/", $class));
    }
);

当你实例化二个类 XXOOTestA 的时候,那个类的欧洲经济共同体限定名会被传送给 autoload
函数,autoload
函数将类名中的命名空间分隔符(反斜杠)替换为斜杠,并蕴藏对应文件。
这么能够兑现类定义文件分别储存,按需自行加载。

注:http://www.php.net/manual/zh/language.namespaces.php

早先时期静态绑定

PHP 的 OPP 机制,具有持续和接近虚函数的作用,例如如下的代码:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class A
{
    public function callFuncXXOO()
    {
        print $this->funcXXOO();
    }
 
    public function funcXXOO()
    {
        return "A::funcXXOO()";
    }
}
 
class B extends A
{
    public function funcXXOO()
    {
        return "B::funcXXOO";
    }
}
 
$b = new B;
$b->callFuncXXOO();

输出是:

 

1
B::funcXXOO

能够看到,当在 A 中动用 $this->funcXXOO()
时,展现了“虚函数”的机制,实际调用的是 B::funcXXOO().
只是一旦将享有函数都改为静态函数:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class A
{
    static public function callFuncXXOO()
    {
        print self::funcXXOO();
    }
 
    static public function funcXXOO()
    {
        return "A::funcXXOO()";
    }
}
 
class B extends A
{
    static public function funcXXOO()
    {
        return "B::funcXXOO";
    }
}
 
$b = new B;
$b->callFuncXXOO();

事态就没这么乐观了,输出是:

 

1
A::funcXXOO()

那是因为 self 的语义本来就是“当前类”,所以 PHP5.3 给 static
关键字赋予了3个新功能:前期静态绑定:

 

1
2
3
4
5
6
7
8
9
10
11
class A
{
    static public function callFuncXXOO()
    {
        print static::funcXXOO();
    }
 
    // …
}
 
// …

这么就会像预想一样输出了:

 

1
B::funcXXOO

 

Heredoc 和 Nowdoc

PHP5.3 对 Heredoc 以及 Nowdoc 进行了有个别革新,它们都用于在 PHP
代码中放到大段字符串。

Heredoc 的一言一动看似于二个双引号字符串:

 

1
2
3
4
$name = "MyName";
echo <<< TEXT
My name is "{$name}".
TEXT;

Heredoc 以八个左尖括号开端,前面跟二个标识符(TEXT),
直到2个一模一样的顶格的标识符(不能缩进)甘休。
就如双引号字符串一样,在那之中能够停放变量。

Heredoc 还足以用来函数参数,以及类成员开始化:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var_dump(<<<EOD
Hello World
EOD
);
 
class A
{
    const xx = <<< EOD
Hello World
EOD;
 
    public $oo = <<< EOD
Hello World
EOD;
}

Nowdoc 的作为像五个单引号字符串,不可能在其间嵌入变量,和 Heredoc
唯一的界别正是,四个左尖括号后的标识符要以单引号括起来:

 

1
2
3
4
$name = "MyName";
echo <<< ‘TEXT’
My name is "{$name}".
TEXT;

输出:

 

1
My name is "{$name}".

 

用 const 定义常量

PHP5.3 起同时协助在全局命名空间和类中选择 const 定义常量。

旧式风格:

 

1
define("XOOO", "Value");

新颖风格:

 

1
const XXOO = "Value";

const 格局仅适用于常量,不适用于运作时才能求值的表达式:

 

1
2
3
4
// 正确
const XXOO = 1234;
// 错误
const XXOO = 2 * 617;

 

雅士利运算符简写方式

旧式风格:

 

1
echo $a ? $a : "No Value";

可简写成:

 

1
echo $a ?: "No Value";

即要是简单伊利运算符的第②个部分,会私下认可用第①个部分替代。

Phar

Phar即PHP Archive,
初步只是Pear中的七个库而已,后来在PHP5.3被再次编排成C扩充并内置到 PHP
中。
Phar用来将三个 .php 脚本打包(也能够打包别的文件)成1个 .phar
的压缩文件(平日是ZIP格式)。
目的在于模仿 Java 的 .jar,
不对,指标是为着让发布PHP应用程序尤其便利。同时还提供了数字签名验证等成效。

.phar 文件能够像 .php
文件一律,被PHP引擎解释实施,同时您还足以写出如此的代码来含有(require)
.phar 中的代码:

 

1
2
require("xxoo.phar");
require("phar://xxoo.phar/xo/ox.php");

更加多新闻请参见官网 [注].

注:http://www.php.net/manual/zh/phar.using.intro.php

PHP5.4

(2012-2013)

Short Open Tag

Short Open Tag 自 PHP5.4 起接连可用。
在此处集聚讲一下关于 PHP 起止标签的题材。即:

 

1
2
3
<?php
// Code…
?>

平日正是地点的款型,除了那几个之外还有一种简写情势:

 

1
<? /* Code… */ ?>

还足以把

 

1
<?php echo $xxoo;?>

简写成:

 

1
<?= $xxoo;?>

那种简写情势被叫作 Short Open Tag, 在 PHP5.3 起被暗许开启,在 PHP5.4
起一连可用。
采用那种简写情势在 HTML 中放到 PHP 变量将会卓殊有利。

对此纯 PHP 文件(如类达成公文), PHP 官方提出顶格写开首标记,同时 省略
截至标记。
如此能够确认保证全部 PHP 文件都是 PHP
代码,没有别的输出,不然当您包蕴该文件后,设置 Header 和 Cookie
时会蒙受有的麻烦 [注].

注:Header 和 Cookie 必须在出口任何内容前边被发送。

数组简写方式

那是可怜便利的一项特征!

 

1
2
3
4
// 原来的数组写法
$arr = array("key" => "value", "key2" => "value2");
// 简写形式
$arr = ["key" => "value", "key2" => "value2"];

 

Traits

所谓Traits正是“构件”,是用来取代继承的一种机制。PHP中不可能开始展览多重继承,但贰个类能够涵盖七个Traits.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Traits不能被单独实例化,只能被类所包含
trait SayWorld
{
    public function sayHello()
    {
        echo ‘World!’;
    }
}
 
class MyHelloWorld
{
    // 将SayWorld中的成员包含进来
    use SayWorld;
}
 
$xxoo = new MyHelloWorld();
// sayHello() 函数是来自 SayWorld 构件的
$xxoo->sayHello();

Traits还有很多神奇的职能,比如含有多少个Traits,
消除争持,修改访问权限,为函数设置小名等等。
Traits中也一如既往能够包含Traits. 篇幅有限无法每一个比方,详情参见官网 [注].

注:http://www.php.net/manual/zh/language.oop5.traits.php

内置 Web 服务器

PHP从5.4早先内置三个轻量级的Web服务器,不辅助并发,定位是用于开发和调节环境。

在付出条件使用它真的12分有益。

 

1
php -S localhost:8000

诸如此类就在当前目录建立起了一个Web服务器,你能够由此 http://localhost:8000/
来访问。
中间localhost是监听的ip,七千是监听的端口,能够自动修改。

多多行使中,都会议及展览开U途观L重写,所以PHP提供了叁个设置路由脚本的功用:

 

1
php -S localhost:8000 index.php

那样一来,全体的呼吁都会由index.php来拍卖。

你还能选择 XDebug 来开始展览断点调节和测试。

细节修改

PHP5.4 新增了动态访问静态方法的不二法门:

 

1
2
$func = "funcXXOO";
A::{$func}();

新增在实例化时访问类成员的特点:

 

1
(new MyClass)->xxoo();

新增支持对函数重回数组的成员访问解析(那种写法在前头版本是会报错的):

 

1
print func()[0];

 

PHP5.5

(2013起)

yield

yield关键字用于当函数必要再次回到1个迭代器的时候, 每一个再次回到值。

 

1
2
3
4
5
function number10()
{
    for($i = 1; $i <= 10; $i += 1)
        yield $i;
}

该函数的重返值是二个数组:

list() 用于 foreach

能够用 list() 在 foreach 中分析嵌套的数组:

 

1
2
3
4
5
6
7
$array = [
    [1, 2, 3],
    [4, 5, 6],
];
 
foreach ($array as list($a, $b, $c))
    echo "{$a} {$b} {$c}n";

结果:

 

1
2
1 2 3
4 5 6

 

细节修改

不推荐使用 mysql 函数,推荐应用 PDO 或 MySQLi, 参见前文。
不再协理Windows XP.

可用 MyClass::class 取到一个类的欧洲经济共同体限定名(包罗取名空间)。

empty() 扶助表达式作为参数。

try-catch 结构新增 finally 块。

PHP5.6

更好的常量

概念常量时允许利用在此以前定义的常量举办计算:

 

1
2
3
4
5
6
7
8
const A = 2;
const B = A + 1;
 
class C
{
    const STR = "hello";
    const STR2 = self::STR + ", world";
}

允许常量作为函数参数暗中同意值:

 

1
function func($arg = C::STR2)

 

更好的可变函数参数

用以代替 func_get_args()

 

1
2
3
4
5
6
7
function add(…$args)
{
    $result = 0;
    foreach($args as $arg)
        $result += $arg;
    return $result;
}

再者能够在调用函数时,把数组展开为函数参数:

 

1
2
3
$arr = [2, 3];
add(1, …$arr);
// 结果为 6

 

取名空间

取名空间支撑常量和函数:

 

1
2
3
4
5
6
7
8
9
10
11
12
namespace NameSpace {
    const FOO = 42;
    function f() { echo __FUNCTION__."n"; }
}
 
namespace {
    use const NameSpaceFOO;
    use function NameSpacef;
 
    echo FOO."n";
    f();
}

结论:越高越好,最少要用5.4,才能享用一些尖端天性,要是你是行业内部的开发人士的话。

 

原文:http://zblog.i-ver.com/archives/460

相关文章