ホームページ >バックエンド開発 >PHPチュートリアル >PHP のスコープ解決演算子 (::) を利用する

PHP のスコープ解決演算子 (::) を利用する

不言
不言オリジナル
2018-06-21 09:31:142190ブラウズ

この記事では主に、特定の参照値を持つ PHP のスコープ解決演算子 (::) の使用方法を紹介します。必要な友達はそれを参照してください。

今日は joomla を見てください。ソースコードを読むまで気づかない。この演算子はクラスの非静的メソッドにもアクセスできることがわかりました。本当に驚きません。私は常に、スコープ解決演算子はクラスの静的メソッドと静的メンバー変数にのみアクセスできると考えていました。

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

class A{ 
private $_name = 'A'; 
function __construct(){ 
echo &#39;A construct <br />&#39;; 
} 
function test(){ 
echo &#39;A test() <br />&#39;; 
} 
} 
class B extends A{ 
private $_name = &#39;B&#39;; 
function __construct(){ 
parent::__construct(); 
echo &#39;B construct <br />&#39;; 
} 
function test(){ 
echo &#39;B test()&#39;; 
} 
} 
A::test(); 
echo &#39;######### <br />&#39;; 
B::test();

このコードを入力した結果は次のようになります:

A test() 
######### 
B test()

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

class A{ 
private $_name = &#39;A&#39;; 
function __construct(){ 
echo &#39;A construct <br />&#39;; 
} 
function test(){ 
echo &#39;A test() <br />&#39;, $this->$_name,&#39;<br />&#39;; 
} 
} 
class B extends A{ 
private $_name = &#39;B&#39;; 
function __construct(){ 
parent::__construct(); 
echo &#39;B construct <br />&#39;; 
} 
function test(){ 
echo &#39;B test()&#39;, $this->_name,&#39;<br />&#39;; 
} 
} 
A::test(); 
echo &#39;######### <br />&#39;; 
B::test();

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

Fatal error: Using $this when not in object context in D:\www\test\scoperefe.php on line 9 
[html]

何人かの友人がそう言いました。もちろん、クラス A をまったくインスタンス化していないので、$this->_name を使用してメンバー変数 $_name に直接アクセスすることはできません。では、それを self::$_name に変更するだけでよいでしょうか。
そのまま実行して、上記のコードを変更します。

[code] 
class A{ 
private $_name = &#39;A&#39;; 
function __construct(){ 
echo &#39;A construct <br />&#39;; 
} 
function test(){ 
echo &#39;A test() <br />&#39;, self::$_name,&#39;<br />&#39;; 
} 
} 
class B extends A{ 
private $_name = &#39;B&#39;; 
function __construct(){ 
parent::__construct(); 
echo &#39;B construct <br />&#39;; 
} 
function test(){ 
echo &#39;B test()&#39;, $this->_name,&#39;<br />&#39;; 
} 
} 
A::test(); 
echo &#39;######### <br />&#39;; 
B::test();

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

A test() Fatal error: Access to undeclared static property: A::$_name in D:\www\test\scoperefe.php on line 9

ああ、使用できないことがわかりました。現在のクラスの非静的メソッドにアクセスするための self キーワード。
このメソッドを正しく呼び出すには、2 つの方法があります:
1. まずクラスをインスタンス化し、次に $this->_name; を使用してオブジェクトを直接呼び出します。 , メンバー変数 $_name を static に設定します。
上記の問題は誰でも正しく処理できると思います。
実際、私が本当に言いたいことは次のとおりです。
インスタンス化せずにメソッドを呼び出すことができる場合は、このメソッドを static キーワードで変更した方がよいでしょう。メソッドを実装するときは、クラスの静的メンバー変数のみが呼び出されます。このようにすれば、上記の問題は発生しません。
メソッドが静的メソッドに設定されていない場合。その場合、最も安全な方法は、インスタンス オブジェクトを使用して呼び出しを行うことです。変更する際には、メソッドの実装を変更する必要がある場合があるため、より安全です。クラスのメンバー (メソッドの実装を変更するときに、ほとんどの場合、クラス名を使用してメソッドを直接呼び出すのを忘れているため)。
個人的な謙虚な意見。

上記がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。

関連する推奨事項:

PHP における Yii フレームワークのコンポーネント動作の属性インジェクションとメソッド インジェクションについて


PHP 自身についてシリアル化インターフェイス定義の使用分析 Serializable


以上がPHP のスコープ解決演算子 (::) を利用するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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