php7的新特性

更新日期: 2019-11-15阅读: 1.4k标签: php

都知道吃别人嚼过的东西不香,那也得吃,总比饿着强。谁让自己的牙没长全(英语,计算机基础)。七拼八凑组合一下,加上自己的理解。重点还是要多看多学,哪怕一篇文章只吸取了那么一丁点的知识,也要自己加工,形成自己的知识体系。不要当吃瓜群众,囫囵吞枣的看一下,没过几天就忘了,文章是没少看,最后一无所获,回头来还要花同样的时间再次学习。


null 合并运算符

由于日常使用中存在大量同时使用三元表达式和 isset()的情况, 我们添加了null合并运算符 (_??_) 这个语法糖。如果变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。

$name = isset($_GET['name']) ? $_GET['name'] : 'nobody';
// 等价于 $_GET['name'] 存在且值不为NULL 就返回自身的值,否则为设置的值
$name = $_GET['name'] ?? 'nobody';

$a = null;
$name = $a ?? 0; 
echo $name ; // 输出 0


太空操作符

太空船操作符用于比较两个表达式。当b时它分别返回-1、0或1

// 整数  
echo 1 <=> 1; // 0  
echo 1 <=> 2; // -1  
echo 2 <=> 1; // 1  
  
// 浮点数  
echo 1.5 <=> 1.5; // 0  
echo 1.5 <=> 2.5; // -1  
echo 2.5 <=> 1.5; // 1  
   
// 字符串  
echo "a" <=> "a"; // 0  
echo "a" <=> "b"; // -1  
echo "b" <=> "a"; // 1

通过 define() 定义常量数组

Array 类型的常量现在可以通过 define() 来定义。在 php5.6 中仅能通过 const 定义。

define("nba", [
    '湖人',
    '雷霆',
    '热火',
    '火箭'
]);

print_r(nba); 

// 输出 与数组的操作方式一样了
// Array
// (
//     [0] => 湖人
//     [1] => 雷霆
//     [2] => 热火
//     [3] => 火箭
// )


标量类型声明

标量类型声明 有两种模式: 强制 (默认) 和 严格模式。 现在可以使用下列类型参数(无论用强制模式还是严格模式): 字符串(string), 整数 (_int_), 浮点数 (float), 以及布尔值 (_bool_)。它们扩充了PHP5中引入的其他类型:类名,接口,数组和 回调类型。

function testInt(int ...$ints) {
    return array_sum($ints);
}

function testString(string $a, string $b) {
    echo $a . $b . "\n";
}

function testArr(array $arr) {
    print_r($arr);
}


匿名类

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

interface Logger {
    public function log(string $msg);
}

class Application {
    
    private $logger;

    /**
     * 返回 logger
     *
     * @return Logger
     */
    public function getLogger(): Logger {
        $this->logger->log("abc");
        return $this->logger;
    }

    /**
     * 设置 logger 变量
     *
     * @param Logger $logger
     * @return void
     */
    public function setLogger(Logger $logger) {
        $this->logger = $logger;
    }
}

$app = new Application;
$app->setLogger(new class implements Logger {

    /**
     * 匿名类实现 logger 的 log
     *
     * @param string $msg
     * @return void
     */
    public function log(string $msg) {
        echo sprintf("这是匿名函数实现的 log , msg=%s\n", $msg);
    }
});

var_dump($app->getLogger());

// 输出结果
这是匿名函数实现的 log , msg=abc
object(class@anonymous)#2 (0) {
}


Unicode codepoint 转译语法

这接受一个以16进制形式的 Unicode codepoint,并打印出一个双引号或heredoc包围的 UTF-8 编码格式的字符串。 可以接受任何有效的 codepoint,并且开头的 0 是可以省略的。也就是直接可以转义输出。

echo "\u{aa}";
echo "\u{0000aa}";
echo "\u{9999}";

输出结果

ª
ª (same as before but with optional leading 0's)
香

Closure::call()

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

class A {private $x = 100;}

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

// PHP 7+ 及更高版本的代码
// 将匿名函数绑定到 A 类中,并且以匿名函数的身份调用
$getX = function() {return $this->x;};
echo $getX->call(new A);


为unserialize()提供过滤

// 将所有的对象都转换为 __PHP_Incomplete_Class 对象
$data = unserialize($foo, ["allowed_classes" => false]);

// 将除 MyClass 和 MyClass2 之外的所有对象都转换为 __PHP_Incomplete_Class 对象
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]);

// 默认情况下所有的类都是可接受的,等同于省略第二个参数
$data = unserialize($foo, ["allowed_classes" => true]);


IntlChar

printf('%x', IntlChar::CODEPOINT_MAX);
echo IntlChar::charName('@');
var_dump(IntlChar::ispunct('!'));

以上例程会输出:

10ffff
COMMERCIAL AT
bool(true)


整数除法函数 intdiv()

新加的函数 intdiv() 用来进行 整数的除法运算。

var_dump(intdiv(10, 3));

以上输出

int(3)


Group use declarations

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

// PHP 7 之前的代码
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 some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};


扩展 declare

每执行一条语句,就会调用一次 register_tick_function() 注册的函数,可以来控制程序的执行时间等功能

declare(ticks=1);

// 开始时间
$glnum = 0;

// 检查是否已经超时
function check_timeout(){
    global $glnum;
    $glnum ++;
    echo sprintf("调用了%s次" . "\n", $glnum);
}
// Zend引擎每执行一次低级语句就执行一下check_timeout
register_tick_function('check_timeout');

// 假设业务处理
function yunwu() {
    $a = 1;
    $b = 2;
    $c = 3;
}
yunwu();

// 输出结果
调用了1次
调用了2次
调用了3次
调用了4次
调用了5次
调用了6次


生成器可以返回表达式

此特性基于 PHP 5.5 版本中引入的生成器特性构建的。 它允许在生成器函数中通过使用 return 语法来返回一个表达式 (但是不允许返回引用值), 可以通过调用 Generator::getReturn() 方法来获取生成器的返回值, 但是这个方法只能在生成器完成产生工作以后调用一次。

function createRange($number){
    for($i=0;$i<$number;$i++){
        yield time();
    }
}

$result = createRange(10); // 这里调用上面我们创建的函数
foreach ($result as $val) {
    sleep(1);
    echo $val, PHP_EOL;
}

应用场景:读取大的文件节省内存


预期

预期是向后兼用并增强之前的 assert() 的方法。 它使得在生产环境中启用断言为零成本,并且提供当断言失败时抛出特定异常的能力。

老版本的api出于兼容目的将继续被维护,assert()现在是一个语言结构,它允许第一个参数是一个表达式,而不仅仅是一个待计算的 string或一个待测试的boolean。

ini_set('assert.exception', 1);
class CustomError extends AssertionError {}
assert(false, new CustomError('Some error message'));

链接: https://www.fly63.com/article/detial/9012

PHP 是 Web 开发最好的语言!

PHP 一直受到全球 Web开发人员的青睐,它为人们提供了创建高度交互性和直观的网站和Web应用程序的良好方式,包括语言的广度、深度,且执行简单。以下五个原因,我们来说明PHP是世界 Web开发的最佳语言

PHP中常用加解密方式

PHP中使用OpenSSL生成RSA公钥私钥及进行加密解密示例(非对称加密),php服务端与客户端交互、提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密

在PHP7中不要做的 10 件事

PHP7中不要做的 10 件事: 不要使用 mysql_ 函数、不要编写垃圾代码、不要在文件末尾使用 PHP 闭合标签、 不要做不必要的引用传递、不要在循环中执行查询、不要在 SQL 查询中使用 *

PHP如何打造一个高可用高性能的网站呢?

PHP如何打造一个高可用高性能的网站呢?我们来分析分析高性能高可用的系统。简而言之,采用分布式系统,分布式应用和服务,分布式数据和存储,分布式静态资源,分布式计算,分布式配置和分布式锁。负载均衡,故障转移,实现高并发。

php获取客户端ip地址或者服务器ip地址

在PHP获取客户端IP时,常使用REMOTE_ADDR,但如果客户端是使用代理服务器来访问,那取到的是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用HTTP_X_FORWARDED_FOR

PHP代码_PHP整洁之道

摘录自 Robert C. Martin的Clean Code 书中的软件工程师的原则 ,适用于PHP。 这不是风格指南。 这是一个关于开发可读、可复用并且可重构的PHP软件指南。并不是这里所有的原则都得遵循,甚至很少的能被普遍接受。 这些虽然只是指导,但是都是Clean Code作者多年总结出来的。

php 守护进程

首先需要解释的是什么是守护进程。守护进程就是在后台一直运行的进程。比如我们启动的httpd,mysqld等进程都是常驻内存内运行的程序。

解决PHP剪切缩略图生成png,gif透明图时,黑色背景问题

后台上传png图片透明底变成黑色的问题,php缩放gif和png图透明背景变成黑色的解决方法,本文讲的是php缩放gif和png图透明背景变成黑色的解决方法, 工作中需要缩放一些gif图然后在去Imagecopymerge

PHP超级全局变量、魔术变量和魔术函数

PHP超级全局变量(9个),$GLOBALS  储存全局作用域中的变量,$_SERVER  获取服务器相关信息;PHP魔术变量(8个)__LINE__文件中的当前行号。__FILE__文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。PHP魔术函数(13个)

PHP的高效编程

如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!