Почему функция как элемент массива в классе php не работает - PullRequest
5 голосов
/ 30 апреля 2011

Например, у меня такой код:

<?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 Извините, я допустил некоторые ошибки в способе вызова метода, я спешил.Но не важно, как я позвоню.Возникает ошибка, даже если я просто объявляю класс без вызова

Ответы [ 3 ]

3 голосов
/ 30 апреля 2011

Насколько я знаю, вы не можете иметь ничего динамического при определении члена класса, однако вы можете установить его динамически, как показано ниже.В общем, вы не можете сделать это по той же причине, по которой вы не можете сделать это: 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(), содержащий метод (поэтому, в основном, сдвиньте ваш код).

2 голосов
/ 30 апреля 2011

Я получил это на работу. Не уверен, почему прямое объявление не разрешено.

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

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

РЕДАКТИРОВАТЬ: Я также сначала увидел и исправил $t->$a, но мне нужно было также перенести объявление, чтобы оно заработало.

1 голос
/ 30 апреля 2011

ну, это вроде как работает ...

<?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']();

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...