ホームページ >php教程 >php手册 >PHP スコープ解決演算子 (::)

PHP スコープ解決演算子 (::)

WBOY
WBOYオリジナル
2016-06-13 12:14:491543ブラウズ

スコープ解決演算子 (::)
今日 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 メソッドを呼び出すのと同じです。

ただし、テスト メソッドで name 属性を出力する必要がある場合、:: を使用して直接呼び出したらどうなるでしょうか? まず、上記のコードを変更してみましょう。



コードをコピーします

コードは次のとおりです。 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 '#########
'; ;


上記のコードを再度実行すると、結果は次のようになります:



コードをコピーします

コードは次のとおりです:


test() 致命的エラー: 未宣言の静的プロパティへのアクセス: A::$_name (D:wwwtestscoperefe.php の 9 行目)

ああ、それ現在のクラスの非静的メソッドにアクセスするにはセルフキーを使用できないことがわかります。 このメソッドを正しく呼び出すには、次の 2 つの方法があります。1. まずクラスをインスタンス化し、次に $this->_name を使用してオブジェクトを直接呼び出します。 、メンバー変数 $_name を static に設定します。

誰もが上記の問題を正しく処理できると思います。

実際、私が本当に言いたいことは次のとおりです:

インスタンス化せずにメソッドを呼び出せる場合は、このメソッドを static キーワードで変更した方がよいでしょう。メソッドを実装するときは、クラスの静的メンバー変数のみが呼び出されます。このようにすれば、上記の問題は発生しません。
メソッドが静的に設定されていない場合。その場合、最も安全な方法は、インスタンス オブジェクトを使用して呼び出しを行うことです。メソッドの実装を変更する場合、クラスの
非静的メンバーが必要になる場合があるため、より安全です。変数 (メソッドの実装を変更するときに、クラス名を使用して直接呼び出すことをほとんど忘れているため)。

私の謙虚な意見。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。