1. 魔法の方法:
1.__get,__set
__get: inaccessible属性を取得するときにトリガーされます(inaccessibleとは、属性が存在しないか、アクセス許可がないことを意味します)
__set: アクセスできないプロパティに値を割り当てるときにトリガーされます
2.__isset、__unset
__isset: isset() 関数を使用してアクセスできないプロパティが決定されたときにトリガーされます
__unset: unset() 関数を使用してアクセスできないプロパティを操作するときにトリガーされます
3.__call、__callStatic
__call: アクセスできないメソッドが呼び出されたときにトリガーされます
__callStatic: アクセスできない静的メソッドが呼び出されたときにトリガーされます
4.__構築、__破壊
__construct: オブジェクトの初期化時にトリガーされます
__destruct: オブジェクトが破棄されるか、スクリプトが実行されるときにトリガーされます
5.__オートロード
__autoload: アクセスできないクラスを使用するときにトリガーされます
6.__クローン
__clone: オブジェクトが複製されるときにトリガーされます
7.__寝て__起きてください
__sleep: Serialize の使用時にトリガーされます
__wakeup: unserialize の使用時にトリガーされます
8.__toString,__invoke
__toString: オブジェクトが文字列として操作されるときにトリガーされます。たとえば、$obj がオブジェクトの場合、echo $obj は __toString をトリガーします。
__invoke: オブジェクトが関数として使用されるときにトリガーされます。$obj がオブジェクトの場合、$obj() が __invoke をトリガーします。
2. 遅延静的バインディング
概念を脇に置いて、理解するために例を見てください:そもそも、遅延静的バインディングはどのようにして出現したのでしょうか? 以下の例を参照してください。 リーリー リーリー リーリー
なぜこの結果になったのでしょうか?
まず、オブジェクト c は get() メソッドを呼び出しますが、クラス C には見つからないため、クラス B で探して見つけ、次に get メソッドを実行します。
最初に A::foo() を実行します。クラス A は自身の foo() を直接呼び出し、`fooA` を出力してから、明らかにここで static::out() を呼び出しているのはクラス A なので、出力クラスになります。その名もAです(ここではカテゴリーAに焦点を当てます)parent::foo()の実行;parentは親クラスを表し、クラスAのfoo()が実行され、`fooA`が出力され、その後static::out()が実行されます。この static を呼び出すのはクラス A ではなく、クラス C です。これは、parent は親クラスを表しますが、特定のクラスを表すわけではないためです (ここでは、親クラスが誰であるかに関係なく、親クラスのメソッドに焦点を当てます)。
次に、 self::foo() を実行します。 self は、そのクラス (クラス B) を表します。これは、親クラスで検索せずに最初に foo() を実行するため、 `fooA` を出力し、次に static::out を実行します。 () 同様に、ここで static を使用しているのはクラス A ではなく、クラス C です。self はクラス B を表しますが、self は特定のクラスを表すことはできません。
簡単に言うと:
オブジェクト c は get()-->A::foo(); の実行を開始します、この時点でチェーンは切断され、クラス A は直接 foo() を呼び出し、オブジェクト c はそれを呼び出します。もちろん、ここでの static はクラス A を指します。 次に、クラス A のオブジェクト c-->parent::foo()-->foo()-->static::out() ですが、ここでの親とは、端的に言うとポインティング関数であり、つまり、オブジェクト c がクラス A の foo メソッドを呼び出すことがわかります。その場合、foo の static はクラス C を表します。 最後に、クラスAのオブジェクト c-->self::foo()-->foo()-->static::out() 、上と同じで、ここの self にもポインティング関数がありますが、結局、私たちはまだクラス A にいます。これは、オブジェクト c がクラス A の foo メソッドを呼び出していると理解できます。その場合、foo の static はクラス C を表します
リーリー りー