/// 問題については次のコードを参照してください
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()
できません私のテスト環境であなたの提案した書き方を試してみてください。それがうまくいかないと言われたら、私がテストして合格します。
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 サイト開発に切り替えたいと思っています
リフレクションを直接使用するだけで、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();
書き方が間違っています。 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