我需要类,我想将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
答案 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()
为避免这种情况,您无法直接调用它。