PHP向函数添加方法


PHP add methods to Functions

是否可以将方法添加到函数中?

例如:

<?
function func(){
    ;
}
//add method
func->test = function(){
    ;
}
func->test();
func();

我来自javascript背景,因此我习惯于"一切都是对象"。

编辑:

我只是在解释对新php的误解可能来自哪里。我知道上面的代码不起作用。

编辑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 '<br>test<br>';
};
$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 '<br>test<br>';
};
$func('someValue');
$func->method();

否。

并非所有东西都是PHP中的对象。事实上,唯一的物体就是物体。更具体地说,通常是一个类的实例化。

您的代码已转换为PHP

// function_object.php
<?php
class FunctionObject {
   public method func() {
       // do stuff
   }
}
?>

在其他代码中,你会这样使用它:

<?php
// example.php in same folder as function_object.php
include 'function_object.php';
$FuncObj = new FunctionObject;
$FuncObj->func();

另外:阅读更多关于PHP的内容;OOP

否,因为对象与函数是不同的PHP语言构造。函数没有属性,而只是执行指令。

但是,如果func是一个预定义的类,那么是的。。。有点巫术,无视公众的强烈抗议,放弃可读性和PHP编码标准,并通过使用__call()魔术方法的闭包。。。

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"属性视为另一个函数,因此您可以在外部范围内隐藏这一点技巧。

您需要函数func()来返回一个对象,然后您可以执行以下操作:func()->test();

但请注意,您处理对象的方式在PHP中并不正确,我建议您阅读这里的OO文档。

与javascript不同的是,在PHP中并不是所有东西都是对象。因此,您需要区分函数和类。

如果您想创建一个对象,您需要首先定义类。

class myClass {
}

然后,您可以根据需要向类中添加任意数量的函数。但您需要首先定义它们:

class myClass {
  function test() {
    echo "test!'n";
  }
}

当一切都准备好了,你就可以把它变成现实:

$class = new myClass;
$class->test();

查看手册了解更多信息。

您不能做您想做的事情,但您可以在其他函数中定义函数。

此示例输出文本:

function a() {
    function b() { echo 'Hi'; }
}
a();
b();
Output: HiHi

此示例输出错误:

function a() {
    function b() { echo 'Hi'; }
}
b();
Output: ERROR