<?php // Strict mode declare(strict_types=1); function sum(int ...$ints) { return array_sum($ints); } print(sum(2, '3', 4.1)); //Fatal error: Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, ...?>
返回类型声明
有效的返回类型
<?php declare(strict_types = 1); function returnIntValue(int $value): int { return $value; } print(returnIntValue(5));?>
无效返回类型
<?php declare(strict_types = 1); function returnIntValue(int $value): int { return $value + 1.0; } print(returnIntValue(5));//Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned.?>
空合并运算符
在PHP 7中,引入了一个新的特性,即空合并运算符(??)。它用来替代与isset()函数结合的三元操作。该空如果它存在,而不是空合并运算符返回第一个操作数; 否则返回第二个操作数。
<?php // fetch the value of $_GET['user'] and returns 'not passed' // if username is not passed $username = $_GET['username'] ?? 'not passed'; print($username); print(\"大众<br/>\公众); // Equivalent code using ternary operator $username = isset($_GET['username']) ? $_GET['username'] : 'not passed'; print($username); print(\"大众<br/>\"大众); // Chaining ?? operation $username = $_GET['username'] ?? $_POST['username'] ?? 'not passed'; print($username); // output //not passed?>
飞船运算符
它用来比较两个表达式。当第一个表达式分别小于,即是或大于第二个表达式时,它返回-1,0或1。字符串比较ASCII
//integer comparison print( 1 <=> 1);print(\"大众<br/>\"大众); print( 1 <=> 2);print(\公众<br/>\"大众); print( 2 <=> 1);print(\"大众<br/>\"大众);// output 0 -1 1
常量数组
利用define()函数定义数组常量。在PHP 5.6中,只能利用const关键字来定义它们。
<?php//define a array using define function define('animals', [ 'dog', 'cat', 'bird' ]); print(animals[1]);// output cat ?>
匿名类
现在可以利用新类来定义匿名类。匿名类可以用来代替完全的类定义
<?php interface Logger { public function log(string $msg); } class Application { private $logger; public function getLogger(): Logger { return $this->logger; } public function setLogger(Logger $logger) { $this->logger = $logger; } } $app = new Application; $app->setLogger(new class implements Logger { public function log(string $msg) { print($msg); } }); $app->getLogger()->log(\"大众My first Log Message\"大众);?>//outputMy first Log Message
Closure类
Closure :: call()方法被添加为一个简短的办法来临时绑定一个工具浸染域到一个闭包并调用它。与PHP5的bindTo比较,它的性能要快得多。
在PHP 7之前
<?php class A { private $x = 1; } // Define a closure Pre PHP 7 code $getValue = function() { return $this->x; }; // Bind a clousure $value = $getValue->bindTo(new A, 'A'); print($value()); //output 1?>
PHP 7+
<?php class A { private $x = 1; } // PHP 7+ code, Define $value = function() { return $this->x; }; print($value->call(new A)); //output 1?>
过滤unserialize
PHP 7引入了过滤的unserialize()函数,以便在对不可信数据上的工具进行反序列化时供应更好的安全性。它可以防止可能的代码注入,并使开拓职员能够对可以反序列化的类进行白名单。
<?php 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); // default behaviour that accepts all classes // second argument can be ommited. // if allowed_classes is passed as false, unserialize converts all objects into __PHP_Incomplete_Class object $data = unserialize($serializedObj1 , [\"大众allowed_classes\公众 => true]); // converts all objects into __PHP_Incomplete_Class object except those of MyClass1 and MyClass2 $data2 = unserialize($serializedObj2 , [\"大众allowed_classes\"大众 => [\"大众MyClass1\"大众, \"大众MyClass2\"大众]]); print($data->obj1prop); print(\公众<br/>\"大众); print($data2->obj2prop); //output 1 2?>
IntlChar
在PHP7中,增加了一个新的IntlChar类,它试图揭示额外的ICU功能。这个类定义了一些静态方法和常量,可以用来处理Unicode字符。在利用这个课程之前,你须要安装Intl扩展。
<?php printf('%x', IntlChar::CODEPOINT_MAX); print (IntlChar::charName('@')); print(IntlChar::ispunct('!')); //output 10ffff COMMERCIAL AT true?>
CSPRNG
在PHP 7中,引入了两个新的函数来以跨平台的办法天生密码安全的整数和字符串。
random_bytes() - 天生密码安全的伪随机字节。random_int() - 天生密码安全的伪随机整数。<?php $bytes = random_bytes(5); print(bin2hex($bytes)); //output 54cc305593 print(random_int(100, 999)); print(\"大众\"大众); print(random_int(-1000, 0)); //output 614 -882?>
利用声明
从PHP7开始,可以利用单个use语句从相同的命名空间导入类,函数和常量,而不是利用多个use语句。
<?php // Before PHP 7 use com\tutorialspoint\ClassA; use com\tutorialspoint\ClassB; use com\tutorialspoint\ClassC as C; use function com\tutorialspoint\fn_a; use function com\tutorialspoint\fn_b; use function com\tutorialspoint\fn_c; use const com\tutorialspoint\ConstA; use const com\tutorialspoint\ConstB; use const com\tutorialspoint\ConstC; // PHP 7+ code use com\tutorialspoint\{ClassA, ClassB, ClassC as C}; use function com\tutorialspoint\{fn_a, fn_b, fn_c}; use const com\tutorialspoint\{ConstA, ConstB, ConstC};?>
整数部分
PHP 7引入了一个新的函数intdiv(),它对它的操作数进行整数除法,并将除法运算返回为int。
<?php $value = intdiv(10,3); var_dump($value); print(\公众 \"大众); print($value); //output int(3) 3?>
会话选项
session_start()函数接管来自PHP7 + 的一系列选项来覆盖php.ini中设置的会话配置指令。这些选项支持session.lazy_write,默认情形下,它会导致PHP在会话数据发生变动时覆盖任何会话文件。
添加的另一个选项是read_and_close,它表示该当读取会话数据,然后该当立即关闭会话。例如,将session.cache_limiter设置为private,并利用以下代码片段将标志设置为在读取完毕后立即关闭会话。
<?php session_start([ 'cache_limiter' => 'private', 'read_and_close' => true, ]);?>
弃用
PHP 4样式布局函数是与它们定义的类具有相同名称的方法,现在已被弃用,并且将来将被删除。如果PHP 4的布局函数是类中定义的唯一布局函数,则PHP 7将发出E_DEPRECATED。实现__construct()方法的类不受影响。
<?php class A { function A() { print('Style Constructor'); } }?>
对非静态方法的静态调用已被弃用,并可能在将来被删除
<?php class A { function b() { print('Non-static call'); } } A::b(); // Deprecated: Non-static method A::b() should not be called statically in...Non-static call?>password_hash()函数的salt选项已被弃用,以是开拓职员不会天生自己的(常日是不屈安的)盐。当开拓职员不供应盐时,函数本身会天生密码安全的盐,因此不再须要定制盐的天生。该capture_session_meta SSL高下文选项已被弃用。SSL元数据现在通过stream_get_meta_data()函数利用。
缺点处理
从PHP 7开始,缺点处理和报告已经改变。而不是通过PHP 5利用的传统缺点报告机制来报告缺点,现在大多数缺点都是通过抛出错误非常来处理的。与非常类似,这些缺点非常会一贯冒泡,直到它们到达第一个匹配的catch块。如果没有匹配的块,则利用set_exception_handler()安装的默认非常处理程序将被调用。如果没有默认的非常处理程序,那么非常将被转换为致命缺点,并将像传统的缺点一样处理。
由于缺点层次构造不是从Exception扩展的,以是利用catch(Exception $ e){...}块来处理PHP 5中未捕获的非常的代码将不会处理这样的缺点。catch(Error $ e){...}块或set_exception_handler()处理程序是处理致命缺点所必需的。
<?php class MathOperations { protected $n = 10; // Try to get the Division by Zero error object and display as Exception public function doOperation(): string { try { $value = $this->n % 0; return $value; } catch (DivisionByZeroError $e) { return $e->getMessage(); } } } $mathOperationsObj = new MathOperations(); print($mathOperationsObj->doOperation()); // output Modulo by zero?>
举两个例子,怎么样写好代码
最经典的算法,献给正在口试道路上的你
如果你现在在口试PHP的道路上,看看口试根本题吧
Redis干系口试题