PHP7新特性字符串转数组,php7的新特性

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

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

太空操作符

太空船操作符用于比较两个表达式。当$a小于、等于或大于$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

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'));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值