我正在尝试从外部文件动态添加方法。
现在我的课程中有__call
方法,所以当我调用我想要的方法时,__call
包含了它;问题是我想通过使用我的类调用加载函数,我不希望在类之外加载函数;
Class myClass
{
function__call($name, $args)
{
require_once($name.".php");
}
}
echoA.php:
function echoA()
{
echo("A");
}
然后我想用它:
$myClass = new myClass();
$myClass->echoA();
任何建议都将受到赞赏。
答案 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');
答案 7 :(得分:-3)
我已经编写了以下代码示例和一个与__call
一起使用的辅助方法,这可能非常有用。 https://github.com/permanenttourist/helpers/tree/master/PHP/php_append_methods