{"id":1206,"date":"2015-12-09T22:26:40","date_gmt":"2015-12-09T14:26:40","guid":{"rendered":"http:\/\/i.actom.me\/?p=1206"},"modified":"2015-12-09T22:26:40","modified_gmt":"2015-12-09T14:26:40","slug":"%e8%bd%acphp-7%e6%96%b0%e7%89%b9%e6%80%a7","status":"publish","type":"post","link":"https:\/\/actom.me\/blog\/%e8%bd%acphp-7%e6%96%b0%e7%89%b9%e6%80%a7.html","title":{"rendered":"[\u8f6c]PHP 7\u65b0\u7279\u6027"},"content":{"rendered":"<div id=\"migration70.new-features.scalar-type-declarations\" class=\"sect2\">\n<h3 class=\"title\">\u6807\u91cf\u7c7b\u578b\u58f0\u660e<a class=\"genanchor\" href=\"http:\/\/php.net\/manual\/zh\/migration70.new-features.php#migration70.new-features.scalar-type-declarations\"> \u00b6<\/a><\/h3>\n<p class=\"para\">\u6807\u91cf<a class=\"link\" href=\"http:\/\/php.net\/manual\/zh\/functions.arguments.php#functions.arguments.type-declaration\">\u7c7b\u578b\u58f0\u660e<\/a> \u6709\u4e24\u79cd\u6a21\u5f0f: \u5f3a\u5236 (\u9ed8\u8ba4) \u548c \u4e25\u683c\u6a21\u5f0f\u3002 \u73b0\u5728\u53ef\u4ee5\u4f7f\u7528\u4e0b\u5217\u7c7b\u578b\u53c2\u6570\uff08\u65e0\u8bba\u7528\u5f3a\u5236\u6a21\u5f0f\u8fd8\u662f\u4e25\u683c\u6a21\u5f0f\uff09\uff1a \u5b57\u7b26\u4e32(<span class=\"type\"><a class=\"type string\" href=\"http:\/\/php.net\/manual\/zh\/language.types.string.php\">string<\/a><\/span>), \u6574\u6570 (<em>int<\/em>), \u6d6e\u70b9\u6570 (<span class=\"type\"><a class=\"type float\" href=\"http:\/\/php.net\/manual\/zh\/language.types.float.php\">float<\/a><\/span>), \u4ee5\u53ca\u5e03\u5c14\u503c (<em>bool<\/em>)\u3002\u5b83\u4eec\u6269\u5145\u4e86PHP5\u4e2d\u5f15\u5165\u7684\u5176\u4ed6\u7c7b\u578b\uff1a\u7c7b\u540d\uff0c\u63a5\u53e3\uff0c<span class=\"type\"><span class=\"type \u6570\u7ec4\">\u6570\u7ec4<\/span><\/span>\u548c <span class=\"type\"><span class=\"type \u56de\u8c03\u7c7b\u578b\">\u56de\u8c03\u7c7b\u578b<\/span><\/span>\u3002<\/p>\n<div class=\"informalexample\">\n<div class=\"example-contents\">\n<div class=\"phpcode\">\n<pre class=\"lang:php decode:true \">&lt;?php\r\n\/\/ Coercive mode\r\nfunction sumOfInts(int ...$ints)\r\n{\r\n    return array_sum($ints);\r\n}\r\n\r\nvar_dump(sumOfInts(2, '3', 4.1));<\/pre>\n<\/div>\n<\/div>\n<p class=\"para\">\u4ee5\u4e0a\u4f8b\u7a0b\u4f1a\u8f93\u51fa\uff1a<\/p>\n<div class=\"example-contents screen\">\n<div class=\"cdata\">\n<pre>int(9)\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<p class=\"para\">\u8981\u4f7f\u7528\u4e25\u683c\u6a21\u5f0f\uff0c\u4e00\u4e2a <a class=\"link\" href=\"http:\/\/php.net\/manual\/zh\/control-structures.declare.php\"><em>declare<\/em><\/a> \u58f0\u660e\u6307\u4ee4\u5fc5\u987b\u653e\u5728\u6587\u4ef6\u7684\u9876\u90e8\u3002\u8fd9\u610f\u5473\u7740\u4e25\u683c\u58f0\u660e\u6807\u91cf\u662f\u57fa\u4e8e\u6587\u4ef6\u53ef\u914d\u7684\u3002 \u8fd9\u4e2a\u6307\u4ee4\u4e0d\u4ec5\u5f71\u54cd\u53c2\u6570\u7684\u7c7b\u578b\u58f0\u660e\uff0c\u4e5f\u5f71\u54cd\u5230\u51fd\u6570\u7684\u8fd4\u56de\u503c\u58f0\u660e\uff08\u53c2\u89c1 <a class=\"link\" href=\"http:\/\/php.net\/manual\/zh\/functions.returning-values.php#functions.returning-values.type-declaration\">\u8fd4\u56de\u503c\u7c7b\u578b\u58f0\u660e<\/a>, \u5185\u7f6e\u7684PHP\u51fd\u6570\u4ee5\u53ca\u6269\u5c55\u4e2d\u52a0\u8f7d\u7684PHP\u51fd\u6570\uff09<\/p>\n<p class=\"para\">\u5b8c\u6574\u7684\u6807\u91cf\u7c7b\u578b\u58f0\u660e\u6587\u6863\u548c\u793a\u4f8b\u53c2\u89c1<a class=\"link\" href=\"http:\/\/php.net\/manual\/zh\/functions.arguments.php#functions.arguments.type-declaration\">\u7c7b\u578b\u58f0\u660e<\/a>\u7ae0\u8282\u3002<\/p>\n<\/div>\n<div id=\"migration70.new-features.return-type-declarations\" class=\"sect2\">\n<h3 class=\"title\">\u8fd4\u56de\u503c\u7c7b\u578b\u58f0\u660e<a class=\"genanchor\" href=\"http:\/\/php.net\/manual\/zh\/migration70.new-features.php#migration70.new-features.return-type-declarations\"> \u00b6<\/a><\/h3>\n<p class=\"para\">PHP 7 \u589e\u52a0\u4e86\u5bf9<a class=\"link\" href=\"http:\/\/php.net\/manual\/zh\/functions.returning-values.php#functions.returning-values.type-declaration\">\u8fd4\u56de\u7c7b\u578b\u58f0\u660e<\/a>\u7684\u652f\u6301\u3002 \u7c7b\u4f3c\u4e8e<a class=\"link\" href=\"http:\/\/php.net\/manual\/zh\/functions.arguments.php#functions.arguments.type-declaration\">\u53c2\u6570\u7c7b\u578b\u58f0\u660e<\/a>\uff0c\u8fd4\u56de\u7c7b\u578b\u58f0\u660e\u6307\u660e\u4e86\u51fd\u6570\u8fd4\u56de\u503c\u7684\u7c7b\u578b\u3002\u53ef\u7528\u7684<a class=\"link\" href=\"http:\/\/php.net\/manual\/zh\/functions.arguments.php#functions.arguments.type-declaration.types\">\u7c7b\u578b<\/a>\u4e0e\u53c2\u6570\u58f0\u660e\u4e2d\u53ef\u7528\u7684\u7c7b\u578b\u76f8\u540c\u3002<\/p>\n<div class=\"informalexample\">\n<div class=\"example-contents\">\n<div class=\"phpcode\">\n<pre class=\"lang:php decode:true\">&lt;?php\r\n\r\nfunction arraysSum(array ...$arrays): array\r\n{\r\n    return array_map(function(array $array): int {\r\n        return array_sum($array);\r\n    }, $arrays);\r\n}\r\n\r\n<code>print_r(arraysSum([1,2,3],\u00a0[4,5,6],\u00a0[7,8,9])); <\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"para\">\u4ee5\u4e0a\u4f8b\u7a0b\u4f1a\u8f93\u51fa\uff1a<\/p>\n<div class=\"example-contents screen\">\n<div class=\"cdata\">\n<pre>Array\r\n(\r\n    [0] =&gt; 6\r\n    [1] =&gt; 15\r\n    [2] =&gt; 24\r\n)\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<p class=\"para\">\u5b8c\u6574\u7684\u6807\u91cf\u7c7b\u578b\u58f0\u660e\u6587\u6863\u548c\u793a\u4f8b\u53ef\u53c2\u89c1 <a class=\"link\" href=\"http:\/\/php.net\/manual\/zh\/functions.returning-values.php#functions.returning-values.type-declaration\">\u8fd4\u56de\u503c\u7c7b\u578b\u58f0\u660e<\/a>.<\/p>\n<\/div>\n<div id=\"migration70.new-features.null-coalesce-op\" class=\"sect2\">\n<h3 class=\"title\">null\u5408\u5e76\u8fd0\u7b97\u7b26<a class=\"genanchor\" href=\"http:\/\/php.net\/manual\/zh\/migration70.new-features.php#migration70.new-features.null-coalesce-op\"> \u00b6<\/a><\/h3>\n<p class=\"para\">\u7531\u4e8e\u65e5\u5e38\u4f7f\u7528\u4e2d\u5b58\u5728\u5927\u91cf\u540c\u65f6\u4f7f\u7528\u4e09\u5143\u8868\u8fbe\u5f0f\u548c <span class=\"function\"><a class=\"function\" href=\"http:\/\/php.net\/manual\/zh\/function.isset.php\">isset()<\/a><\/span>\u7684\u60c5\u51b5\uff0c \u6211\u4eec\u6dfb\u52a0\u4e86null\u5408\u5e76\u8fd0\u7b97\u7b26 (<em>??<\/em>) \u8fd9\u4e2a\u8bed\u6cd5\u7cd6\u3002\u5982\u679c\u53d8\u91cf\u5b58\u5728\u4e14\u503c\u4e0d\u4e3a<strong><code>NULL<\/code><\/strong>\uff0c \u5b83\u5c31\u4f1a\u8fd4\u56de\u81ea\u8eab\u7684\u503c\uff0c\u5426\u5219\u8fd4\u56de\u5b83\u7684\u7b2c\u4e8c\u4e2a\u64cd\u4f5c\u6570\u3002<\/p>\n<div class=\"informalexample\">\n<div class=\"example-contents\">\n<div class=\"phpcode\">\n<pre class=\"lang:php decode:true \">&lt;?php\r\n\/\/ Fetches the value of $_GET['user'] and returns 'nobody'\r\n\/\/ if it does not exist.\r\n$username = $_GET['user'] ?? 'nobody';\r\n\/\/ This is equivalent to:\r\n$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';\r\n\r\n\/\/ Coalesces can be chained: this will return the first\r\n\/\/ defined value out of $_GET['user'], $_POST['user'], and\r\n\/\/ 'nobody'.\r\n$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';\r\n?&gt;<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"migration70.new-features.spaceship-op\" class=\"sect2\">\n<h3 class=\"title\">\u592a\u7a7a\u8239\u64cd\u4f5c\u7b26\uff08\u7ec4\u5408\u6bd4\u8f83\u7b26\uff09<a class=\"genanchor\" href=\"http:\/\/php.net\/manual\/zh\/migration70.new-features.php#migration70.new-features.spaceship-op\"> \u00b6<\/a><\/h3>\n<p class=\"para\">\u592a\u7a7a\u8239\u64cd\u4f5c\u7b26\u7528\u4e8e\u6bd4\u8f83\u4e24\u4e2a\u8868\u8fbe\u5f0f\u3002\u5f53<var class=\"varname\"><var class=\"varname\">$a<\/var><\/var>\u5927\u4e8e\u3001\u7b49\u4e8e\u6216\u5c0f\u4e8e<var class=\"varname\"><var class=\"varname\">$b<\/var><\/var>\u65f6\u5b83\u5206\u522b\u8fd4\u56de-1\u30010\u62161\u3002 \u6bd4\u8f83\u7684\u539f\u5219\u662f\u6cbf\u7528 PHP \u7684<a class=\"link\" href=\"http:\/\/php.net\/manual\/zh\/types.comparisons.php\">\u5e38\u89c4\u6bd4\u8f83\u89c4\u5219<\/a>\u8fdb\u884c\u7684\u3002<\/p>\n<div class=\"informalexample\">\n<div class=\"example-contents\">\n<div class=\"phpcode\">\n<pre class=\"lang:php decode:true \">&lt;?php\r\n\/\/ Integers\r\necho 1 &lt;=&gt; 1; \/\/ 0\r\necho 1 &lt;=&gt; 2; \/\/ -1\r\necho 2 &lt;=&gt; 1; \/\/ 1\r\n\r\n\/\/ Floats\r\necho 1.5 &lt;=&gt; 1.5; \/\/ 0\r\necho 1.5 &lt;=&gt; 2.5; \/\/ -1\r\necho 2.5 &lt;=&gt; 1.5; \/\/ 1\r\n \r\n\/\/ Strings\r\necho \"a\" &lt;=&gt; \"a\"; \/\/ 0\r\necho \"a\" &lt;=&gt; \"b\"; \/\/ -1\r\necho \"b\" &lt;=&gt; \"a\"; \/\/ 1\r\n?&gt;<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"migration70.new-features.define-array\" class=\"sect2\">\n<h3 class=\"title\">\u901a\u8fc7 <span class=\"function\"><a class=\"function\" href=\"http:\/\/php.net\/manual\/zh\/function.define.php\">define()<\/a><\/span> \u5b9a\u4e49\u5e38\u91cf\u6570\u7ec4 <a class=\"genanchor\" href=\"http:\/\/php.net\/manual\/zh\/migration70.new-features.php#migration70.new-features.define-array\"> \u00b6<\/a><\/h3>\n<p class=\"para\"><span class=\"type\"><a class=\"type Array\" href=\"http:\/\/php.net\/manual\/zh\/language.types.array.php\">Array<\/a><\/span> \u7c7b\u578b\u7684\u5e38\u91cf\u73b0\u5728\u53ef\u4ee5\u901a\u8fc7 define<span class=\"function\"><a class=\"function\" href=\"http:\/\/php.net\/manual\/zh\/function.define.php\">define()<\/a><\/span> \u6765\u5b9a\u4e49\u3002\u5728 PHP5.6 \u4e2d\u4ec5\u80fd\u901a\u8fc7 <a class=\"link\" href=\"http:\/\/php.net\/manual\/zh\/language.constants.syntax.php\"><em>const<\/em><\/a> \u5b9a\u4e49\u3002<\/p>\n<div class=\"informalexample\">\n<div class=\"example-contents\">\n<div class=\"phpcode\">\n<pre class=\"lang:php decode:true \">&lt;?php\r\ndefine('ANIMALS', [\r\n    'dog',\r\n    'cat',\r\n    'bird'\r\n]);\r\n\r\necho ANIMALS[1]; \/\/ outputs \"cat\"\r\n?&gt;<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"migration70.new-features.anonymous-classes\" class=\"sect2\">\n<h3 class=\"title\">\u533f\u540d\u7c7b<a class=\"genanchor\" href=\"http:\/\/php.net\/manual\/zh\/migration70.new-features.php#migration70.new-features.anonymous-classes\"> \u00b6<\/a><\/h3>\n<p class=\"para\">\u73b0\u5728\u652f\u6301\u901a\u8fc7<em>new class<\/em> \u6765\u5b9e\u4f8b\u5316\u4e00\u4e2a\u533f\u540d\u7c7b\uff0c\u8fd9\u53ef\u4ee5\u7528\u6765\u66ff\u4ee3\u4e00\u4e9b\u201c\u7528\u540e\u5373\u711a\u201d\u7684\u5b8c\u6574\u7c7b\u5b9a\u4e49\u3002<\/p>\n<div class=\"informalexample\">\n<div class=\"example-contents\">\n<div class=\"phpcode\">\n<pre class=\"lang:php decode:true \">&lt;?php\r\ninterface Logger {\r\n    public function log(string $msg);\r\n}\r\n\r\nclass Application {\r\n    private $logger;\r\n\r\n    public function getLogger(): Logger {\r\n         return $this-&gt;logger;\r\n    }\r\n\r\n    public function setLogger(Logger $logger) {\r\n         $this-&gt;logger = $logger;\r\n    }\r\n}\r\n\r\n$app = new Application;\r\n$app-&gt;setLogger(new class implements Logger {\r\n    public function log(string $msg) {\r\n        echo $msg;\r\n    }\r\n});\r\n\r\nvar_dump($app-&gt;getLogger());\r\n?&gt;<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"para\">\u4ee5\u4e0a\u4f8b\u7a0b\u4f1a\u8f93\u51fa\uff1a<\/p>\n<div class=\"example-contents screen\">\n<div class=\"cdata\">\n<pre>object(class@anonymous)#2 (0) {\r\n}\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<p class=\"para\">\u8be6\u7ec6\u6587\u6863\u53ef\u4ee5\u53c2\u8003 <a class=\"link\" href=\"http:\/\/php.net\/manual\/zh\/language.oop5.anonymous.php\">\u533f\u540d\u7c7b<\/a>.<\/p>\n<\/div>\n<div id=\"migration70.new-features.unicode-codepoint-escape-syntax\" class=\"sect2\">\n<h3 class=\"title\">Unicode codepoint \u8f6c\u8bd1\u8bed\u6cd5<a class=\"genanchor\" href=\"http:\/\/php.net\/manual\/zh\/migration70.new-features.php#migration70.new-features.unicode-codepoint-escape-syntax\"> \u00b6<\/a><\/h3>\n<p class=\"para\">\u8fd9\u63a5\u53d7\u4e00\u4e2a\u4ee516\u8fdb\u5236\u5f62\u5f0f\u7684 Unicode codepoint\uff0c\u5e76\u6253\u5370\u51fa\u4e00\u4e2a\u53cc\u5f15\u53f7\u6216heredoc\u5305\u56f4\u7684 UTF-8 \u7f16\u7801\u683c\u5f0f\u7684\u5b57\u7b26\u4e32\u3002 \u53ef\u4ee5\u63a5\u53d7\u4efb\u4f55\u6709\u6548\u7684 codepoint\uff0c\u5e76\u4e14\u5f00\u5934\u7684 0 \u662f\u53ef\u4ee5\u7701\u7565\u7684\u3002<\/p>\n<div class=\"informalexample\">\n<div class=\"example-contents\">\n<div class=\"phpcode\">\n<pre class=\"lang:php decode:true \">echo \"\\u{aa}\";\r\necho \"\\u{0000aa}\";\r\necho \"\\u{9999}\";<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"para\">\u4ee5\u4e0a\u4f8b\u7a0b\u4f1a\u8f93\u51fa\uff1a<\/p>\n<div class=\"example-contents screen\">\n<div class=\"cdata\">\n<pre>\u00aa\r\n\u00aa (same as before but with optional leading 0's)\r\n\u9999\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"migration70.new-features.closure-call-method\" class=\"sect2\">\n<h3 class=\"title\"><span class=\"methodname\"><strong>Closure::call()<\/strong><\/span><a class=\"genanchor\" href=\"http:\/\/php.net\/manual\/zh\/migration70.new-features.php#migration70.new-features.closure-call-method\"> \u00b6<\/a><\/h3>\n<p class=\"para\"><span class=\"methodname\"><strong>Closure::call()<\/strong><\/span> \u73b0\u5728\u6709\u7740\u66f4\u597d\u7684\u6027\u80fd\uff0c\u7b80\u77ed\u5e72\u7ec3\u7684\u6682\u65f6\u7ed1\u5b9a\u4e00\u4e2a\u65b9\u6cd5\u5230\u5bf9\u8c61\u4e0a\u95ed\u5305\u5e76\u8c03\u7528\u5b83\u3002<\/p>\n<div class=\"informalexample\">\n<div class=\"example-contents\">\n<div class=\"phpcode\">\n<pre class=\"lang:php decode:true \">&lt;?php\r\nclass A {private $x = 1;}\r\n\r\n\/\/ Pre PHP 7 code\r\n$getXCB = function() {return $this-&gt;x;};\r\n$getX = $getXCB-&gt;bindTo(new A, 'A'); \/\/ intermediate closure\r\necho $getX();\r\n\r\n\/\/ PHP 7+ code\r\n$getX = function() {return $this-&gt;x;};\r\necho $getX-&gt;call(new A);<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"para\">\u4ee5\u4e0a\u4f8b\u7a0b\u4f1a\u8f93\u51fa\uff1a<\/p>\n<div class=\"example-contents screen\">\n<div class=\"cdata\">\n<pre>1\r\n1\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"migration70.new-features.filtered-unserialize\" class=\"sect2\">\n<h3 class=\"title\">\u4e3a<span class=\"function\"><a class=\"function\" href=\"http:\/\/php.net\/manual\/zh\/function.unserialize.php\">unserialize()<\/a><\/span>\u63d0\u4f9b\u8fc7\u6ee4<a class=\"genanchor\" href=\"http:\/\/php.net\/manual\/zh\/migration70.new-features.php#migration70.new-features.filtered-unserialize\"> \u00b6<\/a><\/h3>\n<p class=\"para\">\u8fd9\u4e2a\u7279\u6027\u65e8\u5728\u63d0\u4f9b\u66f4\u5b89\u5168\u7684\u65b9\u5f0f\u89e3\u5305\u4e0d\u53ef\u9760\u7684\u6570\u636e\u3002\u5b83\u901a\u8fc7\u767d\u540d\u5355\u7684\u65b9\u5f0f\u6765\u9632\u6b62\u6f5c\u5728\u7684\u4ee3\u7801\u6ce8\u5165\u3002<\/p>\n<div class=\"informalexample\">\n<div class=\"example-contents\">\n<div class=\"phpcode\">\n<pre class=\"lang:php decode:true \">&lt;?php\r\n\r\n\/\/ converts all objects into __PHP_Incomplete_Class object\r\n$data = unserialize($foo, [\"allowed_classes\" =&gt; false]);\r\n\r\n\/\/ converts all objects into __PHP_Incomplete_Class object except those of MyClass and MyClass2\r\n$data = unserialize($foo, [\"allowed_classes\" =&gt; [\"MyClass\", \"MyClass2\"]);\r\n\r\n\/\/ default behaviour (same as omitting the second argument) that accepts all classes\r\n$data = unserialize($foo, [\"allowed_classes\" =&gt; true]);<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"migration70.new-features.intlchar\" class=\"sect2\">\n<h3 class=\"title\"><a class=\"classname\" href=\"http:\/\/php.net\/manual\/zh\/class.intlchar.php\">IntlChar<\/a><a class=\"genanchor\" href=\"http:\/\/php.net\/manual\/zh\/migration70.new-features.php#migration70.new-features.intlchar\"> \u00b6<\/a><\/h3>\n<p class=\"para\">\u65b0\u589e\u52a0\u7684 <a class=\"classname\" href=\"http:\/\/php.net\/manual\/zh\/class.intlchar.php\">IntlChar<\/a> \u7c7b\u65e8\u5728\u66b4\u9732\u51fa\u66f4\u591a\u7684 ICU \u529f\u80fd\u3002\u8fd9\u4e2a\u7c7b\u81ea\u8eab\u5b9a\u4e49\u4e86\u8bb8\u591a\u9759\u6001\u65b9\u6cd5\u7528\u4e8e\u64cd\u4f5c\u591a\u5b57\u7b26\u96c6\u7684 unicode \u5b57\u7b26\u3002<\/p>\n<div class=\"informalexample\">\n<div class=\"example-contents\">\n<div class=\"phpcode\">\n<pre class=\"lang:php decode:true \">&lt;?php\r\n\r\nprintf('%x', IntlChar::CODEPOINT_MAX);\r\necho IntlChar::charName('@');\r\nvar_dump(IntlChar::ispunct('!'));<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"para\">\u4ee5\u4e0a\u4f8b\u7a0b\u4f1a\u8f93\u51fa\uff1a<\/p>\n<div class=\"example-contents screen\">\n<div class=\"cdata\">\n<pre>10ffff\r\nCOMMERCIAL AT\r\nbool(true)\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<p class=\"para\">\u82e5\u8981\u4f7f\u7528\u6b64\u7c7b\uff0c\u8bf7\u5148\u5b89\u88c5<a class=\"link\" href=\"http:\/\/php.net\/manual\/zh\/book.intl.php\">Intl<\/a>\u6269\u5c55<\/p>\n<\/div>\n<div id=\"migration70.new-features.expectations\" class=\"sect2\">\n<h3 class=\"title\">\u9884\u671f<a class=\"genanchor\" href=\"http:\/\/php.net\/manual\/zh\/migration70.new-features.php#migration70.new-features.expectations\"> \u00b6<\/a><\/h3>\n<p class=\"para\"><a class=\"link\" href=\"http:\/\/php.net\/manual\/zh\/function.assert.php#function.assert.expectations\">\u9884\u671f<\/a>\u662f\u5411\u540e\u517c\u7528\u5e76\u589e\u5f3a\u4e4b\u524d\u7684 <span class=\"function\"><a class=\"function\" href=\"http:\/\/php.net\/manual\/zh\/function.assert.php\">assert()<\/a><\/span> \u7684\u65b9\u6cd5\u3002 \u5b83\u4f7f\u5f97\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u542f\u7528\u65ad\u8a00\u4e3a\u96f6\u6210\u672c\uff0c\u5e76\u4e14\u63d0\u4f9b\u5f53\u65ad\u8a00\u5931\u8d25\u65f6\u629b\u51fa\u7279\u5b9a\u5f02\u5e38\u7684\u80fd\u529b\u3002<\/p>\n<p class=\"para\">\u8001\u7248\u672c\u7684API\u51fa\u4e8e\u517c\u5bb9\u76ee\u7684\u5c06\u7ee7\u7eed\u88ab\u7ef4\u62a4\uff0c<span class=\"function\"><a class=\"function\" href=\"http:\/\/php.net\/manual\/zh\/function.assert.php\">assert()<\/a><\/span>\u73b0\u5728\u662f\u4e00\u4e2a\u8bed\u8a00\u7ed3\u6784\uff0c\u5b83\u5141\u8bb8\u7b2c\u4e00\u4e2a\u53c2\u6570\u662f\u4e00\u4e2a\u8868\u8fbe\u5f0f\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u4e00\u4e2a\u5f85\u8ba1\u7b97\u7684 <span class=\"type\"><a class=\"type string\" href=\"http:\/\/php.net\/manual\/zh\/language.types.string.php\">string<\/a><\/span>\u6216\u4e00\u4e2a\u5f85\u6d4b\u8bd5\u7684<span class=\"type\"><a class=\"type boolean\" href=\"http:\/\/php.net\/manual\/zh\/language.types.boolean.php\">boolean<\/a><\/span>\u3002<\/p>\n<div class=\"informalexample\">\n<div class=\"example-contents\">\n<div class=\"phpcode\">\n<pre class=\"lang:php decode:true \">&lt;?php\r\nini_set('assert.exception', 1);\r\n\r\nclass CustomError extends AssertionError {}\r\n\r\nassert(false, new CustomError('Some error message'));\r\n?&gt;<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"para\">\u4ee5\u4e0a\u4f8b\u7a0b\u4f1a\u8f93\u51fa\uff1a<\/p>\n<div class=\"example-contents screen\">\n<div class=\"cdata\">\n<pre>Fatal error: Uncaught CustomError: Some error message\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<p class=\"para\">\u5173\u4e8e\u8fd9\u4e2a\u7279\u6027\u7684\u5b8c\u6574\u8bf4\u660e\uff0c\u5305\u62ec\u5982\u4f55\u5728\u5f00\u53d1\u548c\u751f\u4ea7\u73af\u5883\u4e2d\u914d\u7f6e\u5b83\uff0c\u53ef\u4ee5\u5728<span class=\"function\"><a class=\"function\" href=\"http:\/\/php.net\/manual\/zh\/function.assert.php\">assert()<\/a><\/span>\u7684 <a class=\"link\" href=\"http:\/\/php.net\/manual\/zh\/function.assert.php#function.assert.expectations\">expectations section<\/a>\u7ae0\u8282\u627e\u5230\u3002<\/p>\n<\/div>\n<div id=\"migration70.new-features.group-use-declarations\" class=\"sect2\">\n<h3 class=\"title\">Group <em>use<\/em> declarations<a class=\"genanchor\" href=\"http:\/\/php.net\/manual\/zh\/migration70.new-features.php#migration70.new-features.group-use-declarations\"> \u00b6<\/a><\/h3>\n<p class=\"para\">\u4ece\u540c\u4e00 <a class=\"link\" href=\"http:\/\/php.net\/manual\/zh\/language.namespaces.definition.php\"><em>namespace<\/em><\/a> \u5bfc\u5165\u7684\u7c7b\u3001\u51fd\u6570\u548c\u5e38\u91cf\u73b0\u5728\u53ef\u4ee5\u901a\u8fc7\u5355\u4e2a <a class=\"link\" href=\"http:\/\/php.net\/manual\/zh\/language.namespaces.importing.php\"><em>use<\/em><\/a> \u8bed\u53e5 \u4e00\u6b21\u6027\u5bfc\u5165\u4e86\u3002<\/p>\n<div class=\"informalexample\">\n<div class=\"example-contents\">\n<div class=\"phpcode\">\n<pre class=\"lang:php decode:true \">&lt;?php\r\n\r\n\/\/ Pre PHP 7 code\r\nuse some\\namespace\\ClassA;\r\nuse some\\namespace\\ClassB;\r\nuse some\\namespace\\ClassC as C;\r\n\r\nuse function some\\namespace\\fn_a;\r\nuse function some\\namespace\\fn_b;\r\nuse function some\\namespace\\fn_c;\r\n\r\nuse const some\\namespace\\ConstA;\r\nuse const some\\namespace\\ConstB;\r\nuse const some\\namespace\\ConstC;\r\n\r\n\/\/ PHP 7+ code\r\nuse some\\namespace\\{ClassA, ClassB, ClassC as C};\r\nuse function some\\namespace\\{fn_a, fn_b, fn_c};\r\nuse const some\\namespace\\{ConstA, ConstB, ConstC};\r\n?&gt;<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"migration70.new-features.generator-return-expressions\" class=\"sect2\">\n<h3 class=\"title\">Generator Return Expressions<a class=\"genanchor\" href=\"http:\/\/php.net\/manual\/zh\/migration70.new-features.php#migration70.new-features.generator-return-expressions\"> \u00b6<\/a><\/h3>\n<p class=\"para\">This feature builds upon the generator functionality introduced into PHP 5.5. It enables for a <em>return<\/em> statement to be used within a generator to enable for a final expression to be returned (return by reference is not allowed). This value can be fetched using the new <em>Generator::getReturn()<\/em> method, which may only be used once the generator has finishing yielding values.<\/p>\n<div class=\"informalexample\">\n<div class=\"example-contents\">\n<div class=\"phpcode\">\n<pre class=\"lang:php decode:true\">&lt;?php\r\n\r\n$gen = (function() {\r\n    yield 1;\r\n    yield 2;\r\n\r\n    return 3;\r\n})();\r\n\r\nforeach ($gen as $val) {\r\n    echo $val, PHP_EOL;\r\n}\r\n<code>\r\necho\u00a0$gen-&gt;getReturn(),\u00a0PHP_EOL; <\/code><\/pre>\n<p>\u4ee5\u4e0a\u4f8b\u7a0b\u4f1a\u8f93\u51fa\uff1a<\/p><\/div>\n<\/div>\n<div class=\"example-contents screen\">\n<div class=\"cdata\">\n<pre>1\r\n2\r\n3\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<p class=\"para\">Being able to explicitly return a final value from a generator is a handy ability to have. This is because it enables for a final value to be returned by a generator (from perhaps some form of coroutine computation) that can be specifically handled by the client code executing the generator. This is far simpler than forcing the client code to firstly check whether the final value has been yielded, and then if so, to handle that value specifically.<\/p>\n<\/div>\n<div id=\"migration70.new-features.generator-delegation\" class=\"sect2\">\n<h3 class=\"title\">Generator delegation<a class=\"genanchor\" href=\"http:\/\/php.net\/manual\/zh\/migration70.new-features.php#migration70.new-features.generator-delegation\"> \u00b6<\/a><\/h3>\n<p class=\"para\">Generators can now delegate to another generator, <strong class=\"classname\">Traversable<\/strong> object or <span class=\"type\"><a class=\"type array\" href=\"http:\/\/php.net\/manual\/zh\/language.types.array.php\">array<\/a><\/span> automatically, without needing to write boilerplate in the outermost generator by using the <a class=\"link\" href=\"http:\/\/php.net\/manual\/zh\/language.generators.syntax.php#control-structures.yield.from\"><em>yield from<\/em><\/a> construct.<\/p>\n<div class=\"informalexample\">\n<div class=\"example-contents\">\n<div class=\"phpcode\">\n<pre class=\"lang:php decode:true \">&lt;?php\r\n\r\nfunction gen()\r\n{\r\n    yield 1;\r\n    yield 2;\r\n\r\n    yield from gen2();\r\n}\r\n\r\nfunction gen2()\r\n{\r\n    yield 3;\r\n    yield 4;\r\n}\r\n\r\nforeach (gen() as $val)\r\n{\r\n    echo $val, PHP_EOL;\r\n}\r\n\r\n?&gt;<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"para\">\u4ee5\u4e0a\u4f8b\u7a0b\u4f1a\u8f93\u51fa\uff1a<\/p>\n<div class=\"example-contents screen\">\n<div class=\"cdata\">\n<pre>1\r\n2\r\n3\r\n4\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"migration70.new-features.intdiv\" class=\"sect2\">\n<h3 class=\"title\">Integer division with <span class=\"function\"><a class=\"function\" href=\"http:\/\/php.net\/manual\/zh\/function.intdiv.php\">intdiv()<\/a><\/span><a class=\"genanchor\" href=\"http:\/\/php.net\/manual\/zh\/migration70.new-features.php#migration70.new-features.intdiv\"> \u00b6<\/a><\/h3>\n<p class=\"para\">The new <span class=\"function\"><a class=\"function\" href=\"http:\/\/php.net\/manual\/zh\/function.intdiv.php\">intdiv()<\/a><\/span> function performs an integer division of its operands and returns it.<\/p>\n<div class=\"informalexample\">\n<div class=\"example-contents\">\n<div class=\"phpcode\">\n<pre class=\"lang:php decode:true \">&lt;?php\r\n\r\nvar_dump(intdiv(10, 3));\r\n?&gt;<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"para\">\u4ee5\u4e0a\u4f8b\u7a0b\u4f1a\u8f93\u51fa\uff1a<\/p>\n<div class=\"example-contents screen\">\n<div class=\"cdata\">\n<pre>int(3)\r\n<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"migration70.new-features.session-options\" class=\"sect2\">\n<h3 class=\"title\">Session options<a class=\"genanchor\" href=\"http:\/\/php.net\/manual\/zh\/migration70.new-features.php#migration70.new-features.session-options\"> \u00b6<\/a><\/h3>\n<p class=\"para\"><span class=\"function\"><a class=\"function\" href=\"http:\/\/php.net\/manual\/zh\/function.session-start.php\">session_start()<\/a><\/span> now accepts an <span class=\"type\"><a class=\"type array\" href=\"http:\/\/php.net\/manual\/zh\/language.types.array.php\">array<\/a><\/span> of options that override the <a class=\"link\" href=\"http:\/\/php.net\/manual\/zh\/session.configuration.php\">session configuration directives<\/a> normally set in php.ini.<\/p>\n<p class=\"para\">These options have also been expanded to support <a class=\"link\" href=\"http:\/\/php.net\/manual\/zh\/session.configuration.php#ini.session.lazy-write\">session.lazy_write<\/a>, which is on by default and causes PHP to only overwrite any session file if the session data has changed, and <em>read_and_close<\/em>, which is an option that can only be passed to <span class=\"function\"><a class=\"function\" href=\"http:\/\/php.net\/manual\/zh\/function.session-start.php\">session_start()<\/a><\/span> to indicate that the session data should be read and then the session should immediately be closed unchanged.<\/p>\n<p class=\"para\">For example, to set <a class=\"link\" href=\"http:\/\/php.net\/manual\/zh\/session.configuration.php#ini.session.cache-limiter\">session.cache_limiter<\/a> to <em>private<\/em> and immediately close the session after reading it:<\/p>\n<div class=\"informalexample\">\n<div class=\"example-contents\">\n<div class=\"phpcode\">\n<pre class=\"lang:php decode:true \">&lt;?php\r\nsession_start([\r\n    'cache_limiter' =&gt; 'private',\r\n    'read_and_close' =&gt; true,\r\n]);\r\n?&gt;<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"migration70.new-features.preg-repace-callback-array-function\" class=\"sect2\">\n<h3 class=\"title\"><span class=\"function\"><a class=\"function\" href=\"http:\/\/php.net\/manual\/zh\/function.preg-replace-callback-array.php\">preg_replace_callback_array()<\/a><\/span><a class=\"genanchor\" href=\"http:\/\/php.net\/manual\/zh\/migration70.new-features.php#migration70.new-features.preg-repace-callback-array-function\"> \u00b6<\/a><\/h3>\n<p class=\"para\">The new <span class=\"function\"><a class=\"function\" href=\"http:\/\/php.net\/manual\/zh\/function.preg-replace-callback-array.php\">preg_replace_callback_array()<\/a><\/span> function enables code to be written more cleanly when using the <span class=\"function\"><a class=\"function\" href=\"http:\/\/php.net\/manual\/zh\/function.preg-replace-callback.php\">preg_replace_callback()<\/a><\/span> function. Prior to PHP 7, callbacks that needed to be executed per regular expression required the callback function to be polluted with lots of branching.<\/p>\n<p class=\"para\">Now, callbacks can be registered to each regular expression using an associative array, where the key is a regular expression and the value is a callback.<\/p>\n<\/div>\n<div id=\"migration70.new-features.csprng-functions\" class=\"sect2\">\n<h3 class=\"title\"><a class=\"link\" href=\"http:\/\/php.net\/manual\/zh\/book.csprng.php\">CSPRNG<\/a> Functions<a class=\"genanchor\" href=\"http:\/\/php.net\/manual\/zh\/migration70.new-features.php#migration70.new-features.csprng-functions\"> \u00b6<\/a><\/h3>\n<p class=\"para\">Two new functions have been added to generate cryptographically secure integers and strings in a cross platform way: <span class=\"function\"><a class=\"function\" href=\"http:\/\/php.net\/manual\/zh\/function.random-bytes.php\">random_bytes()<\/a><\/span> and <span class=\"function\"><a class=\"function\" href=\"http:\/\/php.net\/manual\/zh\/function.random-int.php\">random_int()<\/a><\/span>.<\/p>\n<\/div>\n<div id=\"migration70.new-features.list-arrayaccess\" class=\"sect2\">\n<h3 class=\"title\"><span class=\"function\"><a class=\"function\" href=\"http:\/\/php.net\/manual\/zh\/function.list.php\">list()<\/a><\/span> can always unpack objects implementing <strong class=\"classname\">ArrayAccess<\/strong><a class=\"genanchor\" href=\"http:\/\/php.net\/manual\/zh\/migration70.new-features.php#migration70.new-features.list-arrayaccess\"> \u00b6<\/a><\/h3>\n<p class=\"para\">Previously, <span class=\"function\"><a class=\"function\" href=\"http:\/\/php.net\/manual\/zh\/function.list.php\">list()<\/a><\/span> was not guaranteed to operate correctly with objects implementing <strong class=\"classname\">ArrayAccess<\/strong>. This has been fixed.<\/p>\n<\/div>\n<p class=\"para\">\n<p class=\"para\">\u672c\u6587\u8f6c\u81ea\uff1ahttp:\/\/php.net\/manual\/zh\/migration70.new-features.php<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6807\u91cf\u7c7b\u578b\u58f0\u660e \u00b6 \u6807\u91cf\u7c7b\u578b\u58f0\u660e \u6709\u4e24\u79cd\u6a21\u5f0f: \u5f3a\u5236 (\u9ed8\u8ba4) \u548c \u4e25\u683c\u6a21\u5f0f\u3002 \u73b0 &#8230; <a class=\"more-link\" href=\"https:\/\/actom.me\/blog\/%e8%bd%acphp-7%e6%96%b0%e7%89%b9%e6%80%a7.html\">Read More &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15,3],"tags":[],"_links":{"self":[{"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/posts\/1206"}],"collection":[{"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/comments?post=1206"}],"version-history":[{"count":1,"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/posts\/1206\/revisions"}],"predecessor-version":[{"id":1207,"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/posts\/1206\/revisions\/1207"}],"wp:attachment":[{"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/media?parent=1206"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/categories?post=1206"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/tags?post=1206"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}