Heim  >  Artikel  >  Backend-Entwicklung  >  Verstehst du wirklich aktuelles PHP?

Verstehst du wirklich aktuelles PHP?

PHPz
PHPzOriginal
2017-04-04 15:59:171143Durchsuche

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. MerkmaleVerstehst du wirklich aktuelles PHP?
1. Namespace wird häufiger verwendet, nicht im Detail geschrieben, wobei mehrere bemerkenswerte Praktiken und Details aufgezeichnet werden

Mehrfachimporte

Tun Sie dies nicht, es ist leicht, die Leute zu verwirren

Schreiben Sie eine Verwendungserklärung:


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 >

Traits sind Teilimplementierungen von Klassen, die in eine oder mehrere vorhandene PHP-Klassen eingemischt werden können
<?php
namespace My\App;

class Foo
{
  public function doSomething()
  {
    $exception = new \Exception();
  }
}

Warum Traits verwenden

Um dort zum Beispiel ein konkretes Beispiel zu nennen Es gibt zwei Klassen, Car und Phone, die beide GPS-Funktionen benötigen. Um dieses Problem zu lösen, besteht die erste Reaktion darin, eine übergeordnete Klasse zu erstellen und dann Car und Phone zu erben. Dieser Vorfahre gehört nicht zur jeweiligen Vererbungshierarchie. Die zweite Reaktion besteht darin, eine GPS-Schnittstelle zu erstellen, die GPS-Funktionsschnittstelle zu definieren und diese Schnittstelle dann von den Klassen Car und Both Phone implementieren zu lassen Beibehaltung der natürlichen Vererbungshierarchie erfordert jedoch doppelte GPS-Funktionen, was nicht mit dem DRY-Prinzip übereinstimmt.

Die dritte Reaktion besteht darin, ein Merkmal zu erstellen, das das GPS implementiert Funktion und mischen Sie diese Eigenschaft dann in die Klassen „Auto“ und „Telefon“. Es kann Funktionen realisieren, hat keinen Einfluss auf die Vererbungsstruktur, wiederholt keine Implementierung und ist perfekt.

Eigenschaften erstellen und verwenden

Eigenschaften erstellen

Eigenschaften 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

zu implementieren. Der Generator berechnet und erzeugt die Werte, über die nach Bedarf iteriert werden soll. Ohne

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;
  // 类的实现
}

Um mit diesem Szenario umzugehen, besteht die übliche Methode darin, zunächst den gesamten Inhalt der Datei zu lesen und ihn in das

Array

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, &#39;rb&#39;);
  if ($handle === false) {
    throw new Exception();
  }
  while (feof($handle) === false) {
    yield fgetcsv($handle);
  }
}

foreach (getRows(&#39;data.csv&#39;) 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(&#39;%s, %s&#39;, $name, $doCommand);
  };
}

// 把字符串“Clay”封装在闭包中
$clay = enclosePerson(&#39;Clay&#39;);

// 传入参数,调用闭包
echo $clay(&#39;get me sweet tea!&#39;);
// 输出 --> "Clay, get me sweet tea!"

使用bindTo()方法附加闭包的状态
PHP框架经常使用bindTo()方法把路由URL映射到匿名回调函数上,框架会把匿名函数绑定到应用对象上,这么做可以在这个匿名函数中使用$this关键字引用重要的应用对象。例子如下:

<?php
class App
{
  protected $routes = array();
  protected $responseStatus = &#39;200 OK&#39;;
  protected $responseContentType = &#39;text/html&#39;;
  protected $responseBody = &#39;Hello world&#39;;

  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');

6. Zend OPcache

字节码缓存不是PHP的新特性,很多独立的扩展可以实现缓存。从PHP5.5.0开始,PHP内置了字节码缓存功能,名为Zend OPcache。

字节码缓存是什么
PHP是解释性语言,PHP解释器执行PHP脚本时会解析PHP脚本代码,把PHP代码编译成一系列Zend操作码,然后执行字节码。每次请求PHP文件都是这样,会消耗很多资源。字节码缓存能存储预先编译好的PHP字节码。这意味着,请求PHP脚本时,PHP解释器不用每次都读取、解析和编译PHP代码。这样能极大地提升应用的性能。

7. 内置的HTTP服务器

从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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn