スコープ解決演算子 (::)
今日 joomla のソースコードを見ていて気づきました。この演算子はクラスの非静的メソッドにもアクセスできることがわかりました。本当に驚きません。私は常に、スコープ解決演算子はクラスの静的メソッドと静的メンバー変数にのみアクセスできると考えていました。
信じられない方は、これを証明できる簡単なテスト コードを次に示します。
コードをコピーします コードは次のとおりです。
class A{
private $_name = 'A'; 🎜>function __construct(){
echo 'A コンストラクト
';
}
function test(){
echo 'A test()
' ;
}
}
クラス B は A{
private $_name = 'B'
function __construct(){
parent::__construct(); 'B コンストラクト
';
}
関数 test(){
echo 'B test()';
}
}
A::test( );
echo '#########
';
このコードを入力した結果は次のとおりです。 :
コードは次のとおりです: A test()
##### ##B test()
クラス A の test() とクラス B の test は静的メソッドではありませんが、「クラス名::メソッド」の形式で実行できます。 name (パラメータリスト)」 正しい呼び出しです。その効果は、クラスのインスタンスを新規作成し、このインスタンスを使用して
test メソッドを呼び出すのと同じです。
コードは次のとおりです。 class A{
private $_name = 'A'; 🎜>function __construct(){echo 'A コンストラクト
';
}
function test(){
echo 'A test()
' , $this ->$_name,'
'
}
}
クラス B は A{
private $_name = 'B'; __construct (){
parent::__construct();
echo 'B コンストラクト
';
}
関数 test(){
echo 'B test()' , $this ->_name,'
'
}
}
A::test(); echo '######### < ;br / >';
B::test();
上記のコードを実行した結果は次のとおりです:
コピーcode
致命的エラー: D:wwwtestscoperefe.php の 9 行目でオブジェクト コンテキストにないときに $this を使用します [html] _name を使用してメンバー変数 $_name に直接アクセスすることはできません。では、それを self::$_name に変更するだけでよいでしょうか。 上記のコードを以下のように変更してください[code]
class A{private $_name = 'A';
function __construct(){
echo 'A コンストラクト
';
}
function test(){
echo 'A test()
', self::$_name,'
';
}
}
クラス B は A{
private $_name = 'B';
function __construct(){
parent::__construct(); echo 'B コンストラクト
';
}
function test(){
echo 'B test()', $this->_name,'
' ;
}
}
A::test();
echo '#########
'; ;
上記のコードを再度実行すると、結果は次のようになります:
コードをコピーします
コードは次のとおりです:
ああ、それ現在のクラスの非静的メソッドにアクセスするにはセルフキーを使用できないことがわかります。 このメソッドを正しく呼び出すには、次の 2 つの方法があります。1. まずクラスをインスタンス化し、次に $this->_name を使用してオブジェクトを直接呼び出します。 、メンバー変数 $_name を static に設定します。
誰もが上記の問題を正しく処理できると思います。
実際、私が本当に言いたいことは次のとおりです: