PHP 5.4の特性を使用します

Joseph Gordon-Levitt
Joseph Gordon-Levittオリジナル
2025-02-28 10:15:55221ブラウズ

PHP 5.4

で特性を使用するためのガイド

Using Traits in PHP 5.4

コアポイント

    PHP 5.4で導入された特性メカニズムにより、継承階層の独立したクラス間のコードの水平の再利用が可能になり、単一の継承の制限を解き、コードの複製を削減できます。
  • 単一のクラスは複数の特性を使用でき、特性は他の特性で構成され、コードを整理する柔軟でモジュールの方法を可能にすることもできます。
  • キーワードを使用して、同じメソッド名を持つ特性間の競合を解決するか、insteadofキーワードを使用してメソッドエイリアスを作成します。 as
  • 特性は、複合クラスの私有地または方法にアクセスできます。その逆も同様であり、複合クラスが実装する必要がある抽象的な方法を含めることもできます。
オブジェクト指向プログラミングの重要な目標は、より良い組織とコードの再利用を通じてコードの複製を最小限に抑えることです。しかし、PHPでは、使用する単一の継承モデルの制限があるため、これは困難な場合があります。 CやPythonなどの言語により、複数のクラスから継承することができます。これにより、この問題はある程度解決しますが、RubyのMixinは、継承を使用せずに1つ以上のクラスの機能を混合できます。ただし、多重継承にはダイヤモンドの問題などの問題があり、混合物も複雑なメカニズムです。この記事では、このような問題を克服するためにPHP 5.4で導入された新機能である特性について説明します。特性自体の概念は、プログラミングでは新しいものではなく、ScalaやPerlなどの他の言語で使用されています。これらにより、階層を継承するさまざまなクラスを持つ独立したクラス間のコードを水平に再利用できます。

特性の外観

特性は、個別にインスタンス化することはできない抽象クラスに似ています(ただし、インターフェイスと比較されることがよくあります)。 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>

$aDbReaderのオブジェクトであり、$bFileReaderのオブジェクトであることがわかりますが、どちらもシングルトンとして表示されます。シングルトンの方法は、それを使用するクラスに水平に注入されています。特性は、クラスに追加のセマンティクスを課しません。ある程度、特性のメソッドが複合クラスにコピーされるコンパイラ支援のコピーパステメカニズムと考えることができます。 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

特性アプリケーションが成長するにつれて、さまざまなクラスで使用される一連の特性があるでしょう。 PHP 5.4を使用すると、他の特性で構成される特性を持つことができるため、これらすべてのクラスで複数の特性ではなく、1つの特性に複数の特性を含める必要があります。これにより、前の例を次のように書き換えることができます。 ここでは、特性を作成し、

および

特性を使用し、
<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 HelloWorld(スペースの制限とコア情報が保持されているため、次のコンテンツが簡単に要約されます)MyWorldHelloWorld

優先順序:特性法は、親クラスの方法よりも優先度が高く、クラス方法は特性法よりも優先度が高くなっています。

競合解決とエイリアス:使用を使用して、使用する特性方法を選択し、

を使用して競合を回避するためのメソッドエイリアスを作成します。

リフレクション:insteadofas

ReflectionClassなどのクラスで特性情報を取得する方法を提供します。 getTraits() getTraitNames()isTrait()その他の機能:getTraitAliases()特性は、複合クラスの私有地と方法にアクセスできます。

概要:

特性は、PHP 5.4で導入された最も強力な機能の1つであり、この記事ではそのほとんどすべての機能について説明します。これらにより、プログラマーは、同じ継承階層にある必要がない複数のクラス間で水平方向にコードスニペットを再利用できます。それらは、複雑なセマンティクスではなく、軽量コードの再利用メカニズムを提供します。特性の欠点はいくつかありますが、アプリケーションの設計を改善し、コードの複製を排除し、より乾燥させるのに確実に役立ちます。

(記事の長さのために、FAQの部分はここで省略されています。コア情報は上記のコンテンツでカバーされています。

以上がPHP 5.4の特性を使用しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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