メソッドが属する同じクラスのインスタンスを作成するにはどうすればよいですか?

スティーブンR

目的のために、クラス内に「このクラス」を含む変数/マジックプロパティはありnewますか?

が欲しいです:

trait foo {

    public function __construct( $x ) {
        // ... do stuff ...
    }

    static function init( $x ) {
        return new __THISCLASS__( $x ); // <--- whuzzat?
    }

)

class A {
    use foo;
}

class B {
    use foo;
}

これを行う理由は、関数が実際には複数のクラスで使用されるTraitに含まれているためです。したがって、実行されているクラスを把握して対応するオブジェクトを作成できるようにするための共通コードが必要です。

A::init()Aオブジェクトとオブジェクトを返す必要がB::init()ありBます。

PHP7.3の実行

yivi

このようなことを達成するための最も簡単で読みやすい方法staticは、後期静的バインディングを利用するために使用することだと思います。

例えば:

trait aTrait {
    public static function build($x) {
        return new static($x);   
    }
}

class A
{
    public function __construct($x) {
        $this->x = $x;
    }
    use aTrait;
}

class B
{
    public function __construct($x) {
        $this->x = $x * 2;
    }

    use aTrait;
}


$a = A::build(2);
$b = B::build(2);
var_dump($a);
var_dump($b);

ここで動作するのを見てください

get_called_class()これは単に便利です。マニュアルの言葉:

get_called_class —「LateStaticBinding」クラス名

これらは常に元々使用されていたクラスを参照しているため、__CLASS__またはselfビルダーメソッドには使用しません後でクラスを拡張すると、メソッドは期待どおりに機能しません。

たとえば、次のようなものです。

trait dangerTrait
{
    public static function build($x) {
        return new self($x);
    }
}

class X
{
    use dangerTrait;

    public function __construct($x) {
        $this->x = $x * 3;
        echo "building class ", __CLASS__, "\n";
    }
}

class Y extends X {

    public function __construct($x) {
        $this->x = $x * 4;
        echo "building class ", __CLASS__, "\n";
    }
}

$x = X::build(2);
$y = Y::build(2);

...出力されます:

building class X
building class X

および両方$x$yはのインスタンスになりますX

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

同じモデルの2つの異なるインスタンスに属し、Factory BotにそのIDが必要なメソッドのファクトリを作成するにはどうすればよいですか?

分類Dev

typescriptのクラスからインスタンスメソッドを除外するタイプを作成するにはどうすればよいですか?

分類Dev

同じクラスのメインメソッドから非静的メソッドにアクセスするにはどうすればよいですか?

分類Dev

同じクラスの別のメソッドでコンストラクターの状態を更新するにはどうすればよいですか?

分類Dev

あるクラスのメソッドを使用して、Javaで別のインスタンスを作成するにはどうすればよいですか?

分類Dev

同じクラスの onLongClick メソッドの複数のボタンで OnLongClick リスナーを使用するにはどうすればよいですか

分類Dev

インターフェイスインスタンスメソッドに同じクラスの引数のみを受け付けるようにするにはどうすればよいですか?

分類Dev

同じクラスで同じ名前の静的メソッドとインスタンスメソッドを使用するにはどうすればよいですか?

分類Dev

InternalsVisibleTo-誰かが同じ名前のアセンブリを作成して内部クラスまたはメソッドにアクセスできないようにするにはどうすればよいですか?

分類Dev

Typescriptで、イベントハンドラーとして呼び出される同じクラスの別のメソッドからクラスメソッドを呼び出すにはどうすればよいですか?

分類Dev

Pythonの `super()`からインスタンスメソッドの次の行の親クラスを取得するにはどうすればよいですか?

分類Dev

同じ名前のメソッドを持つ2つのインターフェースを実装するにはどうすればよいですか?

分類Dev

メインクラスの2つの変数を評価するメソッドを作成するにはどうすればよいですか?

分類Dev

同じ時間に属するFHIRバンドルリソースのエントリを接続するにはどうすればよいですか?

分類Dev

クラスインスタンスの非静的比較メソッドでpriority_queueを使用するにはどうすればよいですか?

分類Dev

クラス名と同じメソッド名を持つ場合、ネストされたクラスをインスタンス化するにはどうすればよいですか?

分類Dev

クラスからボタンを作成するときにクリックメソッドを確認するにはどうすればよいですか?

分類Dev

同じメソッドと継承で2つのクラスを作成するにはどうすればよいですか?

分類Dev

どうすれば、インターフェイスインスタンスメソッドが同じクラスの引数のみを受け入れるようにできますか?

分類Dev

Objective-CのinitXXXメソッドを同じタイプの引数を持つXamarin.iOSのコンストラクターにバインドするにはどうすればよいですか?

分類Dev

VCL TPanelなど、オブジェクトインスタンスに新しいメソッドを作成するにはどうすればよいですか。

分類Dev

クラスをインスタンス化せずにメソッドを単体テストするにはどうすればよいですか?

分類Dev

同じクラスのインスタンスから同じFXML要素を参照するにはどうすればよいですか?

分類Dev

インターフェイスメソッドの戻り値に同じタイプのクラスを指定するにはどうすればよいですか?

分類Dev

PHP OOP:同じクラスの別のメソッドでメソッドを使用するにはどうすればよいですか?

分類Dev

インターフェイスを動的に実装するクラスからメソッドを取得するにはどうすればよいですか?

分類Dev

typescriptのクラスメソッドに関数型インターフェイスを適用するにはどうすればよいですか?

分類Dev

メソッドインスタンスからクラスアノテーションを取得するにはどうすればよいですか?

分類Dev

静的ファクトリーメソッドでオーバーライドされたメソッドでインスタンスを作成するときに、囲んでいるクラスのプライベートフィールドにアクセスするにはどうすればよいですか?

Related 関連記事

  1. 1

    同じモデルの2つの異なるインスタンスに属し、Factory BotにそのIDが必要なメソッドのファクトリを作成するにはどうすればよいですか?

  2. 2

    typescriptのクラスからインスタンスメソッドを除外するタイプを作成するにはどうすればよいですか?

  3. 3

    同じクラスのメインメソッドから非静的メソッドにアクセスするにはどうすればよいですか?

  4. 4

    同じクラスの別のメソッドでコンストラクターの状態を更新するにはどうすればよいですか?

  5. 5

    あるクラスのメソッドを使用して、Javaで別のインスタンスを作成するにはどうすればよいですか?

  6. 6

    同じクラスの onLongClick メソッドの複数のボタンで OnLongClick リスナーを使用するにはどうすればよいですか

  7. 7

    インターフェイスインスタンスメソッドに同じクラスの引数のみを受け付けるようにするにはどうすればよいですか?

  8. 8

    同じクラスで同じ名前の静的メソッドとインスタンスメソッドを使用するにはどうすればよいですか?

  9. 9

    InternalsVisibleTo-誰かが同じ名前のアセンブリを作成して内部クラスまたはメソッドにアクセスできないようにするにはどうすればよいですか?

  10. 10

    Typescriptで、イベントハンドラーとして呼び出される同じクラスの別のメソッドからクラスメソッドを呼び出すにはどうすればよいですか?

  11. 11

    Pythonの `super()`からインスタンスメソッドの次の行の親クラスを取得するにはどうすればよいですか?

  12. 12

    同じ名前のメソッドを持つ2つのインターフェースを実装するにはどうすればよいですか?

  13. 13

    メインクラスの2つの変数を評価するメソッドを作成するにはどうすればよいですか?

  14. 14

    同じ時間に属するFHIRバンドルリソースのエントリを接続するにはどうすればよいですか?

  15. 15

    クラスインスタンスの非静的比較メソッドでpriority_queueを使用するにはどうすればよいですか?

  16. 16

    クラス名と同じメソッド名を持つ場合、ネストされたクラスをインスタンス化するにはどうすればよいですか?

  17. 17

    クラスからボタンを作成するときにクリックメソッドを確認するにはどうすればよいですか?

  18. 18

    同じメソッドと継承で2つのクラスを作成するにはどうすればよいですか?

  19. 19

    どうすれば、インターフェイスインスタンスメソッドが同じクラスの引数のみを受け入れるようにできますか?

  20. 20

    Objective-CのinitXXXメソッドを同じタイプの引数を持つXamarin.iOSのコンストラクターにバインドするにはどうすればよいですか?

  21. 21

    VCL TPanelなど、オブジェクトインスタンスに新しいメソッドを作成するにはどうすればよいですか。

  22. 22

    クラスをインスタンス化せずにメソッドを単体テストするにはどうすればよいですか?

  23. 23

    同じクラスのインスタンスから同じFXML要素を参照するにはどうすればよいですか?

  24. 24

    インターフェイスメソッドの戻り値に同じタイプのクラスを指定するにはどうすればよいですか?

  25. 25

    PHP OOP:同じクラスの別のメソッドでメソッドを使用するにはどうすればよいですか?

  26. 26

    インターフェイスを動的に実装するクラスからメソッドを取得するにはどうすればよいですか?

  27. 27

    typescriptのクラスメソッドに関数型インターフェイスを適用するにはどうすればよいですか?

  28. 28

    メソッドインスタンスからクラスアノテーションを取得するにはどうすればよいですか?

  29. 29

    静的ファクトリーメソッドでオーバーライドされたメソッドでインスタンスを作成するときに、囲んでいるクラスのプライベートフィールドにアクセスするにはどうすればよいですか?

ホットタグ

アーカイブ