Как добавить методы динамически

Я пытаюсь динамически добавлять методы из внешних файлов. Прямо сейчас у меня есть метод __call в моем классе, поэтому, когда я вызываю метод, который я хочу, __call включает его для меня; проблема в том, что я хочу вызвать загруженную функцию, используя мой класс, и я не хочу загружать функцию вне класса;

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

echoA.php:

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

то я хочу использовать его как:

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

Любые советы будут оценены.

Вы не можете динамически добавлять методы в класс во время выполнения, период. *
PHP просто не очень утомляющий язык.

* Без уродливых хаков .

если я прочитал руководство справа, то __call получит функцию insted функции, если функция dosn't не существует, поэтому вам, вероятно, нужно позвонить ей после ее создания

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

Вы можете динамически добавлять атрибуты и методы, предоставляя это через конструктор так же, как вы можете передать функцию в качестве аргумента другой функции.

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

То, что вы имеете в виду, называется перегрузкой . Прочтите все об этом в Руководстве по 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