サブクラス オブジェクトが基本クラスのオーバーロードされた関数を直接呼び出すかどうかについての質問ですか?

WBOY
リリース: 2016-06-23 14:12:07
オリジナル
907 人が閲覧しました

/// 問題については次のコードを参照してください
class A
{
function A()
{
$this->nNum = 1024; }
function SelfClass()
{
echo "クラスA<
$obj = new B();
$obj->SelfClass(); // クラス B の SelfClass() 関数を呼び出す
/* オブジェクト obj の基本クラスの SelfClass() 関数を使用する方法
同様のコード $obj->A::SelfClass() は C++ で記述できますが、PHP ではどのように実装できるでしょうか? ***/ ... class_name::$function_name(); は編集できません。
self::$function_name(); を使用する前提は、$function_name() が静的関数であるということです。


うーん、何をしているのかよくわかりません
しかし、少なくとも A::$function_name(); の 21 行目は $class_name::$function_name(); として記述する必要があります
それ以外の場合は、普遍的ではありません

$ class_name::$function_name(); この書き方は文法的に間違っています。このように書くことはできません。
$class_name は文字列としてのみ解析できるため、この構文は使用できません。あなたのアイデアは美しいですが、それは実現できません

これは単なる美しい願いではありません!実際の測定により、 $class_name::$function_name() の記述が正しいことが証明されています (php5.4.12)

ただし、注意する必要があるのは、
$class_name::$function_name() の記述であるか
か、A::$ の記述であるかです。 function_name()

$function_name は静的メソッドである必要があるため、これらはすべて php 構文と矛盾していますが、ここではそうではありません

そして、ここでは php はエラーを報告しません。これは明らかにバグです


できません私のテスト環境であなたの提案した書き方を試してみてください。それがうまくいかないと言われたら、私がテストして合格します。
A::$function_name() が OK であることを実際にテストしました。この呼び出しでは、$function_name が静的メソッドである必要はありません。
さらに、書き込みメソッド $class_name::$function_name() が $class_name をクラスに解析して使用できないことをテストしました。
解析できるのは文字列のみです。 PHP のバージョンが古すぎる可能性がありますか? ! !


A::SelfClass(); //厳格な標準: 非静的メソッド A::SelfClass() は静的に呼び出すべきではありません これは通常の構文エラーです (マスクされる可能性があります)
$function_name = 'SelfClass'; A ::$function_name(); //ここで構文エラーを報告しないのは異常です

システムに二重基準があってはなりません!

私のものは PHP バージョン 5.2.6 です

この構文に似た A::$function_name(); の使用例を本で見つけました

この段落は、『PHP および MySQL プログラミング』第 4 版からのものです

クラスname::メソッド名 この記述方法は古くから存在していましたが、制限があったのは php5.3 でした。似ている。

C++ はコンパイルされて実行されるため、ソース コードが何回スキャンされても問題ありません。


独自のインタープリターを作成する場合は、複数回スキャンすると実行効率に影響します。 , 多くのあいまいさがあることがわかります。この問題は 2 回目のスキャンでは解決できません

モデレータは、あいまいさの問題が確かに重要なポイントであると述べました。モデレーターに聞きたいのですが、以前は C++ ゲーム開発をしていましたが、Web サイト開発に切り替えたいと思っています

PHP プログラマーとして、JavaScript を学ぶ必要がありますか? また、基本的な HTML をどの程度学ぶ必要がありますか?


リフレクションを直接使用するだけで、php5.2 と php5.3 はテストに合格できます

<?phpclass A{	function A()	{ 		$this->nNum = 1024;	}	function SelfClass()	{		echo "class A<br>" . $this->nNum . "<br>";	}	function __call($name, $arguments) {		list($class_name, $function_name) = explode('_', $name);				if(is_subclass_of($this, $class_name))		{			if ($class_name == __CLASS__)			{				self::$function_name();			} 			else 			{				$class_name::$function_name();			}		}	}}class B extends A{	function B()	{		$this->nNum = 2048;	}	function SelfClass()	{		echo "class B<br>" . $this->nNum . "<br>";	}	}class C extends B{	function C()	{		$this->nNum = 4096;	}	function SelfClass()	{		echo "class C<br>" . $this->nNum . "<br>";	}	}$obj = new B();$obj->SelfClass(); // 调用B类的函数SelfClass()函数$obj->A_SelfClass();$obj = new C();$obj->SelfClass(); // 调用C类的函数SelfClass()函数$obj->A_SelfClass();$obj->B_SelfClass();
ログイン後にコピー


では、パラメーターの受け渡しについてはどうでしょうか?

起動方法は確かに良いアイデアですが、パラメータの問題はさらに厄介です。

evla()関数を使えば解決できると思います

書き方が間違っています。 void eval(string code_str); であるべきです

では、パラメータの受け渡しはどうすればよいでしょうか?

そんなに面倒ではありません
class A
{
function A()
{
$this->nNum = 1024;
}
function SelfClass($a,$b,$c,$d, $e,$f)

echo "クラス A
" . "$a,$b,$c,$e,$ f". "
";
}

function __call($name, $arguments) {
list($class_name, $function_name) =explode('_', $name);

if(is_subclass_of( $this, $class_name))
{
//メソッドを反映します
$reflectionMethod = new ReflectionMethod($class_name, $function_name);

//現在のオブジェクトを使用して呼び出します
$reflectionMethod->invokeArgs($this, $arguments

echo "class B
" . "
";

class C extends B
{
function C()
{
$this- >nNum = 4096;
関数 SelfClass() {
echo "クラス C
" . "
" }
$obj = new B ();
$obj->SelfClass(); // クラス B の関数 SelfClass() を呼び出します
$obj->A_SelfClass(1,2,3,4,5,6,7); $obj = new C();
$obj->SelfClass(); // クラス C の SelfClass() 関数を呼び出します
$obj->A_SelfClass(1,2,3,4,5,6, 7);
$obj-> B_SelfClass();


ああ、それは非常にうまく解決されました。ありがとうhnxxwyq

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート