Как вызывать динамические методы в php?

0

Я хочу вызвать свойство $property с $method подобно этому коду:

class test
{
    public $property= 5;
    public function method()
    {
        return $this;
    }
}

$text = 'method().property';
$array = explode('.', $text);
$tt = implode('->', $array);
$object = new test;
echo $object->$tt;

но эта ошибка возвращена:

Примечание. Неопределенное свойство: свойство test :: $ method() → в /var/www/html/test2.php в строке 16

Как я могу это исправить?

  • 0
    Не делая две вещи одновременно. Выберите, что вы хотите сделать: вызвать метод или прочитать свойство
  • 0
    Почему так сложно?
Показать ещё 2 комментария
Теги:

3 ответа

0

Здесь есть несколько проблем. Строка имени вашего метода содержит круглые скобки. Таким образом, вызов, такой как строковый метод, не будет работать.

Скажем, у вас есть $method = 'myMethod()'; если вы попробуете $obj->$method(); он будет кричать на неопределенный метод myMethod()(). Если вы оставите его $obj->$method он не найдет свойство с этим именем.

Самое простое решение - избавиться от круглых скобок с помощью некоторой предопределенной логики (потому что позже вам могут понадобиться аргументы, а?);

Первое решение... просто удалите их...:

class test
{
    public $property= 5;
    public function method()
    {
        return $this;
    }
}

$text = 'method().property';
$array = explode('.', $text);
$array[0] = str_replace("()", "", $array[0]);

$test = new test();
echo $test->$array[0]()->$array[1];

Здесь вывод равен 5.

Однако, я думаю, вы можете ожидать от пользовательского method(arg1, arg2).property. Затем:

class test
{
    public $property= 5;
    public function method($a, $b)
    {
        $argsProduct = $a*$b;
        $this->property += $argsProduct;
        return $this;
    }
}

$text = 'method(2, 6).property';
$array = explode('.', $text);

$array[0] = str_replace(["(", ")", ","], " ", $array[0]);
$array[0] = preg_split("/\\s+/", $array[0]);

$args = array_slice($array[0], 1, count($array[0])-1, true);

$test = new test();
echo call_user_func_array(array($test, $array[0][0]), $args)->$array[1];

Выход: 17;//2 * 6 = 12; 12 + 5 = 17 17;//2 * 6 = 12; 12 + 5 = 17

Конечно, может быть лучшее решение для извлечения аргументов, но это не на мой взгляд прямо сейчас. Важно знать, что вам нужно знать предопределенную структуру, которую пользователь может отправить вам как строку. И, обязательно, НЕ ИСПОЛЬЗОВАТЬ ЭВОЛЮЦИЮ :) Если вам действительно нужен вызов цельного объекта, отправленный как строка от пользователя, это оправдано, чтобы написать собственный синтаксический анализатор строк для него (например, мини-версию выше).

0

Почему так сложно? Я думаю, что вы больше ищете что-то подобное. В противном случае, пожалуйста, дайте мне знать объяснение больше, что вы хотите:

<?php

    class test {
        public $property = 5;

        public function method() {
            return $this->property;
        }


    }

    $object = new test;
    echo $object->method();

?>

Вывод:

5
  • 2
    Хорошо, если вы скажете «почему так сложно» ==> echo $object->property; так как его публика :)
  • 0
    @ DarkBee Да, ты прав! Но я думаю, что OP хочет вызвать свойство с функцией, поэтому у меня все еще есть функция в ответе
Показать ещё 4 комментария
-2

Попробуй это

class test
{
  public $property= 5;
  public function method()
  {
    return $this->property;
  }
}

$object = new test;
$text = $object->method();
$array = explode('.', $text);
$tt = implode('->', $array);
print_r($tt);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню