ホームページ  >  記事  >  バックエンド開発  >  PHP スコープ解決演算子 (::)_PHP チュートリアル

PHP スコープ解決演算子 (::)_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:36:101139ブラウズ

スコープ解決演算子 (::)
今日joomlaのソースコードを見ていて気づきました。この演算子はクラスの非静的メソッドにもアクセスできることがわかりました。本当に驚きません。私は常に、スコープ解決演算子はクラスの静的メソッドと静的メンバー変数にのみアクセスできると考えていました。
信じられない場合は、これを証明するための簡単なテストコードを以下に示します。

コードをコピーします コードは次のとおりです:

class A{
private $_name = 'A';
function __construct(){
echo 'A コンストラクト
';
function test(){
echo 'A test()
';
}
}
class B extends A{
private $_name = 'B'
function __construct(){
parent:: __construct() ;
echo 'B コンストラクト
';
function test(){
echo 'B test()';
A::test(); ### #####
';
B::test();


このコードを入力した結果は次のとおりです:


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

A test() ######### B test()
クラス A の test() とクラス B の test は静的メソッドではありませんが、「クラス名:」を使用できます。 :メソッド名(パラメータ)リスト)」スタイルが正しく呼び出されます。その効果は、クラスのインスタンスを新規作成し、このインスタンスを使用して
test メソッドを呼び出すのと同じです。
しかし、テスト メソッドで name 属性を出力し、それを :: で直接呼び出す必要がある場合はどうなるでしょうか? まず、上記のコードを変更しましょう。


コードをコピーします

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

class A{ private $_name = 'A'; function __construct(){ echo 'A コンストラクト
';
function test (){
echo 'A test()
', $this->$_name,'
'
}
}
class B extends A{
private $_name = 'B';
function __construct(){
parent::__construct();
echo 'B コンストラクト
';
function test(){
echo 'B test()' , $this ->_name,'
'
}
}
echo '#########
'; B:: test();


上記のコードを実行した結果は次のとおりです:



コードをコピーします

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


致命的なエラー: オブジェクト コンテキスト内にない場合の $this の使用D:wwwtestscoperefe.php の 9 行目 [html]
何人かの友人がそう言いました。もちろん、クラス A をまったくインスタンス化していないので、$this->_name を使用してメンバー変数 $_name に直接アクセスすることはできません。では、それを self::$_name に変更するだけでよいでしょうか。
上記のコードを以下のように変更してください
[code] class A{ private $_name = 'A'; function __construct(){ echo 'A コンストラクト
}
function test(){
echo 'A test()
', self::$_name,'
'
}
}
class B extends A{
private $ _name = '; B';
function __construct(){
parent::__construct();
echo 'B コンストラクト
';
function test(){
echo 'B test()'; >_name,'
';
}
}
echo '#########
'; ();


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



コードをコピーします

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


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



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

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

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

個人的な謙虚な意見。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/322188.html技術記事スコープ解決演算子 (::) 今日、joomla のソースコードを見ていて気づきました。この演算子はクラスの非静的メソッドにもアクセスできることがわかりました。本当に驚きません。いつも思ってた…
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。