Я имею в виду, у меня есть строка: "class cl{...}"
, и я хотел бы включить ее. Я знаю, что есть функция eval
, но это лучший способ сделать это?Можно ли включить строку?
ответ
Это зависит от того, почему у вас есть это как строка. От куда это?
Если пользователь создан, то есть пользовательский ввод, лучше не передавать его через eval. Пользователь может легко запускать любой код на вашем сайте!
Если вы прочитали это из файла и знаете, что это законно, просто используйте include
в этом файле. Но вы также можете использовать eval
. Просто важно, чтобы эта строка не была создана пользователем!
Ok можно использовать call_user_func динамически называть объект
namespace Foobar;
class Foo {
static public function test() {
print "Hello world!\n";
}
}
call_user_func(__NAMESPACE__ .'\Foo::test'); // As of PHP 5.3.0
call_user_func(array(__NAMESPACE__ .'\Foo', 'test')); // As of PHP 5.3.0
В вашем случае:
$obj = '\Foo';
$method = 'test';
call_user_func(array(__NAMESPACE__ .$obj, $method));
Это своего рода обычаем для пользователей PHP, чтобы задать этот вид вопросов: разработать некоторые необычные и ненадежный механизм, затем застрял с ним, а затем перейдите в Stack Overflow с вопросом. И у нас есть типичный XY problem с запахом неуверенности. И вонючий ответ, так как SO строго прямо в его ответах.
Почему вы должны иметь это с ног на голову: сначала задайте вопрос, а затем получите правильное решение для вашей реальной проблемы.
Не делайте этого! Эваль - это зло, и каждая функция (если таковая существует) обеспечивает аналогичную функцию и зло. – urzeit
Почему это определение класса в строке? – Jon
Я не могу придумать ни одной причины для этого. Не могли бы вы просветить меня? – vascowhite