Можно ли написать функцию PHP в XML?
<doThis> doThis(){ bang bang bang! } </doThis>
и используйте simplexml_load_file
чтобы получить объект с этой функцией?
$foo = simplexml_load_file($xmlAbove); $foo->doThis(); //bang bang bang!
Во-первых, вы всегда должны учитывать последствия для безопасности запуска «кода». Если этот XML-файл имеет отдаленное происхождение, и вы выполняете код, он может сделать что угодно. Как насчет exec(rm -fR /some/important/path);
? Или вызов базы данных, который удаляет все? Должны быть очень сильные доверительные отношения между отправителем и вашим кодом, а также сильные протоколы безопасности, чтобы предотвратить атаки «человек в середине» и другие атаки.
На ваш вопрос это невозможно напрямую. Как отмечалось, XML – это данные, а не код, и должен быть переносимым, что означает, что ваш PHP-код будет излишним для другого клиента, принимающего этот XML.
Однако вы можете использовать eval
. Может быть, вот так:
eval($foo->doThis);
Примечание. Я бы не рекомендовал это вообще. Это не намеренное использование XML, и у него много проблем. Пожалуйста, подумайте о другом.
XML поддерживает внедрение так называемых инструкций по обработке (PI) , допустимый XML может выглядеть так:
<doThis><?php doThis() { bang bang bang! } ?></doThis>
который очень похож на то, что вы знаете на языке PHP. Однако поддержка означает только то, что вы можете поместить в нее инструкции обработки, но обработка этих инструкций не связана с бизнесом XML.
Кроме того, анализатор XML, который вы используете – SimpleXML, не имеет специальной поддержки для обработки инструкций. Вместо этого вы можете использовать DOMDocument . Так много со стороны XML.
Для стороны PHP у вас возникла проблема в том, что вы каким-то образом определяете функцию, когда хотите ее называть. Также код PHP недействителен в других частях (возможно, потому, что вы просто собрали быстрый вопрос). Может быть, это лучше:
<doThis><?php function doThis() { return 'bang bang bang!'; } ?></doThis>
С помощью небольшого анализатора, основанного на DOM (здесь называется PiDOMDocument
), это можно превратить в класс / объект:
$doc = new PiDOMDocument(); $doc->loadXML($xml); $obj = $doc->getObject(); echo $obj->doThis();
Результатом echo
в последней строке будет:
bang bang bang!
(quelle удивление). Вы можете внутренне отобразить это в SimpleXMLElement, чтобы упорядочить это в свой пример кода выше:
$foo = simplexml_load_string($xml, 'PiSimpleXMLElement'); echo $foo->doThis(); //bang bang bang!
Это работает так:
/** * SimpleXMLElement integration of PiDOMDocument */ class PiSimpleXMLElement extends SimpleXMLElement { public function __call($name, $args) { $doc = new PiDOMDocument(); $doc->loadXML($this->asXML()); $callback = array($doc->getObject(), $name); return call_user_func_array($callback, $args); } }
В качестве процессора PHP вы можете использовать eval
или include
( что в принципе одинаково ). PHP выполняется напрямую, поэтому, если ваш код имеет фатальные ошибки синтаксического анализа, общий скрипт имеет фатальные ошибки, если вам не нравится это поведение по умолчанию PHP, вы можете проанализировать строку перед ее вычислением для таких ошибок, см. Также token_get_all()
и этот пример или этот пример .
Я выбрал unvalidated eval
в своем онлайн-демонстрационном / примерном коде как сущность .