6

私はPHPが初めてで、静的変数の使用を練習しています。C++ から学んだ例をつかみ、PHP 用に書き直すことにしました (この記事の下部の例)。

2 つのプライベート変数 (1 つは静的)、コンストラクター、および get メソッドを持つクラスがあります。コンストラクターは、静的変数の値を 2 番目のプライベート変数に割り当ててから、インクリメントします。

<?php
class Something
{
    private static $s_nIDGenerator = 1;
    private $m_nID;

    public function Something() { 
       $m_nID = self::$s_nIDGenerator++;
       echo "m_nID: " . $m_nID . "</br>"; //for testing, can comment this out
    }
    public function GetID() {
        return $m_nID;
    }

}

// extra question:
// static variable can be assigned a value outside the class in C++, why not in PHP?
// Something::$s_nIDGenerator = 1; 

    $cFirst = new Something();
    $cSecond = new Something();
    $cThird = new Something();

    echo $cFirst->GetID() . "</br>";
    echo $cSecond->GetID() . "</br>";
    echo $cThird->GetID() . "</br>";
?>

9 行目のエコー テストを使用して、m_nID が値を取得しているかどうかを確認します。

m_nID: 1
m_nID: 2
m_nID: 3

しかし、これらの値は"->GetID()" 呼び出しでは返されません。理由はありますか?

編集:これまでの両方の返信でこれは解決しました。両方を「チェック」できたらいいのにと思います。ありがとうございます!同様の問題を抱えている将来の人のために、元のコードをそのまま質問に残します

4

2 に答える 2

9

あなたの C++ のバックグラウンドがこの問題につながったのですが、これは犯しやすい間違いです。PHP では、すべてのインスタンス (またはオブジェクト) 変数は を使用して参照$this->され、静的 (またはクラス) 変数はself::. あなたのコードに基づいて:

public function GetID() {
    return $m_nID;
}

プライベート変数へのアクセスは、次の$m_nIDようにスコープする必要があります。

public function GetID() {
    return $this->m_nID;
}

そしてあなたのコンストラクターの中で:

$m_nID = self::$s_nIDGenerator++;

次のようになっているはずです。

$this->m_nID = self::$s_nIDGenerator++;

質疑応答

使用時に$前に置く必要がないのはなぜですかm_nID$this->

インスタンス変数とクラス変数を参照する上記の 2 つの方法には、非常に異なる種類の構文があります。

  1. $thisはインスタンス参照変数であり、すべてのプロパティは->演算子を使用してアクセスされます。これ$は、プロパティ名自体には繰り返されませんが、宣言には存在します(例: private $myprop)。

  2. self::Something::(クラス名自体)と同義です。インスタンス変数を参照しないため$、前に何もありません。静的変数をクラス定数 ( self::MYCONST) およびクラス メソッド ( self::myMethod()) と区別するために、接頭辞として$.

追加

とはいえ、$this->$myvarこれも受け入れられ、次のように機能します。

private $foo = 'hello world';

function test()
{
    $myvar = 'foo';
    echo $this->$foo; // echoes 'hello world'
}
于 2012-12-20T03:38:45.930 に答える
2
class Something{
    private static $s_nIDGenerator = 1;
    private $m_nID;

    public function Something() { 
       $this->m_nID = self::$s_nIDGenerator++;
    }
    public function GetID() {
        return $this->m_nID;
    }

}

self::$s_nIDGenerator静的変数での使用と静的変数での使用の違いに注意するのは興味深いことですが$this->s_nIDGenerator$this->何も保存しません。

于 2012-12-20T03:44:44.593 に答える