ホームページ  >  記事  >  バックエンド開発  >  PHP の非静的メソッドの静的呼び出しのアプリケーション分析_PHP チュートリアル

PHP の非静的メソッドの静的呼び出しのアプリケーション分析_PHP チュートリアル

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

非静的メソッドを静的に呼び出します! !これは Java や C# では考えられないことですし、絶対に不可能です。これらの言語では、このようなエラーはコンパイル段階で指摘されます。しかし、php のような動的言語はどうでしょうか?まず、これには構文エラーはありません。php –l ではエラーが見つかりません。それが実行されたらどうなるでしょうか?
まず例を見てみましょう

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

class myClass
{
private $name = "myClass"

public function echoName; (){ echo $this->name;
}

public function getName(){
$this->echoName();
public function echoName (){
echo $this->name; );
$app->test();


このコードの最終的な呼び出し結果は何ですか? (実行環境 PHP 5.3.10)




この結果を見ると、注目に値することがいくつかあります:

最初は myClass::getName() です。これは静的関数呼び出しです。
しかし、myClass の getName() 関数を見てください、これは静的関数ではありません。


返される 2 番目の構造体

最初に PHP Strict Standards Error が返されます。 PHP に詳しい人は、Strict Error が PHP のコーディング標準化の警告であることを知っているはずです。これは通常、前方互換性を維持するために PHP によって報告されるエラーです。つまり、非静的関数の静的呼び出しは php5.3 より前のバージョンでは許可されていますが、それ以降のバージョンでは推奨されません。 !

ここで、error_reporting の Strict Error をコメントアウトすると、返される結果は newClass になります!!

php4版ではサブクラスが親クラスのメソッドを呼び出す必要がありますが、サブクラスにも同名のメソッドがあるため$thisが使えないため、php4では(parentClassName::method())のようなメソッドを用意しています。 。 (もちろんphp5はキーワードparentを追加します)

しかし、php4 が提供するこのメソッドでは、実際には非静的メソッドの静的呼び出しが可能です。 !バックグラウンドでの前方互換性の必要性により、この機能は削除できない機能になりました (以前のバージョンのコードが新しいバージョンの PHP 環境で実行できることを確認する必要があります)。

この種の呼び出しを促すために Strict Error を追加しました。

根本的な実装理由

さて、この状況が発生する実装理由については、Niao 兄弟によるこの記事に説明があります http://www.laruence.com/2012/06/14/2628.html

まず第一に、あなた自身の視点を覆す必要があります。静的呼び出しとは何ですか? それは静的呼び出しであるという意味ではありませんが、呼び出しスコープに注目してください。
「$this ポインターが指すオブジェクトは、このメソッドが呼び出されるときの呼び出しスコープです。」

文の翻訳を変更します:

静的呼び出しには呼び出しスコープがありません。非静的呼び出し $this->abc() で $this が指すオブジェクトが呼び出しスコープです。

呼び出しスコープは、各文が呼び出されるときに渡されます。
次のコードを理解してください:

コードをコピーします

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

class A {

public function __construct() {

}

}

class B extends A {

パブリック関数 __construct() { parent::__construct()
}
}

;
ここでのparent::_construct()は、サブクラスの呼び出しスコープであり、親クラスAの呼び出しスコープに変換されます。これは静的な呼び出しではありません。

先頭の例に戻る
myClass::getName();

この時点では、parent などのキーワードは使用されておらず、$this も再割り当てされていないため、呼び出しスコープは変更されず、$app のままです。つまり、現時点では、表示されるすべての $this ポインターは $app を指します。

次のことは理解しやすいです。 echo $this->name; は、呼び出し側スコープの name 属性を自然に呼び出します。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/326864.html技術記事非静的メソッドへの静的呼び出し! !これは Java や C# では考えられないことですし、絶対に不可能です。これらの言語では、このようなエラーはコンパイル段階で指摘されます。でも...
のために
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。