为什么在PHP类中作为数组项的函数不起作用

5
例如,我有这样的一段代码:

<?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

?>

为什么它无法工作? 它显示: 解析错误:语法错误,意外的T_FUNCTION 附注:对不起,我在调用方法时犯了一些错误,我很匆忙。但是,无论我如何调用,都会出现错误,即使我只是声明类而没有调用。

2
尝试运行 $t->a'echoSmth';,但不要加美元符号。 - usoban
3
大写字母 A。 - Marcel Korpel
@marcel 对,我看的是最后一行,a 是小写。我的错 :) - usoban
是的,我在调用函数时犯了错误。但我忘了说,当描述类时会出现错误。如果不调用它也会出现错误。 - Larry Foobar
3个回答

3
据我所知,当定义类成员时,您无法设置任何动态内容,但是您可以像下面一样动态设置它。因此,基本上,您不能这样做的原因与您不能执行此操作的原因相同: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
我已经让它工作了。不确定为什么不允许直接声明。
class AA {
    var $A;
    public function __construct() {
        $this->A = array(
            'echoSmth' => function(){
                echo 'Smth';
            }
        );
    }
}

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

编辑:我也注意到并纠正了$t->$a,但我还需要移动声明才能使其正常工作。


2
他犯了一个错误,他使用的是 $t->$a 而不是 $t->a。你的代码是正确的,只是 OP 没有。这里没有 PHP 问题,只是在访问成员时犯了一个简单的错误。 - Michael J.V.
1
@Michael 不正确,定义 $A 值时定义闭包存在解析错误(但是没错,那是一个错误)。 - Rudi Visser
@Michael 是的,当我第一次看它时,我也是这么想的,但我的回答中已经解释了原因! :-) - Rudi Visser
@Michael J.V. 我试图修复的错误与我的代码中的错误无关($t->$a而不是$t->A)。我已经修复了它们,但还有另一个错误 - 解析错误。这个解析错误正困扰着我。我发现,在__construct函数中它可以正常工作。是否可能在不填充__construct方法中的数组的情况下使其正常工作? - Larry Foobar
@Innuendo 你可以用另一种方法来实现。唯一不能做的事情(就像我的回答中所说)是动态地分配给类成员变量。任何动态分配都必须在运行时完成。 - Rudi Visser
显示剩余4条评论

1

嗯,它有点能用...

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

?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接