是否可以向函数添加方法?
例如:
function func(){
;
}
//add method
func->test = function(){
;
}
func->test();
func();
我来自javascript背景,因此我已经习惯了“一切都是对象”.
编辑:
我只是在解释新phper可能经常产生的误解.我了解上述代码无效.
编辑2
弄清楚了.
class myfunc_class{
function __invoke(){
//function body
}
function __call($closure, $args)
{
call_user_func_array($this->$closure, $args);
}
}
$func = new myfunc_class;
$func->test = function(){
echo '
test
';
};
$func->test();
$func();
更加性感:)
class func{
public $_function;
function __invoke(){
return call_user_func_array($this->_function,func_get_args());
}
function __construct($fun){
$this->_function = $fun;
}
function __call($closure, $args)
{
call_user_func_array($this->$closure, $args);
}
}
$func = new func(function($value){
echo $value;
});
$func->method = function(){
echo '
test
';
};
$func('someValue');
$func->method();
解决方法:
否,因为对象是与函数不同的PHP语言构造.函数没有属性,而只是执行指令.
但是,如果func是预定义的类,那么是的…有点巫术,忽略了公众的强烈抗议,前述的可读性和PHP编码标准,并在__call() magic method中使用了closures …
class func
{
function __call($func, $args)
{
return call_user_func_array($this->$func, $args);
}
}
$obj = new func;
$obj->test = function($param1, $param2)
{
return $param1 + $param2;
};
echo $obj->test(1,1);
如果没有__call(),这将无法正常工作,因为通过$obj-> test(1,1),PHP认为您超出对象范围时正在尝试调用不存在的func方法.但是在内部,由于新的“ test”属性是一种类型:闭包,因此call_user_func_array()只是将“ test”属性视为另一个函数,因此您可以从外部范围中隐藏这一点技巧.
标签:php,methods
来源: https://codeday.me/bug/20191102/1991886.html