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

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

Jul 21, 2016 pm 03:11 PM
java php 分析する 応用 方法 はい 移行 静的 いいえ

非静的メソッドを静的に呼び出します! !これは 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 環境で実行できることを確認する必要があります)。

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

根本的な実装理由

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

まず第一に、あなた自身の視点を覆す必要があります。静的呼び出しとは何ですか? それは静的呼び出しであるという意味ではありませんが、呼び出しスコープに注目してください。
「$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 属性を自然に呼び出します。

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

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

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

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

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

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

PHPでHTML/XMLを解析および処理するにはどうすればよいですか?

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8 Stream Foreachから休憩または戻ってきますか?

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

母音を文字列にカウントするPHPプログラム

Java をシンプルに: プログラミング能力を高める初心者向けガイド Java をシンプルに: プログラミング能力を高める初心者向けガイド Oct 11, 2024 pm 06:30 PM

Java をシンプルに: プログラミング能力を高める初心者向けガイド

未来を創る: まったくの初心者のための Java プログラミング 未来を創る: まったくの初心者のための Java プログラミング Oct 13, 2024 pm 01:32 PM

未来を創る: まったくの初心者のための Java プログラミング

カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

カプセルの量を見つけるためのJavaプログラム

See all articles