PHP7 新特性小结下

PHP 7 assert()

assert() 函数能在生产环境中实现零成本的断言,并提供抛出自定义异常及错误的能力。assert() 现在是一个语言结构,它允许第一个参数是一个表达式,而不止是字符串或布尔值。第二个参数可以是一个Throwable对象,而不是一个字符串,如果断言失败且启用了 assert.exception 该对象将被抛出。

assert() 配置:

zend.assertions 默认是 1:

1 生成和执行代码(开发模式)

0 生成代码但不执行

-1 不生成代码(生产环境)

assert.exception 默认是 0:

1 断言失败时抛出,可抛出异常对象,若没有提供异常,抛出AssertionError 对象实例。

0 使用或生成Throwable,仅仅是基于对象生成的警告而不是抛出对象

当 zend.assertions 设置为 0:

ini_set('zend.assertions' , 0);

assert(1==2);

echo 'Aaron';//Aaron

当 zend.assertions 设置为 1,assert.exception 设置为 1:

ini_set('zend.assertions' , 1);

ini_set('assert.exception' , 1);

assert(1==2);

echo 'Aaron';

/*Fatal error Uncaught AssertionError: assert(1 == 2) in ...

:11 Stack trace: #0 ...(11)

: assert(false, 'assert(1 == 2)')

#1 thrown in ... onb line 11

*/

IntlChar()

PHP 7 通过 intl 扩展来支持国际化 (i18n) 和本地化 (l10n) 。此扩展仅仅是对 ICU 库的基础包装,并提供了和 ICU 库类似的方法和特性。

PHP 7 通过新的 IntlChar 类暴露出 ICU 中的 Unicode 字符特性。这个类自身定义了许多静态方法用于操作多字符集的 unicode 字符。

printf{'%x',IntlChar::CODEPOINT_MAX};

echo IntlChar::charName('@');

var_dump(IntlChar::ispunct('!'));

//10ffff

//COMMERCIAL AT

//bool(true)

unserialize()

PHP 7 增加了可以为 unserialize() 提供过滤的特性,可以防止非法数据进行代码注入,提供了更安全的反序列化数据。

class MyClassl {

public #objiprop;

}

class MyClass2 {

public $obj2prop;

}

$obj1 = new MyClass1();

$obj1->obj1prop = 1;

$obj2 = new MyClass2();

$obj2->obj2prop = 2;

$serializedobj1 = serialize($obj1);

$serializedobj2 = serialize($obj2);

//默认行为是接受所有类

//第二个参数可以忽略

// 如果 allowed_classes 设置为 false,

//unserialize 会将所有对象转换为_PHP _Incomplete_Class 对象

$data = userialize($serializedobj1 , ["allowed_classes" =>true]);

// 转换所有对象到 _PHP_Incomplete_Class

//对象, 除了 MyClass1 和 MyClass2 ,

$data2 = userialize($serializedobj2,

["allowed_classes" => ["MyClass1", "MyClass2"]]

);

print($data1->obj1prop);

print(PHP_EOL);

print($data2->obj2prop);

结果:1、2

Closure::call()

PHP 7 的 Closure::call() 有着更好的性能,将一个闭包函数动态绑定到一个新的对象实例并调用执行该函数。

class A{

private $x =1;

// PHP 7 之前版本定义闭包函数代码

$getXCB = function(){

return $this->x;

}

//闭包函数绑定到类 A 上

$getX = $getXCB->bindTo(new A, 'A');

echo $getX();

print(PHP_EOL);

//PHP 7 +代码

$getX = function(){

return $this->x;

}

echo $getX->call(new A);

结果都是 1

匿名类

PHP 7 支持通过new class来实例化一个匿名类,这可以用来替代一些"用后即焚"的完整类定义。

interface Logger{

public function log(string $msg);

}

class Application{

private $logger;

public function ferLogger(): Logger{

return $this->logger;

}

}

$app = new Application;

// 使用 new class 创建匿名类

$app->setLogger(new class implements Logger {

public function log(string $msg){

print($msg);

}

});

$app->getLogger()->log("我的第一条日志");

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180918G0PWLI00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券