如何动态添加方法

时间:2011-08-11 13:13:28

标签: php class

我正在尝试从外部文件动态添加方法。 现在我的课程中有__call方法,所以当我调用我想要的方法时,__call包含了它;问题是我想通过使用我的类调用加载函数,我不希望在类之外加载函数;

Class myClass
{
    function__call($name, $args)
    {
        require_once($name.".php");
    }
}

echoA.php:

function echoA()
{
    echo("A");
}

然后我想用它:

$myClass = new myClass();
$myClass->echoA();

任何建议都将受到赞赏。

8 个答案:

答案 0 :(得分:13)

您无法在运行时,期间动态地向类添加方法。*
PHP根本不是一种非常duck-punchable的语言。

*没有ugly hacks

答案 1 :(得分:3)

您可以通过构造函数动态添加属性和方法,就像将函数作为另一个函数的参数传递一样。

class Example {
    function __construct($f)
    {
       $this->action=$f;
    }
}

function fun() {
   echo "hello\n";
}

$ex1 = new class('fun');

您无法调用directlry $ex1->action(),必须将其分配给变量,然后您可以像调用函数一样调用此变量。

答案 2 :(得分:3)

这是你需要的吗?

$methodOne = function ()
{
    echo "I am  doing one.".PHP_EOL;
};

$methodTwo = function ()
{
    echo "I am doing two.".PHP_EOL;
};

class Composite
{
    function addMethod($name, $method)
    {
        $this->{$name} = $method;
    }

    public function __call($name, $arguments)
    {
        return call_user_func($this->{$name}, $arguments);
    }
}


$one = new Composite();
$one -> addMethod("method1", $methodOne);
$one -> method1();
$one -> addMethod("method2", $methodTwo);
$one -> method2();

答案 3 :(得分:2)

如果我读了正确的手册, 如果函数不存在,则__call将被称为函数的 insted 所以你在创建它之后需要调用它

Class myClass
{
    function __call($name, $args)
    {
        require_once($name.".php");
        $this->$name($args);
    }
}

答案 4 :(得分:0)

您所指的是重载。在PHP Manual

中阅读所有相关内容

答案 5 :(得分:0)

您可以在班级中创建一个属性:methods=[]
并使用create_function创建lambda函数 将它存储在methods属性中,位于所需方法名称的索引处 使用:

function __call($method, $arguments)
{
   if(method_exists($this, $method))
      $this->$method($arguments);
   else
      $this->methods[$method]($arguments);
}

找到并称呼好方法。

答案 6 :(得分:0)

/**
 * @method Talk hello(string $name)
 * @method Talk goodbye(string $name)
 */
class Talk {
    private $methods = [];
    
    public function __construct(array $methods) {
        $this->methods = $methods;
    }
    
    public function __call(string $method, array $arguments): Talk {
        if ($func = $this->methods[$method] ?? false) {
            $func(...$arguments);
            
            return $this;
        }
        
        throw new \RuntimeException(sprintf('Missing %s method.'));
    }
}

$howdy = new Talk([
    'hello' => function(string $name) {
        echo sprintf('Hello %s!%s', $name, PHP_EOL);
    },
    'goodbye' => function(string $name) {
        echo sprintf('Goodbye %s!%s', $name, PHP_EOL);
    },
]);

$howdy
    ->hello('Jim')
    ->goodbye('Joe');

https://3v4l.org/iIhph

答案 7 :(得分:-3)

我已经编写了以下代码示例和一个与__call一起使用的辅助方法,这可能非常有用。 https://github.com/permanenttourist/helpers/tree/master/PHP/php_append_methods