在PHP中声明对class属性的闭包

时间:2014-08-07 14:42:00

标签: php object functional-programming closures

奇怪,我能做到

<?php

    $foo = function($a){
        return $a;
    };

var_dump($foo(123));

但是在一个classe的范围内如果做:

<?php

    class Totalizer{

        public $count;

        public function __construct(){
            $this->count = function($product){
                return  $product;
            };
        }

    }

    $foo = new Totalizer;
    var_dump($foo->count(123));

致命错误:调用未定义的方法Totalizer :: count()

我的问题是我怎么能像第一个片段那样做,但是在课堂范围内?

ps:PHP 5.5

3 个答案:

答案 0 :(得分:1)

PHP目前不允许直接调用存储为对象属性的函数。

它允许对象的属性和方法实际具有相同的名称。

此问题的一个suggested solution来自另一个几乎相同的问题

class Totalizer
{
    public $count;

    public function __construct()
    {
        $this->count = function ($product) {
            return  $product;
        };
    }

    public function __call($method, $args)
    {
        if (is_callable(array($this, $method))) {
            return call_user_func_array($this->$method, $args);
        } else {
            // else throw exception
        }
    }
}

答案 1 :(得分:0)

HI这可以通过使用__call魔术方法完成,它将绕过胎儿错误

当我们尝试访问某些未定义的方法时调用

__调用方法,我认为

它可能对你有帮助.......

类累加器 {

public $ count;

public function __construct()
{
    $this->count = function ($product) {
        return  $product;
    };
}

public function __call($method, $args)
{
    if ($method=="count") {

    } else {
        echo "Error ! method not foound!";
    }
}

}

$ foo = new累加器; 的var_dump($ foo-&GT;计数(123));

答案 2 :(得分:-2)

<?php
    class Totalizer{

        public function __construct(){
        }

        public function product( $count ) {
            if( is_int( $count ) )
                return $count;
            else
                return false;
        }

    }

$foo = new Totalizer;
var_dump($foo->product(123));