前段時間,公司的專案從PHP5.3升級到PHP7,現在專案開始使用PHP7的一些新語法與特性。
在看這本書
一、特性
<?php use Symfony\Component\HttpFoundation\Request, Symfony\Component\HttpFoundation\Response, Symfony\Component\HttpFoundation\Cookie;
你可以這麼做,但這違背了「一個檔案定義一個類別」的良好實踐。 ##如果Exception前面不加\ 符號,會在My\App命名空間下尋找Exception類別。靈活,能委託其他人實現細節 使用的人只需要關心有什麼接口,而不需要關心實現。 . 性狀
框架
之前都沒弄清楚性狀(trait)。不是。舉個具體的例子,例如有兩個類,Car 和Phone,他們都需要GPS功能。 它。都實作這個介面。
#第三反應創造實現GPS功能的性狀(trait),然後在Car和Phone類別中混入這個性狀。能實現功能,不影響繼承結構,不重複實現,完美。
建立trait
<?php use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Cookie;
<?php namespace Foo { //code } namespace Bar { //code }
,生成器永遠不知道下一個要迭代的值是什麼,在生成器中無法後退或快轉。具體看如下兩個範例:
簡單的生成器具體場景:使用生成器處理CSV檔案<?php trait MyTrait{ //实现 }
處理這種場景,習慣的處理方法是先讀取檔案的所有內容放到
陣列中,然後再做處理等等。這種的處理存在的問題是:當檔案特別大,一次讀取就佔用很多記憶體資源。而生成器最適合這種場景,因為這樣佔用的系統記憶體量極少
匿名函數是不同的概念。不過,PHP將其視為相同的概念。
簡單閉包
<?php class MyClass { use MyTrait; // 类的实现 }
魔術方法。只要變數名稱後面有(),PHP就會找並呼叫invoke()方法。
附加状态
使用use关键字可以把多个参数传入闭包,此时要像PHP函数或方法的参数一样,使用逗号分隔多个参数。
<?php function enclosePerson($name) { return function ($doCommand) use ($name) { return sprintf('%s, %s', $name, $doCommand); }; } // 把字符串“Clay”封装在闭包中 $clay = enclosePerson('Clay'); // 传入参数,调用闭包 echo $clay('get me sweet tea!'); // 输出 --> "Clay, get me sweet tea!"
使用bindTo()方法附加闭包的状态
PHP框架经常使用bindTo()方法把路由URL映射到匿名回调函数上,框架会把匿名函数绑定到应用对象上,这么做可以在这个匿名函数中使用$this关键字引用重要的应用对象。例子如下:
<?php class App { protected $routes = array(); protected $responseStatus = '200 OK'; protected $responseContentType = 'text/html'; protected $responseBody = 'Hello world'; public function addRoute($routePath, $routeCallback) { $this->routes[$routePath] = $routeCallback->bindTo($this, CLASS);//重点 } public function dispatch($currentPath) { foreach ($this->routes as $routePath => $callback) { if ($routePath === $currentPath) { $callback(); } } header('HTTP/1.1' . $this->responseStatus); header('Content-type:' . $this->responseContentType); header('Content-length' . mb_strlen($this->responseBody)); echo $this->responseBody; } }
第11行是重点所在,把路由回调绑定到了当前的App实例上。这么做能在回调函数中处理App实例的状态:
<?php $app = new App(); $app->addRoute('/users/josh', function () { $this->responseContentType = 'application/json;charset=utf8'; $this->responseBody = '{"name": "Josh"}'; }); $app->dispatch('/users/josh');
字节码缓存不是PHP的新特性,很多独立的扩展可以实现缓存。从PHP5.5.0开始,PHP内置了字节码缓存功能,名为Zend OPcache。
字节码缓存是什么
PHP是解释性语言,PHP解释器执行PHP脚本时会解析PHP脚本代码,把PHP代码编译成一系列Zend操作码,然后执行字节码。每次请求PHP文件都是这样,会消耗很多资源。字节码缓存能存储预先编译好的PHP字节码。这意味着,请求PHP脚本时,PHP解释器不用每次都读取、解析和编译PHP代码。这样能极大地提升应用的性能。
从PHP5.4.0起,PHP内置了Web服务器,这对众多使用Apache或nginx的php开发者来说,可能是个隐藏功能。不过,这个内置的服务器功能并不完善,不应该在生产环境中使用,但对本地开发来说是个便利的工具,可以用于快速预览一些框架和应用。
启动服务器
php -S localhost:4000
php -S localhost:8000 -c app/config/php.ini
路由器脚本
与Apache和nginx不同,它不支持.htaccess文件。因此,这个服务器很难使用多数流行的PHP框架中常见的前端控制器。PHP内置的服务器使用路由器脚本弥补了这个遗漏的功能。处理每个HTTP请求前,会先经过这个路由器脚本,如果结果为false,返回当前HTTP请求中引用的静态资源URI。
php -S localhost:8000 route.php
是否为内置的服务器
<?php if (php_sapi_name() === 'cli-server') { // php 内置的web服务器 }
以上是你真的了解現在的PHP嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!