您好,登录后才能下订单哦!
php7的新特性有哪些?针对这个问题,这篇文章给出了相对应的分析和解答,希望能帮助更多想解决这个问题的朋友找到更加简单易行的办法。
强制模式
declare(strict_types=1)
  <?php 
// 强制模式 
function sum(int ...$ints) 
{ 
   return array_sum($ints); 
} 
print(sum(2, '3', 4.1)); 
?>
以上程序执行输出结果为:
9复制代码严格模式
<?php 
declare(strict_types=1); 
function sum(int ...$ints) 
{ 
   return array_sum($ints); 
} 
print(sum(2, '3', 4.1)); 
?>
以上程序由于采用了严格模式,所以如果参数中出现不适整数的类型会报错,执行输出结果为:
PHP Fatal error:  Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, called in……复制代码以前的三元运算
$site = isset($_GET['site']) ? $_GET['site'] : '菜鸟教程';复制代码
现在的合并运算符
$site = $_GET['site'] ?? '菜鸟教程';复制代码
以上2种方法是一样的
以下是实例:
<?php // 获取 $_GET['site'] 的值,如果不存在返回 '高压锅'$site = $_GET['site'] ?? '高压锅';print($site);print(PHP_EOL); // PHP_EOL 为换行符 // 以上代码等价于$site = isset($_GET['site']) ? $_GET['site'] : '高压锅';print($site);print(PHP_EOL); // ?? 链$site = $_GET['site'] ?? $_POST['site'] ?? '高压锅';print($site); ?>复制代码
PHP 7 新增加的太空船运算符(组合比较符)用于比较两个表达式 $a 和 $b,如果 $a 小于、等于或大于 $b时,它分别返回-1、0或1。
以下是实例
<?php // 整型比较print( 1 <=> 1);print(PHP_EOL);print( 1 <=> 2);print(PHP_EOL);print( 2 <=> 1);print(PHP_EOL);print(PHP_EOL); // PHP_EOL 为换行符 // 浮点型比较print( 1.5 <=> 1.5);print(PHP_EOL);print( 1.5 <=> 2.5);print(PHP_EOL);print( 2.5 <=> 1.5);print(PHP_EOL);print(PHP_EOL); // 字符串比较print( "a" <=> "a");print(PHP_EOL);print( "a" <=> "b");print(PHP_EOL);print( "b" <=> "a");print(PHP_EOL); ?>复制代码
以上结果分别为复制代码
0 -1 1 0 -1 1 0 -1 1复制代码
以下是实例:
// 使用 define 函数来定义数组
define('sites', [   'Google',   'Runoob',   'Taobao']);print(sites[1]);
?>
以上程序执行输出结果为:
Runoob复制代码        <?php 
        interface Logger { 
           public function log(string $msg); 
        } 
        
        class Application { 
           private $logger; 
        
           public function getLogger(): Logger { 
              return $this->logger; 
           } 
        
           public function setLogger(Logger $logger) { 
              $this->logger = $logger; 
           }   
        } 
        
        $app = new Application; 
        // 使用 new class 创建匿名类 
        $app->setLogger(new class implements Logger { 
           public function log(string $msg) { 
              print($msg); 
           } 
        }); 
        $app->getLogger()->log("我的第一条日志"); 
        ?>
以上程序执行输出结果为:
我的第一条日志复制代码Closure::call() 有着更好的性能,将一个闭包函数动态绑定到一个新的对象实例并调用执行该函数。实例
<?php 
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
1复制代码unserialize() 提供过滤的特性,可以防止非法数据进行代码注入,提供了更安全的反序列化数据。实例
<?php 
class MyClass1 {  
   public $obj1prop;    
} 
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 = unserialize($serializedObj1 , ["allowed_classes" => true]); 
// 转换所有对象到 __PHP_Incomplete_Class 对象,除了 MyClass1 和 MyClass2 
$data2 = unserialize($serializedObj2 , ["allowed_classes" => ["MyClass1", "MyClass2"]]); 
print($data->obj1prop); 
print(PHP_EOL); 
print($data2->obj2prop); 
?>
以上程序执行输出结果为:
1
2复制代码注意 以上特性是
unserialize()里面多了一个参数选择 allowed_classes
CSPRNG(Cryptographically Secure Pseudo-Random Number Generator,伪随机数产生器)。
PHP 7 通过引入几个 CSPRNG 函数提供一种简单的机制来生成密码学上强壮的随机数。
random_bytes() - 加密生存被保护的伪随机字符串。
random_int() - 加密生存被保护的伪随机整数。
综上  类似于原先的 rand() 和  'mt_rand()';  只不过 现在random_bytes()生成的是随机字符串
assert()函数。它能在生产环境中实现零成本的断言,并且提供抛出自定义异常及错误的能力。assert()的应用 跟assert_option() 配合复制代码
还有参数类型
| 配置项 | 默认值 | 可选值 | 
|---|---|---|
| zend.assertions | 1 | 1.生成和执行代码 (开发模式)  0.生成代码,但在执行时跳过它 -1.不生成代码 (生产环境)  | 
| assert.exception | 0 | 1.断言失败时抛出,可以抛出异常对象,如果没有提供异常,则抛出AssertionError 对象实例。 0 . 使用或生成 Throwable, 仅仅是基于对象生成的警告而不是抛出对象(与 PHP 5 兼容)  | 
**参数**
assertion
断言。在 PHP 5 中,是一个用于执行的字符串或者用于测试的布尔值。在 PHP 7 中,可以是一个返回任何值的表达式, 它将被执行结果用于指明断言是否成功。
description
如果 assertion 失败了,选项 description 将会包括在失败信息里。
exception
在 PHP 7 中,第二个参数可以是一个 Throwable 对象,而不是一个字符串,如果断言失败且启用了 assert.exception 该对象将被抛出
实例
将 zend.assertions 设置为 0:
实例
<?php 
ini_set('zend.assertions', 0); 
assert(true == false); 
echo 'Hi!'; 
?>
以上程序执行输出结果为:
Hi!
将 zend.assertions 设置为 1,assert.exception 设置为 1:
实例
<?php 
ini_set('zend.assertions', 1); 
ini_set('assert.exception', 1); 
assert(true == false); 
echo 'Hi!'; 
?>
以上程序执行输出结果为:
Fatal error: Uncaught AssertionError: assert(true == false) in -:2
Stack trace:#0 -(2): assert(false, 'assert(true == ...')#1 {main}
  thrown in - on line 2复制代码// PHP 7 之前版本需要使用多次 use 
use some\namespace\ClassA; 
use some\namespace\ClassB; 
use some\namespace\ClassC as C; 
use function some\namespace\fn_a; 
use function some\namespace\fn_b; 
use function some\namespace\fn_c; 
use const some\namespace\ConstA; 
use const some\namespace\ConstB; 
use const some\namespace\ConstC; 
// PHP 7+ 之后版本可以使用一个 use 导入同一个 namespace 的类 
use some\namespace\{ClassA, ClassB, ClassC as C}; 
use function some\namespace\{fn_a, fn_b, fn_c}; 
use const some\namespace\{ConstA, ConstB, ConstC}; 
?>复制代码关于php7的新特性就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。