Например, у меня есть такой код:
<?php $A = array( 'echoSmth' => function(){ echo 'Smth'; } ); $A['echoSmth'](); // 'Smth' ?>
Он отлично работает! Но если $ A – это не просто переменная, но метод класса – чем это не работает:
<?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 ?>
Почему это не работает? Он отображает: Parse error: syntax error, unexpected T_FUNCTION
PS Извините, я допустил некоторые ошибки в способе, которым я называю метод, я спешил. Но неважно, как я звоню. Ошибка ocurrs, даже если я просто объявляю класс без вызова
Насколько мне известно, у вас не может быть ничего динамического при определении члена класса, однако вы можете установить его динамически, как показано ниже. Таким образом, вы не можете сделать это по той же причине, что вы не можете сделать это: public $A = functionname();
Кроме того, ваша сигнатура вызова была неправильной, я исправил ее в своем примере.
<?php class AA { public $A = array(); public function __construct() { $a = function() { echo 'Smth'; }; $this->A['echoSmth'] = $a; } } $t = new AA(); $t->A['echoSmth']();
Кроме того, вы можете определить весь массив в __construct()
, содержащий метод (так что в основном сдвиньте свой код).
Я получил это, чтобы работать. Не уверен, почему прямое объявление не разрешено.
class AA { var $A; public function __construct() { $this->A = array( 'echoSmth' => function(){ echo 'Smth'; } ); } } $t = new AA(); $t->A['echoSmth']();
EDIT: я также видел и исправлял $t->$a
сначала, но мне также нужно было переместить декларацию, чтобы она работала.
ну, это вроде работает …
<?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'](); ?>