ホームページ >バックエンド開発 >PHPチュートリアル >PHP 名前空間、特性、ジェネレーターの概要

PHP 名前空間、特性、ジェネレーターの概要

巴扎黑
巴扎黑オリジナル
2017-08-14 10:10:181231ブラウズ

この記事では、PHP の新機能の名前空間、トレイト、ジェネレーターに関する関連情報を主に紹介します。主に php のトレイト (trait) とジェネレーター (generator) の内容について説明します。とジェネレーター(ジェネレーター)に興味のある学生は参考にしてください。

この記事では主に、PHP の新機能の名前空間、特性、ジェネレーターに関する関連コンテンツを紹介します。詳細な紹介を見てみましょう:

1.

名前空間とは何ですか?

1) 名前空間は、フォルダーの機能と同様に、PHP 5.3 で導入されました。たとえば、Symfony フレームワークのリクエストとレスポンスは、Symfony 名前空間の下にあります。


2) 名前空間は常に


3) PHP ファイルの名前空間は、オペレーティング システムの物理ファイル システムとは異なります。これは仮想的な概念であり、ファイル システムのディレクトリ構造と必ずしも一致するわけではありません。それにもかかわらず、ほとんどの PHP コンポーネントは、広く使用されている PSR4 自動読み込み標準と互換性を保つために、ファイル システムのサブディレクトリにサブ名前空間を配置します。


4). 名前空間は、PHP 言語の単なるトークンです。PHP インタープリターは、このトークンをクラス、インターフェイス、関数、定数の名前に接頭辞として追加します。

なぜ名前空間が必要なのでしょうか?

1). 名前空間を使用すると、プログラムをサンドボックスのように実行でき、他の開発者が作成したコードと一緒に使用できます。コードとプロジェクトがプロジェクトのサードパーティ依存関係で使用できることを確認してください。

名前空間の宣言

1) トップレベルの名前空間は、トップレベルのメーカー名を設定するためによく使用されます。 2). メーカーの名前空間はグローバルに一意である必要があります。サブ名前空間はそれほど重要ではありませんが、プロジェクトのコードを整理するのに役立ちます。

インポートとエイリアス

1) PHP5.3 以降、PHP クラス、インターフェイス、およびその他の名前空間をインポートし、それらのエイリアスを作成できます。 PHP5.6 以降では、PHP 関数と定数をインポートし、それらのエイリアスを作成できるようになりました。


2). use キーワードを使用してコードをインポートする場合、PHP はインポートされた名前空間が完全修飾された名前空間であると想定するため、先頭にシンボルを追加する必要はありません。 use キーワードは、グローバル スコープ内に指定する必要があります。つまり、このキーワードはコンパイル中に使用されるため、名前空間宣言ステートメントの後に使用して、他の名前空間コードをインポートできます。


PHP5.6 から関数と定数をインポートできるようになりました。

<?php
use func Namespace\functionName;

functionName();

定数をインポートすることもできます。

use constant Namespace\CONS_NAME;
echo CONS_NAME;

関数と定数のエイリアスはクラス名と同じ方法で作成されます。

ベストプラクティス

1).PHP では、1 つの PHP ファイルで複数の名前空間を定義できます。しかし、そうすることは混乱を招く可能性があり、クラスごとに 1 つのファイルを作成するという推奨習慣に反します。 2) 名前空間内のグローバル名前空間のコードを参照する場合は、PHP のネイティブ例外クラスなどのクラスをグローバルに検索する必要があることを PHP に伝えるプレフィックスを追加する必要があります。

自動読み込み

1) 名前空間は、PHP-FIG によって開発された PSR4 オートローダーの強固な基盤を築きます。

2. インターフェースの使用 1) 別の車を運転することを選択できるようです。なぜなら、どれもハンドル、アクセル、ブレーキがあり、燃料はガソリンだからです。

3. 特性 1) Shape は、1 つ以上の既存の PHP クラスに混合できる、クラスの部分的な実装です。 class can それが行うこと (インターフェイスなど)、モジュール形式の実践 (クラスなど) を提供します。


2). 特性により、2 つの無関係なクラスが同じ属性とメソッドを使用できるようになります。


3).PHP インタープリターは、プロパティをコピーしてクラス定義本体に貼り付けます。

4. ジェネレーターを作成します 1) 通常の関数で、値を返さずに、yield キーワードを 1 回または複数回使用します。この関数はジェネレーターです。例:

<?php
function myGenerator() {
 yield &#39;value1&#39;;
 yield &#39;value2&#39;;
}

ジェネレーター関数を呼び出すと、PHP は Generator クラスに属するオブジェクトを返します。このオブジェクトは、反復ごとに foreach() 関数を使用して反復できます。反復される次の A 値を計算して提供します。ジェネレーターの優れた点は、各値が生成された後、定義本体の最後に到達するか、次のエラーが発生するまで、ジェネレーターの内部状態が一時停止と回復の間で切り替わることです。例:

<?php
foreach (myGenerator() as $yieldedValue) {
 echo $yieldedValue, PHP_EOL;
}

上の例は

value1
value2
2) を出力します。値の範囲を生成します(間違った方法)

function makeRange($length) {
 $dataset = [];
 for ($i=0; $i < $length; $i++) {
 $dataset[] = $i;
 }
 return $dataset;
}

$customRange = makeRange(1000000);
foreach ($customeRange as $i) {
 echo $i, PHP_EOL;
}

预先创建了一个包含很大整数组成的数组,再看使用生成器的例子。


function makeRange($length) {
 for ($i = 0; $i < $length; $i++) {
 yield $i;
 }
}

foreach(makeRange(1000000) as $i) {
 echo $i, PHP_EOL;
}

在实际的例如迭代一个4GB大小的文件中功能中,迭代器大展身手。


function getRows($file) {
 $handle = fopen($file, &#39;rb&#39;);
 if ($handle === false) {
 throw new Exception();
 }
 //feof()函数检测是否到达文件末尾
 while (feof($handle) === false) {
 //fgetcsv()一次读取csv文件的一行
 yield fgetcsv($handle);
 }
 fclose($handle)
}

foreach (getRows(&#39;data.csv&#39;) as $row) {
 print_r($row);
}

3).生成器没有为PHP添加新功能,需要实现在数据集中执行快进、快退和查找,最好自己编写类实现Iterator接口,或者使用PHP标准库中的某个原生迭代器。

原生迭代器链接

以上がPHP 名前空間、特性、ジェネレーターの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。