18

今までに少し理解できたら、何もわからないことに気づきます。私はとても混乱していて、理解するのに苦労していて、理解することができません。誰かが自分自身、親、静的を使用しているときにこのプログラムを説明することができ、私が行うすべての最小の変更は、何が起こっているのか理解できないことなしに結果を変更します。どうもありがとう ..

http://docs.php.net/language.oop5.late-static-bindingsのコード

<?php
class A {
    public static function foo() {
        static::who();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}

class B extends A {
    public static function test() {
        A::foo();
        parent::foo();
        self::foo();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}
class C extends B {
    public static function who() {
        echo __CLASS__."\n";
    }
}

C::test();
?>

出力は次のとおりです。

A
C
C
4

4 に答える 4

25

識別子がコード/データにバインドされるタイミングを決定するLate Static Bindingの概念を理解する必要があります。早い段階で ( ) または後で ( )バインドするように PHP に指示できます。self::static::

例を 2 つのクラスに絞り込むと、次のようになります。

class A {
    public static function foo() {
        self::who(); // PHP binds this to A::who() right away
        static::who();  // PHP waits to resolve this (hence, late)!
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}

class B extends A {
    public static function test() {
       self::foo();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}

B::test();
于 2012-05-08T18:53:31.720 に答える
9

http://php.net/manual/en/language.oop5.static.phpを見てください。それは言います:

クラスのプロパティまたはメソッドを static として宣言すると、クラスのインスタンス化を必要とせずにアクセスできるようになります。

...

静的メソッドは作成されたオブジェクトのインスタンスなしで呼び出すことができるため、疑似変数 $this は static として宣言されたメソッド内では使用できません。

$this静的メソッドを呼び出すときに、$this変数に配置するインスタンス化されたクラス オブジェクトがないため、使用できません。だからあなたは使用しますself::

parent::現在のクラスが拡張している親クラスを参照しています。たとえば、クラス C の親クラスはクラス B であり、クラス B の親クラスはクラス Aです。 http://php.net/manual/en/keyword.parent.phpを参照してください。

実際にそのクラスのインスタンスを宣言せずに関数にアクセスできるようにする場合は、静的メソッドを使用します。


質問を詳しく調べると、リンクは Late Static Bindings を指しています。そのページの最初の2つの例は、static::構文の必要性をかなり明確に示していますが、投稿した例を明確にするために:

foo()クラス A のメソッドを見てくださいstatic::who()。これはwho()、関数が定義されているクラスのスコープではなく、関数を呼び出したクラスのスコープでメソッドが呼び出されることを意味します。したがって、 を呼び出すとC::foo()、C がエコーされます。

代わりに を呼び出した場合、 をself::who()呼び出していることになりますA::who()。クラス A 内であるため、A をself::指します。

うまくいけば、それは役に立ちます。

于 2012-05-08T18:25:35.430 に答える
6

答えの鍵はstatic::who()です。 static:: は、実際のクラス (この場合は C) でメソッドを呼び出すことを意味します。

したがって、C::test() は次のように実行されます。

A::foo();   -> calls to A::foo() therefor echo A
parent::foo(); -> calls to C parent (which is B), B::foo() inherits A::foo() which calls to static::who(), but our actual class is C, therefor echo C
self::foo(); -> again calls to foo() which calls to static::who() with our actual class C

static::who() の代わりに foo が self::who() を呼び出していた場合、結果として 3 つの A が得られます。

于 2012-05-08T18:53:35.123 に答える