自定义方法声明传入参数类型
function ace(int $abc,string $bc){
//return ['abc'=>$abc,'bc'=>$bc];
}
var_dump(ace('123','qwe'));
自定义方法声明返回值类型
function ace(int $abc,string $bc):array{
return ['abc'=>$abc,'bc'=>$bc];
}
var_dump(ace('123','qwe'));
NULL合并运算符
$a = '123';
$a = $a ?? 'abc'; // isset($a) ? $a : 'abc';
echo $a; //return 123
-------------------------------------------------------
$a = '123';
$a = $a ?: 'abc'; // $a ? $a : 'abc';
echo $a;
组合比较符
echo 1 <=> 1; // 0
echo '
';
echo 1 <=> 2; // -1
echo '
';
echo 2 <=> 1; // 1
定义常量数组
define('ABC',['999','888','777']);
echo ABC[1]; //888
绑定方法并闭包试用
class ABC
{
private $a = 1;
protected $b = 2;
}
// PHP 7 之前版本的代码
$getABC = function() {return $this->a;};
$getA = $getABC->bindTo(new ABC, 'ABC'); // 中间层闭包
echo $getA();
echo '
';
// PHP 7+ 版本的代码
$getABC = function() {return $this->b;};
echo $getABC->call(new ABC);
序列化过滤参数
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" => false]);
// 转换所有对象到 __PHP_Incomplete_Class 对象,只允许 MyClass1 和 MyClass2 转换到 __PHP_Incomplete_Class
$data2 = unserialize($serializedObj2 , ["allowed_classes" => ["MyClass1", "MyClass2"]]);
print($data->obj1prop);
print(PHP_EOL);
print($data2->obj2prop);
IntlChar
新的 IntlChar 类暴露出 ICU 中的 Unicode 字符特性。这个类自身定义了许多静态方法用于操作多字符集的 unicode 字符(若要使用此类,请先安装Intl扩展)
printf('%x', IntlChar::CODEPOINT_MAX); //10ffff
echo IntlChar::charName('@'); //COMMERCIAL AT
var_dump(IntlChar::ispunct('!')); //bool(true)
生成随机数
//加密生存被保护的伪随机字符串
//string random_bytes ( int $length )
var_dump(random_bytes(5));
//加密生存被保护的伪随机整数
//int random_int ( int $min , int $max )
var_dump(random_int(10,100));
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};
PHP7异常断言
$s = 123;
//断言(assert)在程序中的某个特定点该的表达式值为真。如果该表达式为假,就中断操作
assert(is_int($s));
//-----------------------------------------------------------------------------------------------------
//zend.assertions
//参数说明
//1 - 生成和执行代码 (开发模式)(默认)
//0 - 生成代码,但在执行时跳过它
//-1 - 不生成代码 (生产环境)
//assert.exception
//参数说明
//1 - 断言失败时抛出,可以抛出异常对象,如果没有提供异常,则抛出 AssertionError 对象实例。
//0 - 使用或生成 Throwable, 仅仅是基于对象生成的警告而不是抛出对象(与 PHP 5 兼容)
ini_set('zend.assertions', 0);
//跳过执行ture == false 不产生错误信息
assert(true == false);
echo 'Hi!';
//return Hi!
//-----------------------------------------------------------------------------------------------------
ini_set('zend.assertions', 1);
ini_set('assert.exception', 1);
assert(true == false);
echo 'Hi!';
//return Fatal error: Uncaught AssertionError: assert(true == false) in D:\phpstudy_pro\WWW\index.php:27 Stack trace: #0 D:\phpstudy_pro\WWW\index.php(27): assert(false, 'assert(true == ...') #1 {main} thrown in D:\phpstudy_pro\WWW\index.php on line 27
错误处理
class MathOperations
{
protected $n = 10;
// 求余数运算,除数为 0,抛出异常
public function doOperation(): string //声明返回值为字符串,但最终返回值是数字类型
{
try {
$value = $this->n % 0;
return $value;
} catch (DivisionByZeroError $e) {
return $e->getMessage(); //Modulo by zero
}
}
}
$mathOperationsObj = new MathOperations();
print($mathOperationsObj->doOperation());
intdiv()
PHP 7 新增加了 intdiv() 函数,接收两个参数,返回值为第一个参数除于第二个参数的值并取整
echo intdiv(9,3),PHP_EOL; // 3
echo intdiv(10,3),PHP_EOL; // 3
echo intdiv(5,10),PHP_EOL; // 0
Session
session_start() 函数可以接收一个数组作为参数,可以覆盖 php.ini 中 session 的配置项
session_start([
'cache_limiter' => 'private', //在读取完毕会话数据之后马上关闭会话存储文件
'cookie_lifetime'=>3600, //SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废
'read_and_close'=>true //在读取完会话数据之后, 立即关闭会话存储文件,不做任何修改
]);
$_SESSION['name']='quan';
echo $_SESSION['name'];
PHP7废弃特性
class A {
function A() {
print('Style Constructor');
}
}
//return Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; A has a deprecated constructor in...
class A {
function b() {
print('Non-static call');
}
}
A::b();
//return Deprecated: Non-static method A::b() should not be called statically in...
Non-static call
password_hash() 随机因子选项
函数原 salt 量不再需要由开发者提供了。函数内部默认带有 salt 能力,无需开发者提供 salt 值
capture_session_meta SSL 上下文选项
废弃了 “capture_session_meta” SSL 上下文选项。 在流资源上活动的加密相关的元数据可以通过 stream_get_meta_data() 的返回值访问
PHP7移除的扩展
PHP7移除的SAPI