2011-04-30 5 views
5

Por ejemplo, tengo un código de este tipo:Por qué funcionan como elemento de la matriz en la clase php no funciona

<?php 
$A = array(
    'echoSmth' => function(){ 
     echo 'Smth'; 
    } 
); 

$A['echoSmth'](); // 'Smth' 
?> 

funciona bien! Pero si $ a no es sólo una variable, sino un método de clase - que esto no funciona:

<?php 

class AA { 

    public $A = array(
     'echoSmth' => function(){ // Parse Error here! 
      echo 'Smth'; 
     } 
    ); 

} 

// Fixed call: 
$t = new AA(); 
$t->A['echoSmth'](); 
// no matter what call, because error occurs early - in describing of class 

?> 

Por qué no funciona? Muestra: Parse error: syntax error, unexpected T_FUNCTION

P.S. Lo siento, he cometido algunos errores en la forma en que llamo al método, tenía prisa. Pero no importa cómo llame. El error ocurre incluso si acabo de declarar la clase, sin llamar

+2

intentan $ t-> a [ 'echoSmth'](); sin el signo de dólar – usoban

+3

@usoban: a en mayúsculas. –

+0

@marcel a la derecha, estaba mirando la última línea, donde a es minúscula. mi mal :) – usoban

Respuesta

3

Por lo que sé, no se puede tener nada dinámico al definir un miembro de la clase, sin embargo, puede configurarlo dinámicamente de la siguiente manera. Entonces, básicamente, no puede hacerlo por la misma razón que usted no puede hacer esto: public $A = functionname();

Además, su firma de llamada no era correcta, la he solucionado en mi ejemplo.

<?php 
class AA { 
    public $A = array(); 

    public function __construct() { 
     $a = function() { 
      echo 'Smth'; 
     }; 
     $this->A['echoSmth'] = $a; 
    } 
} 

$t = new AA(); 
$t->A['echoSmth'](); 

Alternativamente, se podría definir toda la matriz dentro __construct(), que contiene el método (así que básicamente cambiar su código).

2

Tengo esto para trabajar. Sin embargo, no estoy seguro de por qué no se permite la declaración directa.

class AA { 
    var $A; 
    public function __construct() { 
     $this->A = array(
      'echoSmth' => function(){ 
       echo 'Smth'; 
      } 
     ); 
    } 
} 

$t = new AA(); 
$t->A['echoSmth'](); 

EDIT: También vi y corregido $t->$a primera, pero necesitaba para mover la declaración como bien de hacer que funcione.

+2

Tiene un error, está usando $ t -> $ a en lugar de $ t -> a. Tienes el código correcto, el OP no. No hay problema de php aquí, solo un simple error al acceder al miembro. –

+1

@Michael Incorrecto, hay un error de análisis para definir un cierre al definir el valor de $ A (Pero sí, eso fue un error). –

+0

Ese también es cierto Rudi, hojeé la clase y asumí que se aseguró de que no tuviera errores de análisis - al parecer, no se puede confiar en nadie en estos días, gracias por señalar eso :) –

1

bueno, es algo funciona ...

<?php 

    class Bleh 
    { 

     public $f = array(); 

     public function register($name , $func) 
     { 

      $this->f[ $name ] = $func; 

     } 

    } 


    $foo = new Bleh; 
    $foo->register('bar' , function(){ echo 'foobar'; }); 

    $foo->f['bar'](); 

?> 
Cuestiones relacionadas