ホームページ >バックエンド開発 >PHPチュートリアル >PHP 5.4の特性を使用します
PHP 5.4
で特性を使用するためのガイド
コアポイント
insteadof
キーワードを使用してメソッドエイリアスを作成します。 as
特性の外観
特性は、個別にインスタンス化することはできない抽象クラスに似ています(ただし、インターフェイスと比較されることがよくあります)。 PHPドキュメントは、次のように特性を定義します。特性の目的は、開発者がいくつかの独立したクラス(異なるクラス継承階層に存在する)でメソッドセットを自由に再利用できるようにすることにより、単一の継承の制限の一部を減らすことです。この例を考えてみましょう:
<code class="language-php"><?php class DbReader extends Mysqli { } class FileReader extends SplFileObject { }</code>両方のクラスが両方のシングルトンを作成するなど、いくつかの一般的な機能を必要とする場合、それは問題になります。 PHPは複数の継承をサポートしていないため、各クラスはSingletonパターンをサポートする必要なコードを実装する必要があります。または、無意味な継承階層があります。特性は、このタイプの問題の解決策を提供します。
<code class="language-php"><?php trait Singleton { private static $instance; public static function getInstance() { if (!(self::$instance instanceof self)) { self::$instance = new self; } return self::$instance; } } class DbReader extends ArrayObject { use Singleton; } class FileReader { use Singleton; }</code>シングルトン特性は、この特性を使用してクラスのオブジェクト(まだ作成されていない場合)を作成して返す静的方法
を使用して、シングルトンパターンの直接実装で実装されます。これらのクラスのオブジェクトを作成して、getInstance()
メソッドを使用してみましょう。 getInstance()
<code class="language-php"><?php class DbReader extends Mysqli { } class FileReader extends SplFileObject { }</code>
$a
はDbReader
のオブジェクトであり、$b
はFileReader
のオブジェクトであることがわかりますが、どちらもシングルトンとして表示されます。シングルトンの方法は、それを使用するクラスに水平に注入されています。特性は、クラスに追加のセマンティクスを課しません。ある程度、特性のメソッドが複合クラスにコピーされるコンパイラ支援のコピーパステメカニズムと考えることができます。 Private $instance
だけの場合、属性はDbReader
のダンプに表示されません。しかし、特性があると、そこにあります! ReflectionClass::export()
<code class="language-php"><?php trait Singleton { private static $instance; public static function getInstance() { if (!(self::$instance instanceof self)) { self::$instance = new self; } return self::$instance; } } class DbReader extends ArrayObject { use Singleton; } class FileReader { use Singleton; }</code>
複数の特性
これまでのところ、1つのクラスで1つの特性を使用していますが、場合によっては複数の特性の機能をマージする必要がある場合があります。
<code class="language-php"><?php $a = DbReader::getInstance(); $b = FileReader::getInstance(); var_dump($a); //object(DbReader) var_dump($b); //object(FileReader)</code>ここには、2つの特性、
とHello
があります。 World
特性は「こんにちは」と言うことができます。 Hello
クラスでは、World
およびMyWorld
を適用して、Hello
オブジェクトにこれら2つの特性からのメソッドがあり、「Hello World」と言うことができます。 World
特性で構成されるMyWorld
および
特性を使用し、<code>Class [ class FileReader ] { @@ /home/shameer/workplace/php54/index.php 19-22 - Constants [0] { } - Static properties [1] { Property [ private static $_instance ] } - Static methods [1] { Method [ static public method instance ] { @@ /home/shameer/workplace/php54/index.php 6 - 11 } } - Properties [0] { } - Methods [0] { } }</code>に含めました。
特性には他の2つの特性からの方法があるため、クラスにこれらの2つの特性を含めた場合とまったく同じです。 HelloWorld
Hello
World
(スペースの制限とコア情報が保持されているため、次のコンテンツが簡単に要約されます)MyWorld
HelloWorld
優先順序:特性法は、親クラスの方法よりも優先度が高く、クラス方法は特性法よりも優先度が高くなっています。
競合解決とエイリアス:使用を使用して、使用する特性方法を選択し、
を使用して競合を回避するためのメソッドエイリアスを作成します。
リフレクション:insteadof
as
、、、ReflectionClass
などのクラスで特性情報を取得する方法を提供します。 getTraits()
getTraitNames()
isTrait()
その他の機能:getTraitAliases()
特性は、複合クラスの私有地と方法にアクセスできます。
概要:
特性は、PHP 5.4で導入された最も強力な機能の1つであり、この記事ではそのほとんどすべての機能について説明します。これらにより、プログラマーは、同じ継承階層にある必要がない複数のクラス間で水平方向にコードスニペットを再利用できます。それらは、複雑なセマンティクスではなく、軽量コードの再利用メカニズムを提供します。特性の欠点はいくつかありますが、アプリケーションの設計を改善し、コードの複製を排除し、より乾燥させるのに確実に役立ちます。
(記事の長さのために、FAQの部分はここで省略されています。コア情報は上記のコンテンツでカバーされています。
以上がPHP 5.4の特性を使用しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。