PHP DOM Builder API 2.0
- Core\Element\Double
- Core\Element\DoubleBlock
- Core\Element\DoubleInline
- Core\Element\Field
- Core\Element\Root
- Core\Element\Single
- Element\A
- Element\Abbr
- Element\Address
- Element\Area
- Element\Article
- Element\Aside
- Element\Audio
- Element\B
- Element\Base
- Element\Bdi
- Element\Bdo
- Element\Blockquote
- Element\Body
- Element\Br
- Element\Button
- Element\Canvas
- Element\Caption
- Element\Cite
- Element\Code
- Element\Col
- Element\Colgroup
- Element\Command
- Element\Datalist
- Element\Dd
- Element\Del
- Element\Details
- Element\Dfn
- Element\Div
- Element\Dl
- Element\Dt
- Element\Em
- Element\Embed
- Element\Fieldset
- Element\Figcaption
- Element\Figure
- Element\Footer
- Element\Form
- Element\H1
- Element\H2
- Element\H3
- Element\H4
- Element\H5
- Element\H6
- Element\Head
- Element\Header
- Element\Hgroup
- Element\Hr
- Element\Html
- Element\I
- Element\Iframe
- Element\Img
- Element\Input
- Element\Ins
- Element\Kbd
- Element\Keygen
- Element\Label
- Element\Legend
- Element\Li
- Element\Link
- Element\Map
- Element\Mark
- Element\Menu
- Element\Meta
- Element\Meter
- Element\Nav
- Element\Noscript
- Element\Object
- Element\Ol
- Element\Optgroup
- Element\Option
- Element\Output
- Element\P
- Element\Param
- Element\Pre
- Element\Progress
- Element\Q
- Element\Rp
- Element\Rt
- Element\Ruby
- Element\S
- Element\Samp
- Element\Script
- Element\Section
- Element\Select
- Element\Small
- Element\Source
- Element\Span
- Element\Strong
- Element\Style
- Element\Sub
- Element\Summary
- Element\Sup
- Element\Table
- Element\Tbody
- Element\Td
- Element\Textarea
- Element\Tfoot
- Element\Th
- Element\Thead
- Element\Time
- Element\Title
- Element\Tr
- Element\Track
- Element\U
- Element\Ul
- Element\Variable
- Element\Video
- Element\Wbr
Представлена глобальная версия проекта Baigudin Software
Сегодня проект Baigudin Software был представлен в английской глобальной редакции и всегда доступен по адресу www.baigudin.software/en/.
Оптимизация исходного кода
«Если ты что-то написал и это работает, то лучше задержать дыхание и не дышать – пусть работает». Хорошее утверждение, но если это работает, но медленно или не гибко? Приходится оптимизировать, затем отлаживать и ещё раз тестировать. Понятно, что компромисс между удобством и быстродействием порой найти не так просто. Но о нем стоит задуматься на этапе проектирования, и будущее будет проще.
Оптимизация выборки
Основное правило, которое необходимо запомнить – это то, что результаты поиска не кэшируются. Запрашивая поиск в пределах любой ветки дерева, вы начинаете проходить её снова и снова. Поэтому, чем меньше ветка, тем быстрее поиск.
Лучше сохранять результаты поиска во временные переменные:
<?php
// Плохо
$document->find('a')->addClass('link');
$document->find('a')->attr('href', 'baigudin.software');
// Хорошо
$node = $document->find('a')->addClass('link');
$node->attr('href', 'baigudin.software');
?>
Можно использовать цепочки вызовов:
<?php
// И так хорошо
$document->find('a')->addClass('link')->attr('href', 'baigudin.software');
?>
Обрезаем дерево до веток «div.article»:
<?php
// Плохо
$document->find('div.article h2');
$document->find('div.article a');
// Хорошо
$node = $document->find('div.article');
$node->find('h2');
$node->find('a');
?>
Индексирование узлов
Каждому объекту класса ElementNode можно присвоить строковый индекс (ключ), вызвав метод key. Данный ключ при создании списка узлов будет ассоциирован с порядковым номером узла в данном списке. Таким образом, при выборке узла мы можем запросить его по его ключу.
<?php
use DomBuilder\Element as Element;
// Создаём документ
$document = Element::create()
->insert('html')
->insert('head')
->after('body')->root();
// Создаём пустой список
$list = Element::newList();
// Добавляем в список узлы с ключами
$list->push( Element::create('h1')->html('Заголовок')->key('header') );
$list->push( Element::create('p')->html('Текст') )->key('text');
// Добавляем узлы из списка в документ по их ключу
$document->find('body')
->insert( $list->get('header') )
->after( $list->get('text') );
// Выводим документ
echo Element::getDocument($document);
?>
Здесь стоит отметить, что присвоение ключа узлу можно выполнить как на стадии формирования самого узла, так и при добавлении его в список. Вызов метода key у объекта ElementList приведёт к присвоению переданного ключа последнему добавленному узлу.
Функционал библиотеки не следит за уникальностью ключа. Ключ необходим лишь для ассоциации узла в списке. Таким образом, если в список будут добавлены два узла с одинаковыми ключами, то ассоциирован будет последний добавленный.
Мы рассмотрели несколько простых путей, что бы приложения были быстрее и вразумительнее при их поддержке. В следующей статье мы продолжим обсуждения об оптимизации и поговорим о многоязыковой поддержке.