4

クラス名Carを静的変数として定数に格納しています。この定数を使用して関数を呼び出したいと思いますa。1 つのオプションは、中間変数を使用することです$tmp。その後、 を呼び出すことができまし$tmp::a()た。これを1つのステートメントで行う方法はありますか?私の試みは以下です。

class Car{
    public static function a(){
        return 'hi';
    }
}

class Constants{
    public static $use='Car';
}

$tmp=Constants::$use;

echo(${Constants::$use}::a());

IDEOne リンク

出力は次のとおりです

PHP Notice:  Undefined variable: Car in /home/mU9w5e/prog.php on line 15
PHP Fatal error:  Class name must be a valid object or a string in /home/mU9w5e/prog.php on line 15
4

3 に答える 3

7

常にありますcall_user_func():

echo call_user_func( array( Constants::$use, 'a'));

IDEOneデモ

于 2013-05-17T02:31:08.650 に答える
3

@nickbの方法に代わる唯一の方法は、聞いたことのないものを使用することでしたが、それが SO の目的です!

より肥大化しているように見えるReflectionMethodを見つけましたcall_user_funcが、見つけることができた唯一の代替方法でした。

<?php
class Car{
    public static function a(){
        return 'hi';
    }
}

class Constants{
    public static $use='Car';
}
$reflectionMethod = new ReflectionMethod(Constants::$use, 'a');
echo $reflectionMethod->invoke(new Car());

Casebashは一時変数を作成したくないため、上記は少し失敗した実験です。

CORRUPTがコメントで述べたように、テスト済みですが、以下を使用することが可能PHP version 5.4.14です (私はできません):

echo (new ReflectionMethod(Constants::$use, 'a'))->invoke(new Car());
于 2013-05-17T02:49:53.687 に答える
2

私はクレイジーな解決策を持っていますが、決して使用しないでください:^ )

echo ${${Constants::$use} = Constants::$use}::a();
于 2013-05-17T03:12:54.953 に答える