Я хочу вызвать свойство $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
Как я могу это исправить?
Здесь есть несколько проблем. Строка имени вашего метода содержит круглые скобки. Таким образом, вызов, такой как строковый метод, не будет работать.
Скажем, у вас есть $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
Конечно, может быть лучшее решение для извлечения аргументов, но это не на мой взгляд прямо сейчас. Важно знать, что вам нужно знать предопределенную структуру, которую пользователь может отправить вам как строку. И, обязательно, НЕ ИСПОЛЬЗОВАТЬ ЭВОЛЮЦИЮ :) Если вам действительно нужен вызов цельного объекта, отправленный как строка от пользователя, это оправдано, чтобы написать собственный синтаксический анализатор строк для него (например, мини-версию выше).
Почему так сложно? Я думаю, что вы больше ищете что-то подобное. В противном случае, пожалуйста, дайте мне знать объяснение больше, что вы хотите:
<?php
class test {
public $property = 5;
public function method() {
return $this->property;
}
}
$object = new test;
echo $object->method();
?>
Вывод:
5
echo $object->property;
так как его публика :)
Попробуй это
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);