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

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

Jun 13, 2016 pm 12:14 PM
joomlaphp範囲ソースコード見て解析するオペレーター

スコープ解決演算子 (::)
今日 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 '######### ';
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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい