PHP の非静的メソッドの静的呼び出しのアプリケーション分析_PHP チュートリアル
Jul 21, 2016 pm 03:11 PM
非静的メソッドを静的に呼び出します! !これは Java や C# では考えられないことですし、絶対に不可能です。これらの言語では、このようなエラーはコンパイル段階で指摘されます。しかし、php のような動的言語はどうでしょうか?まず、これには構文エラーはありません。php –l ではエラーが見つかりません。それが実行されたらどうなるでしょうか?
まず例を見てみましょう
<?php
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 環境で実行できることを確認する必要があります)。
根本的な実装理由
まず第一に、あなた自身の視点を覆す必要があります。静的呼び出しとは何ですか? それは静的呼び出しであるという意味ではありませんが、呼び出しスコープに注目してください。
「$this ポインターが指すオブジェクトは、このメソッドが呼び出されるときの呼び出しスコープです。」
文の翻訳を変更します:
静的呼び出しには呼び出しスコープがありません。非静的呼び出し $this->abc() で $this が指すオブジェクトが呼び出しスコープです。
呼び出しスコープは、各文が呼び出されるときに渡されます。
次のコードを理解してください:
<?php
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 属性を自然に呼び出します。

人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法
