/**
*php7特性
*/
//1.null合并运算符
//由于日常使用中存在大量同时使用三元表达式和 isset()的情况, 我们添加了null合并运算符 (??) 这个语法糖。如果变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。
$a=$_SERVER['a'] ?? 1; // 1
//2.组合比较符
//太空船操作符用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1。 比较的原则是沿用 PHP 的常规比较规则进行的。
echo 1 <=> 1,PHP_EOL; // 0
echo 1 <=> 2,PHP_EOL;// -1
echo 2 <=> 1,PHP_EOL;// 1
//3.通过 define() 定义常量数组
//Array 类型的常量现在可以通过 define() 来定义。在 PHP5.6 中仅能通过 const 定义。
define('wzl',['wang','zi','long']);
var_dump(wzl);
//4.新增加了 intdiv() 函数,接收两个参数,返回值为第一个参数除于第二个参数的值并取整。
//注意:(1)ceil向上取整;(2)floor向下取整;
var_dump(intdiv(10,3)); //3
var_dump(intdiv(-10,3)); //-3
//5.use 语句 命名空间 可以分组使用 从同一 namespace 导入的类、函数和常量现在可以通过单个 use 语句 一次性导入了。
// 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};
*/
//6.session_start() 函数可以接收一个数组作为参数,可以覆盖 php.ini 中 session 的配置项。
/*
这个特性也引入了一个新的 php.ini 设置(session.lazy_write), 默认情况下设置为 true,意味着 session 数据只在发生变化时才写入。
除了常规的会话配置指示项, 还可以在此数组中包含 read_and_close 选项。如果将此选项的值设置TRUE, 那么会话文件会在读取完毕之后马上关闭,
因此,可以在会话数据没有变动的时候,避免不必要的文件锁。
把 cache_limiter 设置为私有的,同时在阅读完 session 后立即关闭。
*/
session_start([
'cache_limiter' => 'private',
'cookie_lifetime'=>3600, //SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废
'read_and_close' => true,
]);
//$_SESSION['name']='quan';
//7.为unserialize()提供过滤 可以防止非法数据进行代码注入,提供了更安全的反序列化数据。
// 默认行为是接收所有类
// 第二个参数可以忽略
// 如果 allowed_classes 设置为 false, unserialize 会将所有对象转换为 __PHP_Incomplete_Class 对象
$obj1 = new MyClass1();
$obj1->obj1prop = 1;
$obj2 = new MyClass2();
$obj2->obj2prop = 2;
$serializedObj1 = serialize($obj1);
$serializedObj2 = serialize($obj2);
$data = unserialize($serializedObj1 , ["allowed_classes" => true]);
// 转换所有对象到 __PHP_Incomplete_Class 对象,只允许 MyClass1 和 MyClass2 转换到 __PHP_Incomplete_Class
$data2 = unserialize($serializedObj2 , ["allowed_classes" => ["MyClass1", "MyClass2"]]);
$arr = array('a','b','c','unserialize','怎么用');
echo serialize($arr),'<br/>'; // a:5:{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";i:3;s:11:"unserialize";i:4;s:9:"怎么用";}
// 还原序列化的数据
print_r(unserialize(serialize($arr)));// Array ( [0] => a [1] => b [2] => c [3] => unserialize [4] => 怎么用 )
var_dump($data);
// 8.Closure::call() 有着更好的性能,将一个闭包函数 动态绑定到一个新的对象实例 并调用执行该函数。
$getX = function() {
return $this->obj1prop;
};
echo $getX->call(new MyClass1); //动态将getX 函数 绑定MyClass1对象上
//9. 变量类型声明和返回类型声明 两种模式: 强制(默认)和严格模式. 可以使用下列类型参数: string,int,float,bool
//... 操作符: 表示这是一个可变参数. php5.6及以上的版本可使用: 函数定义的时候变量前使用.
//严格模式
//模式声明:declare(strict_types=1); 默认情况值为0,值为1代表为严格校验的模式
function add(int $a,int $b):int {
return $a+$b;
}
echo add(1,"1");
//10.intp 新增加intp()函数,接收两个参数,返回值为第一个参数除于第二个参数的值并取整.