PHP为函数添加方法

时间:2011-06-21 01:08:15

标签: php methods

是否可以向函数添加方法?

例如:

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

func->test();
func();

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

编辑:

我只是在解释新词的误解可能来自何处。我理解上面的代码不起作用。

编辑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();

5 个答案:

答案 0 :(得分:3)

没有

并非所有东西都是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();

另外:read more about PHP & OOP

答案 1 :(得分:1)

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

但是,如果func是一个预定义的类,那么是......带有一点巫术,忽略公众的强烈抗议,提高可读性和PHP编码标准,并使用closures __call() magic method ...

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"属性看作另一个函数,所以你可以从外面隐藏这一点诡计范围。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

与javacript不同,在PHP中并非所有东西都是对象。因此,您需要在功能和类别之间有所不同。

如果要创建对象,则需要先定义该类。

class myClass {
}

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

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

当一切准备就绪时,你可以把它变为现实:

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

Checkout the manual for more

答案 4 :(得分:0)

你无法做你想做的事,但你可以在其他功能中定义功能。

此示例输出文字:

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

此示例输出错误:

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