Я пытаюсь динамически добавлять методы из внешних файлов. Прямо сейчас у меня есть метод __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