1

次の条件では、static::$attribute代わりにを使用する必要がありますか:$this->attribute

b.php

class B {
public function tellAttribute(){
// $this OR static ??
    echo $this->attribute;
}
}

a.php

include 'b.php';

class A extends B {
public $attribute = 'foo';
}

$test = new A();
$test->tellAttribute();

これを尋ねるのは、私が使用しない限り機能しないはずですstatic::$attributeが、まだエコーしているfooです。理由は何ですか?

4

4 に答える 4

2

クラス B は、tellAttribute()次のように呼び出されるパブリック関数を定義します。

public function tellAttribute(){
    echo $this->attribute;
}

次に、クラス A (クラス B の子) をインスタンス化し、次のようにします。

$test = new A();
$test->tellAttribute();

したがって、クラスのオブジェクトをインスタンス化してから、このオブジェクトAを呼び出しtellAttribute()ます。tellAttribute()メソッドは$this変数を使用するため、インスタンス化した実際のオブジェクトを参照しています。tellAttribute()クラス(親) で定義したとしても、実際には publicプロパティBを持つ子オブジェクト ( class のインスタンス) を指しています。それが印刷され、使用する必要がない理由です。A$attributefoostatic::

一方、次のことを考慮してください。

class B {
    public static $attribute = 'foo';
    public function tellAttribute(){
        echo self::$attribute; // prints 'foo'
    }
    public function tellStaticAttribute() {
        echo static::$attribute; // prints 'bar'
    }
}

class A extends B {
    public static $attribute = 'bar';
}

$test = new A();
$test->tellAttribute();
print "<BR>";
$test->tellStaticAttribute();

この例では、$this変数を使用せず、代わりに and を使用self::していますstatic::。は常に を出力しtellAttribute()ます。これは、現在のクラスしか参照できないためです。クラスを「動的に」使用して出力します。私は技術用語などにあまり詳しくないので、マニュアルへのリンクを残します (投稿から既に読んでいると思います): http://php.net/manual/en/language .oop5.late-static-bindings.phpself::fooself::tellStaticAttribute()static::

それがあなたの質問に答えることを願っています。

于 2012-09-27T14:46:20.730 に答える
1

次の条件で $this->attribute の代わりに static::$attribute を使用する必要がありますか? < code >

いいえ、説明したシナリオではキーワードを使用しないことが最も明確であり、機能staticしない理由はありません。のコンテキストは、$this継承されたすべての異なるクラスを 1 つに「足し合わせる」結果と考えてください。つまり、 if class B extends A、 and class C extends B、 C をインスタンス化することにより、クラス A、B、および C のすべてのプロパティと関数がクラス$this内のコンテキストを介して利用可能になり、C が独自のプロパティの関数内で使用することはまったく問題ありません。 B で定義され、その逆も同様です。これは、すべてがインスタンス内の 1 つのスタンドアロン クラスであるかのように存在するためです。

于 2012-09-27T14:48:46.373 に答える
0

はい、それは機能します....$attributeパブリックです.....そして、Aも継承しておりtellAttribute()、どこで何を期待しているのかわかりません。

于 2012-09-27T14:25:10.693 に答える
0

「静的」キーワードをどこにも使用していません。ここでの一般的なクラス設定は私には少し奇妙ですが、 $attribute を静的変数にしたい場合は、代わりに次のように入力する必要があります。

 public static $attribute = 'foo';

静的変数は基本的にグローバル変数であり、ここで詳細を確認できます: http://php.net/manual/en/language.oop5.static.php

于 2012-09-27T14:26:00.997 に答える