Heim > Artikel > Backend-Entwicklung > Verstehst du wirklich aktuelles PHP?
Vor einiger Zeit wurde das Projekt des Unternehmens von PHP5.3 auf PHP7 aktualisiert. Jetzt wird das Projekt verwendet Einige der neuen PHP7-Syntax und -Funktionen. Wenn ich auf die PHP-Versionen 5.4, 5.5 und 5.6 zurückblicke, habe ich das Gefühl, dass es mir etwas an Wissen mangelt, also habe ich beschlossen, „Modernes PHP“ zu lesen, um einige Konzepte zu ergänzen Buch
1. Merkmale
1. Namespace wird häufiger verwendet, nicht im Detail geschrieben, wobei mehrere bemerkenswerte Praktiken und Details aufgezeichnet werden
Verwenden Sie mehrere Namespaces in einer Datei Sie können dies tun, aber dies verstößt gegen
„Eine Datei definiert eine Klasse“ Gute Vorgehensweise für
<?php use Symfony\Component\HttpFoundation\Request, Symfony\Component\HttpFoundation\Response, Symfony\Component\HttpFoundation\Cookie;Globaler Namespace
<?php use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Cookie;
Wenn Sie die native Klasse Exception von PHP verwenden möchten, müssen Sie vor dem Klassennamen ein Symbol hinzufügen
Falls vorhanden Ist kein Symbol vor Exception, wird die Exception-Klasse im MyApp-Namespace gefunden
<?php namespace Foo { //code } namespace Bar { //code }2. Verwenden Sie die Schnittstelle
Flexibel und kann an andere delegiert werden, um die Details zu implementieren, und nicht um die Implementierung. Dies kann nicht häufiger erwähnt werden
Ich habe Traits nicht verstanden, bevor ich das Laravel-Framework gelernt habe Dies ist ein neues Konzept, das in PHP5.4.0 eingeführt wurde, aber es ist wie eine Klasse und eine Schnittstelle. Es ist keines von beiden >
<?php namespace My\App; class Foo { public function doSomething() { $exception = new \Exception(); } }Warum Traits verwenden
4. Generator
Der PHP-Generator ist eine neue Funktion, die in PHP5.5.0 eingeführt wurde und die viele PHP-Entwickler nicht verstehen. Der Generator ist ein einfacher Iterator, der Generator ist jedoch nicht erforderlich, um die Iterator-Schnittstelle
Abfragen
weiß der Generator nie, was der nächste Wert ist, über den iteriert werden soll, und es gibt keine Möglichkeit, im Generator zurückzu- oder vorzuspulen. Schauen Sie sich insbesondere die folgenden zwei Beispiele an:Einfacher Generator
<?php trait MyTrait{ //实现 }Spezifisches Szenario: Verwenden Sie den Generator, um CSV-Dateien zu verarbeiten
<?php class MyClass { use MyTrait; // 类的实现 }
einzufügen und dann die Verarbeitung durchzuführen und bald. Das Problem bei dieser Art der Verarbeitung ist: Wenn die Datei sehr groß ist, nimmt das gleichzeitige Lesen viele Speicherressourcen in Anspruch. Der Generator ist für dieses Szenario am besten geeignet, da er nur sehr wenig Systemspeicher beansprucht. 5. Schließung
Theoretisch sind Schließung und anonyme Funktion unterschiedliche Konzepte. PHP behandelt es jedoch als dasselbe Konzept.
<?php function makeRange($length) { for ($i = 0; $i < $length; $i++) { yield $i; } } foreach (makeRange(1000000) as $i) { echo $i, PHP_EOL; }Einfacher Abschluss
Hinweis: Der Grund, warum wir $closure
<?php function getRows($file) { $handle = fopen($file, 'rb'); if ($handle === false) { throw new Exception(); } while (feof($handle) === false) { yield fgetcsv($handle); } } foreach (getRows('data.csv') as $row) { print_r($row); }Variable
nennen können, liegt darin, dass der Wert dieser Variablen ein Abschluss ist und der close PackageObject implementiert die invoke()magische Methode. Solange nach dem Variablennamen () steht, findet PHP die invoke()-Methode und ruft sie auf.
附加状态
使用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服务器 }
Das obige ist der detaillierte Inhalt vonVerstehst du wirklich aktuelles PHP?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!