Подтвердить что ты не робот

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

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

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

echoA.php:

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

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

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

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

4b9b3361

Ответ 2

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

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

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

$ex1 = new class('fun');

Вы не можете вызвать directlry $ex1->action(), он должен быть назначен переменной, а затем вы можете вызвать эту переменную как функцию.

Ответ 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();

Ответ 4

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

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

Ответ 5

То, на что вы ссылаетесь, называется перегрузкой. Прочитайте все об этом в Руководстве по PHP

Ответ 6

Вы можете создать атрибут в своем классе: methods=[]
и используйте create_function для создания лямбда-функции.
Добавьте его в атрибут methods, указав имя нужного метода.
используйте:

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

чтобы найти и вызвать хороший метод.