7

私はphp 5.2.6を使用しています。戦略パターンがあり、戦略には静的メソッドがあります。戦略の 1 つを実際に実装するクラスでは、インスタンス化する戦略クラスの名前を取得します。ただし、次のように、インスタンス化の前に静的メソッドの 1 つを呼び出したいと思いました。

$strNameOfStrategyClass::staticMethod();

しかし、それは与えT_PAAMAYIM_NEKUDOTAYIMます。

$> cat test.php

<?

interface strategyInterface {
        public function execute();
        public function getLog();
        public static function getFormatString();
}


class strategyA implements strategyInterface {
        public function execute() {}
        public function getLog() {}
        public static function getFormatString() {}
}

class strategyB implements strategyInterface {
        public function execute() {}
        public function getLog() {}
        public static function getFormatString() {}
}

class implementation {
        public function __construct( strategyInterface $strategy ) {
                $strFormat = $strategy::getFormatString();
        }
}

$objImplementation = & new implementation("strategyB") ;

$> php test.php

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /var/www/test.php on line 24

$> php -v

PHP 5.2.6-1+lenny9 with Suhosin-Patch 0.9.6.2 (cli) (built: Aug  4 2010 03:25:57)

これは 5.3 で動作しますか?

4

2 に答える 2

12

はい。その構文は 5.3 で導入されました

<= 5.2 の回避策として、以下を使用できますcall_user_func

call_user_func(array($className, $funcName), $arg1, $arg2, $arg3);

またはcall_user_func_array:

call_user_func_array(array($className, $funcName), array($arg1, $arg2, $arg3));

しかし、別の注意点として、あなたがやろうとしていることは本当に意味がありません...

なぜそれを静的関数として持っているのですか? とにかく、コンストラクターimplementationはオブジェクトを期待しています(それstrategyInterface $strategyが探しているものです)。文字列はインターフェイスを実装していないため、文字列を渡すことはできません。だから私がすることは、インターフェースを非静的にしてから、次のようなことをすることです:

$strategy = new StrategyB();
$implementation = new Implementation($strategy);

次に、コンストラクターで次のようにします。

$strFormat = $strategy->getFormatString();

または、そのメソッドを静的にしたい場合は、次のようにします。

$strFormat = call_user_func(array(get_class($strategy), 'getFormatString'));

ああ、= & newsynax は非推奨です(とにかく、あなたが思っているようなことはしません)。

于 2010-09-24T14:25:01.207 に答える
0

型ヒントを使用すると、次のような問題が発生します。

implementation::__construct() に渡される引数 1 は、インターフェース strategyInterface を実装する必要があります。指定された文字列

于 2010-09-24T14:27:19.657 に答える