php7新特性

PHP7自发布以来最受关注的是性能的提高,随着官方版本不断的升级和维护优化,php7版本逐步成熟,很多企业项目也已经逐步移植到PHP7上面,下面介绍下PHP7在语法方面新增了哪些特性。

1: 标量类型声明 有两种模式: 强制 (默认) 和 严格模式。

    // 定义一个函数, 参数和函数返回值必须为整型
    function sun(int $num) {
        return $num * $num;
    }
  • 1
  • 2
  • 3
  • 4

2: 返回值类型声明, 下例定义arraySum函数,标量申明为数组类型,返回值必须为数组

function arraySum(array $arrs) : array {

    return array_map(function (array $arr) : int {
        return array_sum($arr);
    }, $arrs);
}

$result =  arraySum([[1,2,3], [4,5,6], [7,8,9]]);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3: null合并运算符

// php7 以前写法

isset($_GET['type']) ? $_GET['type'] : '';

>=php7 写法
$_GET['type'] ?? ''; // 跟上例代码结果一致,可以减少php7以前大量使用isset或empty
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4: 太空船操作符 (<=>)

// 所有两个数相等返回0, 左边数值大于右边数值 返回1, 左边数值小于右边数值 返回-1

if ( (1<=> 1) == 0) {
    echo "相等\n";
}
if ( (2 <=> 3) == -1) {
    echo "2小于3\n";
}

if ( (5<=> 3) == 1) {
    echo "5大于3\n";
}
// 结果:相等, 2小于3, 5大于3
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

5: define 支持定义常量数组

// php7之前 只支持 const定义数组,现在支持define定义

define('NAMES', array('zhangsan', 'lisi'));

NAMES[0] // zhangsan
  • 1
  • 2
  • 3
  • 4
  • 5

6: 匿名类 new class

interface Logger
{
    public function log($msg);
}
class Application
{
    private $logger;

    public function setLogger(Logger $logger)
    {
        $this->logger = $logger;
    }

    public function getLogger() : logger
    {
        return $this->logger;
    }
}

$app = new Application();

$app->setLogger(new class implement Logger{

    public functoin log($msg)
    {
        echo $msg;
    }
});
$logger = $app->getLogger();
var_dump($logger); // object(class@anonymous)#2 (0) {}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

7: Closure::call() 现在有着更好的性能,简短干练的暂时绑定一个方法到对象上闭包并调用它

class A 
{
    private $x = 1;
}

// PHP 7 之前版本的代码
$getXCB = function() {
        return $this->x;
     };
$getX = $getXCB->bindTo(new A, 'A'); // 中间层闭包
echo $getX();

// PHP 7+ 及更高版本的代码
$getX = function() {
        return $this->x;
    };
echo $getX->call(new A);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

8: 从同一 namespace 导入的类、函数和常量现在可以通过单个 use 语句 一次性导入

namespace names;
class ClassA
{
    public static function getName()
    {
        return __METHOD__;
    }
}
namespace names;
class ClassB
{
    public static function getName()
    {
        return __METHOD__;
    }
}

namespace names;

class ClassC
{
    public static function getName()
    {
       return  __METHOD__;
    }
}

use names\{ClassA, ClassB, ClassC};
ClassA::getName(); // 这里会成功调用classA::getName()方法
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

9: 新增整数除法函数

intdiv(10, 2) // 5
intdiv(10, 3); // 3
intdiv(100,3)  // 33
// 由上面结果可以看出, 除不尽的数会舍弃掉
  • 1
  • 2
  • 3
  • 4

10: session 会话,session_start(); 新增一个参数(array) 可以覆盖PHP.INI中的配置项

session_start([
    'cache_limiter' => 'private',
    'read_and_close' => true
]);
  • 1
  • 2
  • 3
  • 4

11: 新加入两个跨平台的函数: random_bytes() 和 random_int() 用来产生高安全级别的随机字符串和随机整数

random_bytes()
 random_int()
  • 1
  • 2

12: php7 类名可以是一个字符串访问静态方法

class foo
{
    static $bar = 'baz';
}
echo 'foo'::$bar; // baz

// 经过在测试, 在windows下面会出现如下错误
// error : Uncaught Error: Class 'foo' not found in  Stack trace: #0 {main} thrown

转载至:https://blog.csdn.net/xueling022/article/details/72830811

猜你喜欢

转载自blog.csdn.net/linyunping/article/details/80484126