1
<?php
class c1
{
  public static function f1()
  {
    return "hello";
  }

  public static $a=10;

  public function f2()
  {
    echo $this->f1(); //prints "hello"
    echo $this->a;//ERROR:Undefined property: c1::$a in C:\wamp\www\class_in_php\example5.php on line 14
  }
}

$obj1=new c1;
$obj1->f2();
?>

$this またはそのクラスのオブジェクトを使用してクラスの静的変数にアクセスできないのはなぜですか? しかし、$this またはそのクラスのオブジェクトを使用して、そのクラスの静的関数にアクセスできます。

このような現象の背後にある理由は何ですか?

4

3 に答える 3

6

静的メンバーにアクセスするには、self::代わりに使用する必要があります。$this->

その理由は$this、クラスの現在のインスタンスを参照しているのに対し、静的メンバーはインスタンスではなくクラス自体の一部であるためです。

于 2013-09-08T08:24:29.573 に答える
2

静的変数は「インスタンス」ではなく、クラス自体に属します。実行時にクラスの実際の「インスタンス」を持っている場合、そのときだけ$thisポインターが意味をなします。それは「私が今自分自身を見つけたこのインスタンス」を意味します...どのように $this ポインターを使用して参照できますかインスタンスの外に存在しない何か?

$this私が最初に C++ を学んだとき、それは( Metacomco だと思います) オブジェクトをシミュレートするために C プリプロセッサ マクロの膨大な山を実際に使用するシステムでしたthis。すべてのメソッド関数に最初のパラメーターとして渡されるパラメーター:

this->foo("Hello");
this->bar(42, "Finished");

実際には次のように実行されます。

foo(this_ptr, "Hello");
bar(this_ptr, 42, "Finished");

foo() 関数内では、次のようなメソッド変数への参照。

this->status

ポインター逆参照変数への参照にすぎません。

this_ptr->status

thisしたがって、ポインターから静的変数にアクセスしようとすると、その特定のメモリチャンクのメンバーではないため、失敗することがわかります。それが「以前は機能していた」方法ですが、説明はまだ良いものだと思います。

その助けを願っています!:)

于 2013-09-08T08:33:59.290 に答える
0

$this またはそのクラスのオブジェクトを使用してクラスの静的変数にアクセスできないのはなぜですか? しかし、$this またはそのクラスのオブジェクトを使用して、そのクラスの静的関数にアクセスできます。

できますが、間違った構文を使用しています。

違う:

echo $this->a;

右:

$this::$a;

静的クラス変数と同様c1::$aに、正しい構文を使用する必要があります。つまり、ダブルコロン::とドル記号 ( $) を使用して変数を示します$this::$a

ただし、簡単すぎる構文にだまされないでください。理由は次のとおりです。

$this->f1()

PHP バージョン 5 より前には (キーワードで明示的に定義されものとして) 静的クラス メソッドがなく、最初の PHP 5 バージョンでは静的クラス メソッドを呼び出すために使用できc1::f1()たので、静的関数である間に動作します。static->

ただし、静的クラス変数にアクセスすること$thisは、PHP 5.3 以降の構文機能であり、非常に新しいものです。

コード例 (複数の PHP バージョンに対して実行):

<?php
/**
 * @link http://stackoverflow.com/a/24059368/367456
 */
class c1
{
    public static function f1()
    {
        return "hello";
    }

    public static $a = 10;

    public function f2()
    {
        echo $this->f1(); // prints "hello"
        echo $this->a;    // Strict Standards: Accessing static property c1::$a as non static
        echo $this::$a;   // prints "10" (PHP <= 5.2.17: Parse error)
    }
}

$obj1 = new c1;
$obj1->f2();
于 2014-06-05T11:46:00.917 に答える