Pull to refresh

Comments 13

UFO just landed and posted this here
Мало-ли кому будет интересно, написал простой пример на codepad для для многомерного массива и сложного обьекта.
1) Извините, но это, как бы сказать по-мягче, глупость — сначала создавать DOM объект, а потом конвертировать его в simplexml/строку, который потом будет снова конвертирован в DOM.

2) Хм, ну не знаю — вообще то в DOMDocument::createElement ( string $name [, string $value ] ), под $value понимается текстовое значение, для добавления детей нужно использовать DOMNode->appendChild()

3) Наличие html_entity_decode от непонимания — см. предыдущий пункт.

4) Я бы с удовольствием оторвал вам руки за то, что функция std2simplexml при передаче одних агрументов возвращает SimpleXMLElement, а при других строку.

5) Охренеть, а зачем?!
$new_xml = str_replace(array('','',''),'',$new_xml);

Вывод: Говнокод. Выбросьте. Не позорьтесь.
SimpleXMLElement может быть полезен только в том случае, когда в вас уже есть XML строка, да и то только тем, что код будет немного короче.
Да, но насколько я понимаю XSLTProcessor::transformToXML принимает только DOMDocument, поправьте, если ошибаюсь. Или вы вы имеете в виду, что вместо него нужно было использовать DOMDocument?
Судя по документации:
string XSLTProcessor::transformToXML ( DOMDocument $doc )

Однако, в комментах есть пример и с SimpleXMLElement (http://php.net/manual/en/book.xsl.php) + да и ваш код его же принимает, разве нет?

> что вместо него нужно было использовать DOMDocument?
В данном случае да.

6) У вас создается новый DOMDocument при каждом вызове функции. Зачем?
Если бы я не позорился, уважаемый DeusModus не смог бы указать мне на XMLSerializer.

Насчет 5-го пункта, там видимо раньше было что-то более осмысленное, упустил из виду.

Насчет 4-го пункта, что вы увидели в этом такого криминального (нет, я серьезно, объясните)? По задумке строка должна была возвращаться только в случае рекурсии, а второй аргумент передавать только внутри функции.
> Если бы я не позорился, уважаемый DeusModus не смог бы указать мне на XMLSerializer.
Опыта у вас мало? Я прав?

> Насчет 4-го пункта, что вы увидели в этом такого криминального (нет, я серьезно, объясните)?
В этом то и проблема, при поддержке это боком выйдет, т.к. название и поведение этой функции подразумевает получение SimpleXMLElement. Пройдет время и кому то понадобится получить SimpleXMLElement, но без вложенных элементов — вот радости то ему привалит…

— Наиболее логично функция выглядела бы так (псевдо код):
/**
* @param mixed $object конвертируемый объект
* @param bool $recursive нужно ли обрабатывать вложенные элементы?
* @param DOMNode $parent родительский узел
*
* @return DOMNode
*/
function convertToDom($object, $recursive, $parent = null);

// 1
$node = convertToDom($object, true, new DOMDocument()); // DOMDocument
$html = (new XSLTProcessor())->transformToXML($node);

// 2
$node = convertToDom($object, true); // DOMNode
$html = (new XSLTProcessor())->transformToDoc($node)->saveXML();
Смотря что называть опытом, и смотря с чьим опытом сравнивать.
Говнокодом занимаюсь уже больше двух лет, о php впервые услышал где-то 2,5 года назад. Но судя по всему да, опыта у меня мало.

Насчет второго аргумента понял, спасибо.
Это должны быть разные функции, не должен у функции тип результата зависеть от параметра, это слишком неочевидно. Более того, булевские флаги в функции говорят о том, что она делает больше одного дела, следовательно ее надо разбивать на несколько простых.
Sign up to leave a comment.

Articles