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("我的第一条日志");
领取专属 10元无门槛券
私享最新 技术干货