Ответ 1
Вы не можете динамически добавлять методы в класс во время выполнения, период. *
PHP просто не очень утка-перфорированный язык.
* Без уродливые хаки.
Я пытаюсь динамически добавлять методы из внешних файлов.
Прямо сейчас у меня есть метод __call
в моем классе, поэтому, когда я вызываю метод, который я хочу, __call
включает его для меня; проблема в том, что я хочу вызвать загруженную функцию с помощью моего класса, и я не хочу, чтобы загруженная функция была вне класса;
Class myClass
{
function__call($name, $args)
{
require_once($name.".php");
}
}
echoA.php:
function echoA()
{
echo("A");
}
то я хочу использовать его как:
$myClass = new myClass();
$myClass->echoA();
Любые советы будут оценены.
Вы не можете динамически добавлять методы в класс во время выполнения, период. *
PHP просто не очень утка-перфорированный язык.
* Без уродливые хаки.
Вы можете динамически добавлять атрибуты и методы, предоставляя это через конструктор так же, как вы можете передать функцию в качестве аргумента другой функции.
class Example {
function __construct($f)
{
$this->action=$f;
}
}
function fun() {
echo "hello\n";
}
$ex1 = new class('fun');
Вы не можете вызвать directlry $ex1->action()
, он должен быть назначен переменной, а затем вы можете вызвать эту переменную как функцию.
Это то, что вам нужно?
$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();
Если я прочитал руководство справа, __call получает вызов insted функции, если функция dosn't существует поэтому вам, вероятно, нужно вызвать его после создания.
Class myClass
{
function __call($name, $args)
{
require_once($name.".php");
$this->$name($args);
}
}
То, на что вы ссылаетесь, называется перегрузкой. Прочитайте все об этом в Руководстве по PHP
Вы можете создать атрибут в своем классе: methods=[]
и используйте create_function для создания лямбда-функции.
Добавьте его в атрибут methods
, указав имя нужного метода.
используйте:
function __call($method, $arguments)
{
if(method_exists($this, $method))
$this->$method($arguments);
else
$this->methods[$method]($arguments);
}
чтобы найти и вызвать хороший метод.
Я разработал следующий пример кода и вспомогательный метод, который работает с __call
, который может оказаться полезным. https://github.com/permanenttourist/helpers/tree/master/PHP/php_append_methods