Pass Method形成不同的类,以便稍后执行到第二个类

时间:2016-11-18 15:18:33

标签: php

我需要类,我想将classA中的方法传递给classB构造函数并将其存储在classB实例变量中,以便稍后执行。



    class A
    { 
        public function execute()
        {
            $ClassB = new ElgEmpAnalyticsImporterControllerImporterEmporioOrder(ConMW::getDB(), $this -> lPointFile, [$this, 'getLastPoints'] );
            $ClassB -> import();   
        }

        public function getLastPoints(Array $keys)
        {
            $res = [];
            forEach ( json_decode( file_get_contents($this -> lastPointFile) ) as $key => $value ):
                if ( in_array($key, $keys) ):
                    $res[$key] = $value;
                else:
                    $res[$key] = '';
                endif;
            endforeach;
            unset($key);
            unset($value);
            return $res;
        }

    }


    classB
    { 
        public $getLastPoints = null;

        public function __construct(callable $getLastPoints) 
        {
            $this -> getLastPoints =  $getLastPoints;
        }

        public function import()
        {
            $lastPoints = $this -> getLastPoints(['idOrder', 'orderLastExport']);              
        }
    }

尝试执行它,就像我得到错误“调用未定义的方法getLastPoints()”

我认为问题在于将函数存储在classB的实例变量$ getLastPoints上。我可以得出结论,因为如果我在构造函数上执行函数它就可以了。这意味着如果我像这样更改classB的构造函数



    classB
    { 
        public $getLastPoints = null;

        public function __construct(callable $getLastPoints) 
        {
            $getLastPoints(['idOrder', 'orderLastExport']);
        }


    }

它有效。

但我需要的是在导入函数中执行外部函数。

有人可以帮帮我吗?

谢谢你的时间,

编辑以澄清:我的问题是为什么我可以在这样的构造函数中执行函数:

$lastPoint(a,b)

但是当我将callable分配给这样的实例变量时:

$this -> lastPoint(a,b)

它不起作用。

我读到php使用不同的存储空间来处理变量和函数。 PHP可能会将可调用的$ lastPoints视为变量。那么可调用的$ lastPoints可以作为动态函数添加到我的classB实例吗?

Christoforos

1 个答案:

答案 0 :(得分:0)

PHP Callable Object as Object Member

$ getlastpoints是一个存储在其中的数组值的属性,而不是函数。 call_user_func_array($ this-> getlastpoints,['idOrder','orderLastExport']);

public function import()
    {
        $my_func = $this->getLastPoints;
        $lastPoints = $my_func(['idOrder', 'orderLastExport']);              
    }

简而言之,您必须这样做的原因是因为您可以在具有相同名称的PHP类中定义属性和方法。 e.g。

class foo {
  public $bar
  public function bar() {}
}

所以在这种情况下,如果允许直接访问$ bar属性中存储的callable ...下面的调用会引用什么?

$my_foo_obj->bar()  

为避免这种情况,您无法直接调用它。