2010-09-24 16 views
7

Estoy usando php 5.2.6. Tengo un patrón de estrategia, y las estrategias tienen un método estático. En la clase que realmente implementa una de las estrategias, recibe el nombre de la clase de estrategia para instanciar. Sin embargo, quería llamar a uno de los métodos estáticos antes de instancias, así:¿No se puede llamar al método estático de la clase como nombre de variable?

$strNameOfStrategyClass::staticMethod(); 

pero da 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) 

¿Funcionaría en 5.3?

Respuesta

11

Sí. Que la sintaxis se introdujo en 5,3

Para solucionar para < = 5.2, puede utilizar call_user_func:

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

o call_user_func_array:

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

Pero en otra nota, lo que estamos tratando de hacer realmente no tiene sentido ...

¿Por qué tenerlo como una función estática? Su constructor en implementation está esperando un objeto de todos modos (eso es lo que strategyInterface $strategy está buscando). Pasar una cadena no funcionará, ya que las cadenas no implementan interfaces. Así que lo que iba a hacer, es hacer que la interfaz no estático, y luego hacer algo como:

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

Luego, en el constructor:

$strFormat = $strategy->getFormatString(); 

O, si realmente todavía quiere que el método de ser estática que podría hacer:

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

Ah, y = & new SYNAX es deprecated (y no hace lo que usted cree de todos modos).

+1

1 para saber cómo lidiar con el problema de alusión al tipo –

+0

Tener un pedo cerebral hoy: PI no quiero pasar un objeto instanciado a la clase implementadora, porque quiero instanciarlo en la línea siguiente, después de que la clase implementadora haya creado algunos datos que la estrategia egy necesita. Creo que necesitaré 'call_user_func_array()' de todos modos, ¡gracias por el excelente código! – user151841

+0

Tenga en cuenta que esto solo funciona en 5.3. Puedes hacer "$ foo :: staticMethod()" pero no puedes hacer "$ this-> foo = new Whatever(); $ this-> foo :: staticMethod()". –

0

Tipo dando a entender que va a dar algunos problemas:

Argumento 1 pasó a aplicación :: __ construct() debe aplicar strategyInterface interfaz, cadena dada

+0

Hm, pedo cerebral esta mañana. ¿Por qué mi php no me dio ese error? – user151841

+0

@ user151841 - Como se detectó T_PAAMAYIM_NEKUDOTAYIM inesperado en el momento de la compilación, entonces recibía ese error ... Lo arreglé con call_user_func() incluso antes de intentar ejecutar el código, y obtuve el segundo error, que es un error de tiempo de ejecución. –

Cuestiones relacionadas