Спецификация и функции DOM в PHP


Оглавление (нажмите, чтобы открыть):

Основы DOM

(Document Object Model)

Наиболее широко применяемы XML-расширением на сегодняшний день является DOM и simpleXML, оба из них были добавлены в 5 версии PHP. Кроме данных XML-расширений также применяются XML (XML-парсер) и DOMXML, однако эти технологии считаются устаревшими.

Работа с DOM осуществляется в объектно-ориентированном стиле. Для начала работы с ним нужно создать объект domDocument. На практике это выглядит примерно так:

$dom_xml = new DomDocument;

При создании нового объекта domDocument вызывается конструктор DOMDocument=>__construct, имеющий два необязательных аргумента, которые указывают на версию документа и его кодировку

_ _construct ([string version [, string encoding]])

После создания нового объекта domDocument необходимо загрузить данные. Осуществляется это при помощи методов DOMDocument->load() и DOMDocuтeпt->loadXML() , в первом случае данные загружаются из файла, а во втором из строки. На практике это выглядит примерно так:

//Загрузка данных из файла с явным указанием экземпляра класса:

$dom_xml = new DomDocument;
$dom_xml->load(‘file.xml‘);

//Загрузка данных из файла без явного указания экземпляра класса:

$dom_xml=DomDocument:: load(‘file.xml’);

//Загрузка данных из строки с явным указанием экземпляра класса:

$dom_xml = new DomDocument;
$dom_xml->loadXML(‘ volvo ‘);

//Загрузка данных из строки без явного указания экземпляра класса:

$dom_xml = DomDocument::lоаdХМL(‘ volvo ‘);

Если загрузка данных прошла успешно, то будет возвращено TRUE, если нет, то FALSE

После того как данные загружены чаще всего осуществляется разбор их. Осуществить это можно при помощи метода DomDocument->getElementsByTagName(). Этот метод возвращает коллекцию объектов DOMNode.

$dom_xml= new DomDocument();
$dom_xml->loadXML(‘ volvo Lada ‘);
//записываем название модели в переменную

Foreach ($mod as $element) <
echo $element->nodeValue.» «.$element->nodeName.» «.’
‘;
>
?>

volvo model
Lada model

Основные свойства объекта DOMNode

nodeValue Возвращает значения узлов childNodes Возвращает дочерние узлы для текущего узла firstChild Возвращает верхний (первый) дочерний узел lastChild Возвращает последний дочерний узел

Основные методы объекта DOMNode

removeChild() hasChildNodes() Осуществляет проверку на дочерние узлы appendChild() Добавляет элемент replaceChild() Замещает узел hasAttributes() Проверка атрибутов

Примеры работы с DOM можно увидеть на следующих страницах:

Использование DOM-функций

21.10.2010, 15:30

Использование include и функций работы с каталогами
Проблема следующая! Фаил index.php подгружает из каталога inc фаил 1.php таким образом: .

Использование объекта mysqli из глобальной области внутри функций
использую mysqli за место mysql иначе скрипт кричит что mysql устарело, подключаю таким образом .

Уместное использование preg_ функций
Доброго времени суток. Допустим есть строка «Hello,CyberForum». И мне нужно получить значение.

XXV. Функции DOM XML

Это расширение является ЭКСПЕРИМЕНТАЛЬНЫМ. Поведение этого расширения, имена его функций и всё, что задокументировано, может измениться в последующих релизах РНР без предупреждения. Вы предупреждены и можете использовать это расширение только под вашу ответственность.

Расширение domxml может быть переопределено в версии PHP 4.3.0 в пользу лучшего соответствия стандарту DOM. В этом расширении всё ещё имеются некоторые старые функции, но они более не должны использоваться. Особо нужно исключить не-объектно-ориентированные функции.

Это расширение позволяет работать с XML-документами с помощью DOM API. Оно также предоставляет функцию domxml_xmltree() для включения всего XML-документа в дерево PHP-объектов. В настоящее время это дерево должно считаться read-only — вы можете его модифицировать, но это не имеет смысла, поскольку DomDocument_dump_mem() не может быть применена. Следовательно, если вы хотите читать XML-файл и записывать модифицированную его версию, используйте функции DomDocument_create_element() , DomDocument_create_text_node() , set_attribute() , etc. и в конце — DomDocument_dump_mem() .

Это расширение использует GNOME xml-библиотеки. Загрузите и установите эту библиотеку. Вам понадобится как минимум версия libxml-2.2.7.

Это расширение доступно, если PHP был сконфигурирован с опцией —with-dom=[DIR] .

Имеются некоторые функции, которые не вписываются стандарт DOM и не должны поэтому использоваться; они перечислены в следующей таблице. Функция DomNode_append_child() изменила поведение. Она добавляет теперь потомка, а не родственника. Если это нарушает работу вашего приложения, используйте не-DOM-функцию DomNode_append_sibling() .

Таблица 1. Не рекомендуемые функции и замены для них

Предупреждение!
Старая функция Новая функция
xmldoc domxml_open_mem()
xmldocfiel domxml_open_file()
domxml_new_xmldoc domxml_new_doc()
domxml_dump_mem DomDocument_dump_mem()
domxml_dump_mem_file DomDocument_dump_file()
DomDocument_dump_mem_file DomDocument_dump_file()
DomDocument_add_root DomDocument_create_element() с последующей DomNode_append_child()
DomDocument_dtd DomDocument_doctype()
DomDocument_root DomDocument_document_element()
DomDocument_children DomNode_child_nodes()
DomDocument_imported_node Замены нет.
DomNode_add_child Создать новый узел с помощью, например, DomDocument_create_element() и добавить его функцией DomNode_append_child() .
DomNode_children DomNode_child_nodes()
DomNode_parent DomNode_parent_node()
DomNode_new_child Создать новый узел с помощью, например, DomDocument_create_element() и добавить его функцией DomNode_append_child() .
DomNode_set_content Создать новый узел с помощью, например, DomDocument_create_text_node() и добавить его функцией DomNode_append_child() .
DomNode_get_content Содержимое является просто текстовым узлом, и доступ к нему может быть получен с помощью DomNode_child_nodes() .
DomNode_set_content Содержимое является просто текстовым узлом и может добавлено с помощью DomNode_append_child() .

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

Таблица 2. XML-константы

Константа Значение Описание
XML_ELEMENT_NODE ( integer ) 1 Узел является элементом
XML_ATTRIBUTE_NODE ( integer ) 2 Узел является атрибутом
XML_TEXT_NODE ( integer ) 3 Узел является блоком текста
XML_CDATA_SECTION_NODE ( integer ) 4
XML_ENTITY_REF_NODE ( integer ) 5
XML_ENTITY_NODE ( integer ) 6 Узел является мнемоникой вроде
XML_PI_NODE ( integer ) 7 Узел является инструкцией процессинга
XML_COMMENT_NODE ( integer ) 8 Узел является комментарием
XML_DOCUMENT_NODE ( integer ) 9 Узел является документом
XML_DOCUMENT_TYPE_NODE ( integer ) 10
XML_DOCUMENT_FRAG_NODE ( integer ) 11
XML_NOTATION_NODE ( integer ) 12
XML_GLOBAL_NAMESPACE ( integer ) 1
XML_LOCAL_NAMESPACE ( integer ) 2
XML_HTML_DOCUMENT_NODE ( integer )
XML_DTD_NODE ( integer )
XML_ELEMENT_DECL_NODE ( integer )
XML_ATTRIBUTE_DECL_NODE ( integer )
XML_ENTITY_DECL_NODE ( integer )
XML_NAMESPACE_DECL_NODE ( integer )
XML_ATTRIBUTE_CDATA ( integer )
XML_ATTRIBUTE_ID ( integer )
XML_ATTRIBUTE_IDREF ( integer )
XML_ATTRIBUTE_IDREFS ( integer )
XML_ATTRIBUTE_ENTITY ( integer )
XML_ATTRIBUTE_NMTOKEN ( integer )
XML_ATTRIBUTE_NMTOKENS ( integer )
XML_ATTRIBUTE_ENUMERATION ( integer )
XML_ATTRIBUTE_NOTATION ( integer )
XPATH_UNDEFINED ( integer )
XPATH_NODESET ( integer )
XPATH_BOOLEAN ( integer )
XPATH_NUMBER ( integer )
XPATH_STRING ( integer )
XPATH_POINT ( integer )
XPATH_RANGE ( integer )
XPATH_LOCATIONSET ( integer )
XPATH_USERS ( integer )
XPATH_NUMBER ( integer )

API этого модуля следует, насколько возможно, стандарту DOM Level 2. Поэтому данный API является полностью объектно-ориентированным. Хорошо было бы иметь доступ к стандарту DOM при использовании этого модуля. Хотя данный API является объектно-ориентированным, имеется много функций, которые можно вызывать не-объектно-ориентированным путём с помощью передачи объекта, с которым работают, как первого аргумента. Эти функции в основном предназначены для сохранения совместимости со старыми версиями расширения, но больше не рекомендуются для использования в новых разработках.

Этот API отличается от официального DOM API двумя вещами. Во-первых, все атрибуты класса реализованы как функции с тем же именем, а во-вторых — имена функций следую соглашению PHP по именованию. Это значит, что DOM-функция lastChild() будет записана как last_child().

Этот модуль определяет несколько классов, которые перечислены — включая их методы — в следующих таблицах. Классы с эквивалентом в DOM Standard именуются DOMxxx.

Таблица 3. Список классов

Имя класса Родительский класс
DomAttribute DomNode
DomCData DomNode
DomComment DomCData : DomNode
DomDocument DomNode
DomDocumentType DomNode
DomElement DomNode
DomEntity DomNode
DomEntityReference DomNode
DomProcessingInstruction DomNode
DomText DomCData : DomNode
Parser Пока ещё называется DomParser
XPathContext

Таблица 4. Класс DomDocument (DomDocument : DomNode)

Имя метода Имя функции Примечание
doctype DomDocument_doctype()
document_elemnent DomDocument_document_element()
create_element DomDocument_create_element()
create_text_node DomDocument_create_text_node()
create_comment DomDocument_create_comment()
create_cdata_section DomDocument_create_cdata_section()
create_processing_instruction DomDocument_create_processing_instruction()
create_attribute DomDocument_create_attribute()
create_entity_reference DomDocument_create_entity_reference()
get_elements_by_tagname DomDocument_get_elements_by_tagname()
get_element_by_id DomDocument_get_element_by_id()
dump_mem DomDocument_dump_mem() не DOM стандарт
dump_file DomDocument_dump_file() не DOM стандарт
html_dump_mem DomDocument_html_dump_mem() не DOM стандарт
xpath_init xpath_init не DOM стандарт
xpath_new_context xpath_new_context не DOM стандарт
xptr_new_context xptr_new_context не DOM стандарт

Таблица 5. Класс DomElement (DomElement : DomNode)

Имя метода Имя функции Примечание
tagname DomElement_tagname()
get_attribute DomElement_get_attribute()
set_attribute DomElement_set_attribute()
remove_attribute DomElement_remove_attribute()
get_attribute_node DomElement_get_attribute_node()
set_attribute_node DomElement_set_attribute_node()
get_elements_by_tagname DomElement_get_elements_by_tagname()
has_attribute DomElement_has_attribute()

Таблица 6. Класс DomNode

Имя метода Примечание
DomNode_node_name()
DomNode_node_value()
DomNode_node_type()
DomNode_last_child()
DomNode_first_child()
DomNode_child_nodes()
DomNode_previous_sibling()
DomNode_next_sibling()
DomNode_parent_node()
DomNode_owner_document()
DomNode_insert_before()
DomNode_append_child()
DomNode_append_sibling() Нет в DOM-стандарте. Эта функция эмулирует бывшее поведение DomNode_append_child() .
DomNode_remove_child()
DomNode_has_child_nodes()
DomNode_has_attributes()
DomNode_clone_node()
DomNode_attributes()
DomNode_unlink_node() Нет в DOM-стандарте
DomNode_replace_node() Нет в DOM-стандарте
DomNode_set_content() Нет в DOM-стандарте, не рекомендуется
DomNode_get_content() Нет в DOM-стандарте, не рекомендуется
DomNode_dump_node() Нет в DOM-стандарте
DomNode_is_blank_node() Нет в DOM-стандарте

Таблица 7. Класс DomAttribute (DomAttribute : DomNode)

Имя метода Примечание
name DomAttribute_name()
value DomAttribute_value()
specified DomAttribute_specified()

Таблица 8. Класс DomProcessingInstruction (DomProcessingInstruction : DomNode)

Имя метода Имя функции Примечание
target DomProcessingInstruction_target()
data DomProcessingInstruction_data()

Таблица 9. Класс Parser

XPathContext_eval()
Имя метода Имя функции Примечание
add_chunk Parser_add_chunk()
end Parser_end()
eval_expression XPathContext_eval_expression()
register_ns XPathContext_register_ns()

Таблица 11. Класс DomDocumentType (DomDocumentType : DomNode)

Имя метода Имя функции Примечание
name DomDocumentType_name()
entities DomDocumentType_entities()
notations DomDocumentType_notations()
public_id DomDocumentType_public_id()
system_id DomDocumentType_system_id()
internal_subset DomDocumentType_internal_subset()

Класс DomDtd происходит от DomNode. DomComment происходит от DomCData.

Многие примеры в этом справочнике требуют строки xml. Вместо повторения этой строки в каждом примере, она будет помещена в файл и включена в каждый пример. Этот include-файл показан в следующем разделе-примере. Вы можете также создать xml-документ и читать его с помощью DomDocument_open_file() .

Пример 1. Include-файл example.inc с xml-строкой

Содержание DomAttribute->name — возвращает имя атрибута DomAttribute->specified — проверяет, специфицирован ли атрибут DomAttribute->value — возвращает значение атрибута DomDocument->add_root [не рекомендуется применять] — добавляет узел root DomDocument->create_attribute — создаёт новый атрибут DomDocument->create_cdata_section — создаёт новый узел cdata DomDocument->create_comment — создаёт новый узел комментария DomDocument->create_element — создаёт новый узел элемента DomDocument->create_entity_reference — DomDocument->create_processing_instruction — создаёт новый узел PI DomDocument->create_text_node — создаёт новый текстовый узел DomDocument->doctype — возвращает тип документа DomDocument->document_element — возвращает узел элемента root DomDocument->dump_file — выполняет дамп внутреннего дерева XML в файл DomDocument->dump_mem — выполняет дамп внутреннего дерева XML в строку DomDocument->get_element_by_id — ищет элемент с определённым id DomDocument->get_elements_by_tagname — DomDocument->html_dump_mem — выполняет дамп внутреннего дерева XML в строку как HTML DomDocumentType->entities — возвращает список мнемоник DomDocumentType->internal_subset — возвращает внутренний поднабор DomDocumentType->name — возвращает имя типа документа DomDocumentType->notations — возвращает список нотаций DomDocumentType->public_id — возвращает public id типа документа DomDocumentType->system_id — возвращает system id типа документа DomElement->get_attribute_node — возвращает значение атрибута DomElement->get_attribute — возвращает значение атрибута DomElement->get_elements_by_tagname — добавляет новый атрибут DomElement->has_attribute — добавляет новый атрибут DomElement->remove_attribute — добавляет новый атрибут DomElement->set_attribute_node — добавляет новый атрибут DomElement->set_attribute — добавляет новый атрибут DomElement->tagname — возвращает имя элемента DomNode->append_child — добавляет нового потомка в конец потомков DomNode->append_sibling — добавляет нового родственника в узел DomNode->attributes — возвращает список атрибутов DomNode->child_nodes — возвращает потомков узла DomNode->clone_node — клонирует узел DomNode->dump_node — дамп отдельного узла DomNode->first_child — возвращает первого потомка узла DomNode->get_content — получает содержимое узла DomNode->has_attributess — проверяет, имеет ли узел атрибуты DomNode->has_child_nodes — проверяет, имеет ли узел потомков DomNode->insert_before — вставляет новый узел как потомка DomNode->is_blank_node — проверяет, является ли узел чистым DomNode->last_child — возвращает последнего потомка узла DomNode->next_sibling — возвращает следующего родственника узла DomNode->node_name — возвращает имя узла DomNode->node_type — возвращает тип узла DomNode->node_value — возвращает значение узла DomNode->owner_document — возвращает документ, к которому этот узел принадлежит DomNode->parent_node — возвращает предка узла DomNode->prefix — возвращает префикс пространства имён узла DomNode->previous_sibling — возвращает предыдущего родственника узла DomNode->remove_child — удаляет потомка из списка потомков DomNode->replace_child — замещает потомка DomNode->replace_node — замещает узел DomNode->set_content — устанавливает содержимое узла DomNode->set_name — устанавливает имя узла DomNode->unlink_node — удаляет узел DomProcessingInstruction->data — возвращает данные pi-узла DomProcessingInstruction->target — возвращает цель/target pi-узла domxml_new_doc — создаёт новый пустой XML-документ domxml_open_file — создаёт DOM-объект из XML-файл domxml_open_mem — создаёт DOM-объект XML-документа domxml_version — получает версию XML-библиотеки domxml_xmltree — создаёт дерево PHP-объектов из XML-документа xpath_eval_expression — вычисляет XPath Location Path в данной строке xpath_eval — вычисляет XPath Location Path в данной строке xpath_new_context — создаёт новый xpath-контекст xptr_eval — вычисляет XPtr Location Path в данной строке xptr_new_context — создаёт новый XPath Context


Назад Оглавление Вперёд
rewinddir Вверх DomAttribute->name

Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:

Часть 1. Работа с XML в PHP за 15 минут

PHP5 значительно упрощает работу с XML в PHP

Серия контента:

Этот контент является частью # из серии # статей: XML для PHP-разработчиков

Этот контент является частью серии: XML для PHP-разработчиков

Следите за выходом новых статей этой серии.

Другие статьи этой серии

Значение XML в современной среде разработки приложений трудно переоценить. Тем, кто никогда не работал с XML в РНР или еще не перешел на РНР5, это краткое руководство поможет освоить новую функциональность РНР5, связанную с XML, и оценить, насколько простой может быть работа с XML. Эта первая из трех статей посвящена знакомству с API и демонстрирует, что SimpleXML в сочетании с DOM служит идеальным инструментом для разработчиков, имеющих дело с простыми, предсказуемыми и относительно компактными XML-документами. Именно такими документами оперируют, например, Ajax-приложения при передаче информации о заполнении формы, в такие же документы оформляются ответы API Web-сервисов, таких как weather.com.

Основы XML

Краткое введение в основы XML позволит читателю понять важность этого языка для РНР-разработчика и научиться создавать простые XML-документы.

Сведения об XML

Язык Extensible Markup Language (XML) можно назвать и языком разметки, и форматом хранения текстовых данных. Это подмножество языка Standard Generalized Markup Language (SGML); он предоставляет текстовые средства для описания древовидных структур и их применения к информации. XML служит основой для целого ряда языков и форматов, таких как Really Simple Syndication (RSS), Mozilla XML User Interface Language (XUL), Macromedia Maximum eXperience Markup Language (MXML), Microsoft eXtensible Application Markup Language (XAML) и open source-язык Java XML UI Markup Language (XAMJ).

Структура XML

Базовым блоком данных в XML является элемент. Элементы выделяются начальным тегом, таким как , и конечным тегом, таким как . Каждому начальному тегу должен соответствовать конечный тег. Если для какого-то начального тега отсутствует конечный тег, XML-документ оформлен неправильно, и синтаксический анализатор (парсер) не сможет проанализировать его надлежащим образом. Названия тегов обычно отражают тип элемента. Можно ожидать, что элемент book содержит название книги, например, «Большой американский роман» (см. листинг 1). Текст, содержащийся между тегами, включая пробелы, называется символьными данными.

Листинг 1. Пример XML-документа


Имена XML-элементов и атрибутов могут состоять из латинских букв верхнего (A-Z ) и нижнего (a-z) регистров, цифр (0-9), некоторых специальных и неанглийских символов, а также трех знаков пунктуации: дефиса, знака подчеркивания и точки. Другие символы в именах не допускаются.

XML чувствителен к регистру. В приведенном примере и описывают два разных элемента. Оба имени приемлемы. Однако описание двух разных элементов именами и нельзя считать разумным решением ввиду высокой вероятности опечаток.

Каждый документ XML содержит один и только один корневой элемент. Корневой элемент — это единственный элемент XML-документа, для которого нет родительского элемента. В приведенном выше примере корневым является элемент . Большинство XML-документов содержат родительские и дочерние элементы. Элемент имеет один дочерний элемент . У элемента четыре дочерних элемента: , ,

и . У элемента три дочерних элемента, каждый из которых является элементом . У каждого элемента по два дочерних элемента, и .

Кроме вложенных элементов, что создает отношения родительский-дочерний, XML-элементы могут иметь атрибуты. Это пары имя-значение, присоединенные к начальному тегу элемента. Имена отделяются от значений знаком равенства, =. Значения заключаются в одинарные или двойные кавычки. В листинге 1 элемент имеет два атрибута: «bestseller» и «bookclubs». XML-разработчики практикуют разные подходы к использованию атрибутов. Большую часть информации, содержащейся в атрибуте, можно поместить в дочерний элемент. Некоторые разработчики настаивают на том, чтобы информация атрибутов состояла не из данных, а из метаданных, то есть сведений о данных. Сами данные должны содержаться в элементах. На самом деле решение о том, использовать ли атрибуты, зависит от природы данных и от того, как они извлекаются из XML.

Достоинства XML

Одно из достоинств XML состоит в его относительной простоте. XML-документ можно составить в простом текстовом редакторе или текстовом процессоре, не прибегая к специальным инструментам или ПО. Базовый синтаксис XML состоит из вложенных элементов, некоторые из которых имеют атрибуты и содержание. Обычно элемент начинается открывающим тегом и заканчивается соответствующим закрывающим тегом . XML чувствителен к регистру и не игнорирует пробелы и табуляции. Он очень похож на HTML, но, в отличие от HTML, позволяет присваивать тегам имена для лучшего описания свох данных. К числу преимуществ XML относится самодокументирование, читабельный для людей и компьютеров формат, поддержка Unicode, что позволяет создавать документы на разных языках, и простые требования к синтаксису и синтаксическому анализу. К сожалению, в РНР5 поддержка UTF-8 сопряжена с проблемами; это один из тех недостатков, которые привели к разработке РНР6.

Недостатки XML

XML многословен и избыточен, что порождает документы большого объема, занимающие много дискового пространства и сетевых ресурсов. Предполагается, что он должен быть читабелен для людей, но трудно представить себе человека, пытающегося прочесть файл XML с 7 млн. узлов. Простейшие синтаксические анализаторы функционально не способны поддерживать широкий набор типов данных; по этой причине редкие или необычные данные, каких бывает много, становятся серьезным источником затруднений.

Правильно построенный XML

XML-документ считается построенным правильно, если в нем соблюдены правила XML-синтаксиса. Неправильно построенный формат в техническом смысле не является XML-документом. Например, такой HTML-тег, как
, в XML неприемлем; соответствующий правильный тег выглядит как
. Корневой элемент можно представить себе как бесконечный шкаф с документами. У вас всего один шкаф, но почти нет ограничений на тип и количество его содержимого. В вашем шкафу помещается бесконечное количество ящиков и папок для документов.

Основы PHP

Большинство читателей этой статьи уже работают с РНР, но, возможно, незнакомы с его историей и эволюцией.

О PHP

Hypertext Preprocessor (PHP) — это не зависящий от платформы язык сценариев, используемый для создания динамических Web-страниц и серверных приложений. Он начинался как Personal Home Page/Form Interpreter (PHP/FI) и обрел новую жизнь в руках Сураски (Suraski) и Гутманса (Gutmans), которые в июне 1998 года выпустили РНР3. Их компания Zend Technologies до сих пор управляет разработкой PHP.

В июле 2004 года вышел PHP5 с Zend Engine II и многими новыми функциями, такими как:

  • Поддержка объектно-ориентированного программирования
  • Улучшенная поддержка MySQL
  • Улучшенная поддержка XML

PHP5 и XML

Поддержка XML присутствовала в РНР с самых ранних версий, но в РНР5 она существенно улучшена. Поддержка XML в РНР4 была ограниченной, в частности, предлагался только включенный по умолчанию парсер на базе SAX, а поддержка DOM не соответствовала стандарту W3C. В РНР5 разработчики PHP XML, можно сказать, изобрели колесо, обеспечив соответствие общепринятым стандартам.

Новое в поддержке XML в версии PHP5

PHP5 содержит полностью переписанные и новые расширения, включая парсер SAX, DOM, SimpleXML, XMLReader, XMLWriter и процессор XSLT. Теперь все эти расширения основаны на libxml2.

Наряду с улучшенной по сравнению с PHP4 поддержкой SAX, в РНР5 реализована поддержка DOM в соответствии со стандартом W3C, а также расширение SimpleXML. По умолчанию включены и SAX, и DOM, и SimpleXML. Тем, кто знаком с DOM по другим языкам, станет проще реализовать аналогичную функциональность в РНР

Чтение, обработка и написание XML в PHP5

SimpleXML, при необходимости в сочетании с DOM, — идеальный выбор для чтения, обработки и составления в РНР5 простых, предсказуемых и относительно компактных документов.

Краткий обзор предпочтительных API

Из множества API, присутствующих в РНР5, DOM — самый знакомый, а на SimpleXML проще всего программировать. В типичных ситуациях, таких как те, что мы здесь рассматриваем, они наиболее эффективны.

Расширение DOM

Document Object Model (DOM) — это принятый W3C стандартный набор объектов для документов HTML и XML, стандартная модель сочетания этих объектов и стандартный интерфейс для доступа к ним и манипуляций с ними. Многие поставщики поддерживают DOM в качестве интерфейса к своим специальным структурам данных и API, благодаря чему модель DOM знакома массе разработчиков. DOM легко освоить и применять, так как его структура в памяти напоминает исходный документ XML. Чтобы передать информацию приложению, DOM создает дерево объектов, которое в точности повторяет дерево элементов файла XML, так что каждый элемент XML служит узлом этого дерева. DOM — это парсер, основанный на древовидной структуре. Поскольку DOM строит дерево всего документа, он потребляет много ресурсов памяти и времени процессора. Поэтому анализ очень крупных документов посредством DOM непрактичен из-за проблем производительности. В контексте данной статьи расширение DOM используется главным образом из-за его способности импортировать формат SimpleXML и выводить XML в формате DOM, или, наоборот, для использования в качестве строковых данных или XML-файла.

SimpleXML

Расширение SimpleXML – это предпочтительный инструмент для синтаксического анализа XML. Для его работы требуется РНР5. Оно взаимодействует с DOM при составлении XML-файлов и имеет встроенную поддержку XPath. SimpleXML лучше всего работает с несложными данными типа записей, такими как XML, передаваемый в виде документа или строки из другой части того же приложения. Если XML-документ не слишком сложный, не слишком глубокий и не содержит смешанного контента, для SimpleXML кодировать проще, чем для DOM, как и предполагает название. К тому же он надежнее при работе с известной структурой документа.

Простые примеры

Ниже приведены простые примеры работы с DOM и SimpleXML на компактных XML-файлах.

DOM в действии

Модель DOM, реализованная в PHP5, — это та же спецификация W3C DOM, с которой вы имеете дело в браузере и с которой работаете посредством JavaScript. Используются те же методы, так что способы кодирования покажутся вам знакомыми. Листинг 2 иллюстрирует использование DOM для создания XML-строки и XML-документа, отформатированных в целях читабельности.

Листинг 2. Применение DOM

Это приводит к созданию выходного файла, приведенного в листинге 3.

Листинг 3. Выходной файл

Листинг 4 импортирует объект SimpleXMLElement в объект DOMElement , иллюстрируя взаимодействие DOM и SimpleXML.

Листинг 4. Взаимодействие, часть 1 — DOM импортирует SimpleXML

Функция из листинга 5 берет узел документа DOM и превращает его в узел SimpleXML. Затем этот новый объект можно использовать в качестве «родного» элемента SimpleXML. В случае любой ошибки возвращается значение FALSE.

Листинг 5. Взаимодействие, часть 2 — SimpleXML импортирует DOM

SimpleXML в действии

Расширение SimpleXML – это предпочтительный инструмент для синтаксического анализа XML. Оно взаимодействует с DOM при составлении XML-файлов и имеет встроенную поддержку XPath. Для SimpleXML проще писать код, чем для DOM, как и предполагает его название.

Для тех, кто не знаком с РНР, листинг 6 форматирует тестовый XML-файл как include-файл в целях читабельности.

Листинг 6. В следующих примерах тестовый XML-файл отформатирован как include-файл РНР с именем example.php.

В гипотетическом Ajax-приложении может, например, понадобиться извлечь из XML-документа почтовый индекс и обратиться к базе данных. В листинге 7 из XML-файла предыдущего примера извлекается элемент

Листинг 7. Извлечение узла – как легко его получить?

С другой стороны, может понадобиться извлечь многострочный адрес. Когда у одного родительского элемента несколько экземпляров дочернего элемента, применяется обычная методика итерирования. Эта функциональность показана в листинге 8.

Листинг 8. Извлечение нескольких экземпляров элемента

Кроме чтения имен элементов и их значений, SimpleXML может также обращаться к атрибутам элемента. В листинге 9 производится обращение к атрибутам элемента; это делается точно так же, как обращение к элементам массива.

Листинг 9. Демонстрация обращения SimpleXML к атрибутам элемента

Чтобы сравнить элемент или атрибут со строкой или передать его функции, которой требуется строка, нужно преобразовать его в строку при помощи оператора (string). Иначе, по умолчанию, РНР рассматривает элемент как объект (листинг 10).

Листинг 10. Преобразуй в строку, или проиграешь

Данные в SimpleXML не обязаны быть неизменными. Листинг 11 выводит новый XML-документ, точную копию исходного, за исключением того, что в новом имя Cliff изменено на Big Cliff.

Листинг 11. Изменение текстового узла с помощью SimpleXML

Начиная с версии PHP 5.1.3 SimpleXML дополнен возможностью легко добавлять дочерние элементы и атрибуты. Листинг 12 выводит XML-документ, основанный на исходном, но с добавленным новым персонажем и описанием.

Листинг 12. Добавление дочерних и текстовых узлов с помощью SimpleXML

Заключение

Эта первая статья серии из трех частей посвящена знакомству с API и демонстрирует, что SimpleXML, при необходимости в сочетании с DOM, служит идеальным инструментом для разработчиков, имеющих дело с простыми, предсказуемыми и относительно компактными XML-документами. Версия PHP5 значительно расширила возможности программистов в части работы с XML в РНР. Во второй части мы рассмотрим более сложные методы синтаксического анализа XML.

Ресурсы для скачивания

Похожие темы

  • Оригинал статьи (EN). (EN)
  • XML для PHP-разработчиков, часть 2: дополнительные методы синтаксического анализа XML (Клифф Морган, developerWorks, март 2007 г.): во второй части этой серии статей из трех частей мы рассмотрим методы синтаксического анализа XML, используемые в РНР5, и научимся решать, какой метод лучше подходит для данного приложения.(EN)
  • XML для PHP-разработчиков, часть 3: дополнительные методы чтения, организации и составления XML-документов (Клифф Морган, developerWorks, март 2007 г.): в заключительной части серии из трех статей об XML для РНР-разработчиков рассказывается о методах чтения, обработки и составления XML в РНР5.(EN)
  • Reading and writing the XML DOM in PHP (Jack Herrington, developerWorks, декабрь 2005 г.): Три метода чтения XML: библиотека DOM, синтаксический анализатор SAX и регулярные выражения. Также рассказывается, как писать XML с применением текстовых шаблонов DOM и PHP (EN).
  • SimpleXML Processing with PHP (Elliotte Rusty Harold, developerWorks, октябрь 2006 г.): Расширение SimpleXML позволяет PHP-страницам обращаться к XML с запросами, вести в них поиск, модифицировать и повторно публиковать его (EN).
  • A PHP5 migration gu >

Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

Работа с DOM средствами PHP5

При создании интернет-магазинов очень часто требуется наполнение интернет магазина товарами с других, более крупных интернет-магазинов. Помимо этого постоянно изменяются цены на товар, кол-во на складе, и т.д.

Крупные интернет-магазины как правило предоставляют XML-шлюзы, чтобы более мелкие магазины (дилеры) могли продавать их товары. Для того чтобы стать дилером крупного интернет-магазина нужно найти на сайте раздел XML-шлюз, или обратиться к администрации магазина.

После чего с помощью PHP DOM пропарсить xml-шлюз, и занести товар в базу данных.

В качестве примера возьмем небольшой XML-файл состоящий из 2-ух товаров интернет-магазина:

PHP-скрипт:

В статье использовались следующие свойства и методы:

Свойство nodeType – возвращает информацию об узле, может принимать значение:

1 — дескриптор
2 — атрибут
3 — текст (включая пробелы)
8 — HTML-комментарий
9 — документ
10 — DTD (определение типа документа)
11 — фрагмент

Свойсто nodeName — возвращает информацию об имени узла

Свойство childNodes — массив дочерних узлов


Метод getAttribute — возвращает значение свойства

Так же для обхода XML можно использовать XPath, но об этом в следующих статьях

Спецификация и функции DOM в PHP

Загрузить XML файл в DOM-представление можно так:

Основные классы для работы — это DOMNode и DOMElement .

DOMNode — это базовый класс, DOMElement — расширенный класс, на основе DOMNode .

Выбрать нужные DOM-узлы (DOMNode) можно с помощью метода:

Надо обратить внимание, что несмотря на то, что это метод класса DOMElement , и называется он getElementsByTagName , данный метод возвращает список список объектов DOMNode , а не DOMElement .

Форум

Справочник

Поиск по форуму
Расширенный поиск
К странице.

Введение. DOM в примерах.

Основным инструментом работы и динамических изменений на странице является DOM (Document Object Model) — объектная модель, используемая для XML/HTML-документов.

Согласно DOM-модели, документ является иерархией.
Каждый HTML-тег образует отдельный элемент-узел, каждый фрагмент текста — текстовый элемент, и т.п.

Проще говоря, DOM — это представление документа в виде дерева тегов. Это дерево образуется за счет вложенной структуры тегов плюс текстовые фрагменты страницы, каждый из которых образует отдельный узел.

Простейший DOM

Построим, для начала, дерево DOM для следующего документа.

Самый внешний тег — , поэтому дерево начинает расти от него.

Внутри находятся два узла: и — они становятся дочерними узлами для .

Теги образуют узлы-элементы (element node). Текст представлен текстовыми узлами (text node). И то и другое — равноправные узлы дерева DOM.

Пример посложнее

Рассмотрим теперь более жизненную страничку:

Корневым элементом иерархии является html . У него есть два потомка. Первый — head , второй — body . И так далее, каждый вложенный тег является потомком тега выше:

На этом рисунке синим цветом обозначены элементы-узлы, черным — текстовые элементы.

Дерево образовано за счет синих элементов-узлов — тегов HTML.

А вот так выглядит дерево, если изобразить его прямо на HTML-страничке:

Кстати, дерево на этом рисунке не учитывает текст, состоящий из одних пробельных символов. Например, такой текстовый узел должен идти сразу после

    . DOM, не содержащий таких «пустых» узлов, называют «нормализованным».

Пример с атрибутами и DOCTYPE

Рассмотрим чуть более сложный документ.

Верхний тег — html , у него дети head и body , и так далее. Получается дерево тегов:

В этом примере у узлов есть атрибуты: style , class , id . Вообще говоря, атрибуты тоже считаются узлами в DOM-модели, родителем которых является элемент DOM, у которого они указаны.

Однако, в веб-программировании в эти дебри обычно не лезут, и считают атрибуты просто свойствами DOM-узла, которые, как мы увидим в дальнейшем, можно устанавливать и менять по желанию программиста.

Вообще-то это секрет, но DOCTYPE тоже является DOM-узлом, и находится в дереве DOM слева от HTML (на рисунке этот факт скрыт).

P.S. Насчет секрета — конечно, шутка, но об этом и правда далеко не все знают. Сложно придумать, где такое знание может пригодиться.

Нормализация в различных браузерах

При разборе HTML Internet Explorer сразу создает нормализованный DOM, в котором не создаются узлы из пустого текста.

Firefox — другого мнения, он создает DOM-элемент из каждого текстового фрагмента.
Поэтому в Firefox дерево этого документа выглядит так:

На рисунке для краткости текстовые узлы обозначены просто решеткой. У body вместо 3 появилось 7 детей.

Opera тоже имеет чем похвастаться. Она может добавить лишний пустой элемент «просто от себя».

Чтобы это увидеть — откройте документ по этой ссылке. Он выдает число дочерних узлов document.body , включая текстовые узлы.

У меня получается 3 для IE, 7 для Firefox и 8 (!?) для Opera.

На практике эта несовместимость не создает больших проблем, но нужно о ней помнить. Например, разница может проявить себя в случае перебора узлов дерева.

Возможности, которые дает DOM

Зачем, кроме красивых рисунков, нужна иерархическая модель DOM?

Каждый DOM-элемент является объектом и предоставляет свойства для манипуляции своим содержимым, для доступа к родителям и потомкам.

Для манипуляций с DOM используется объект document .
Используя document , можно получать нужный элемент дерева и менять его содержание.

Например, этот код получает первый элемент с тэгом ol , последовательно удаляет два элемента списка и затем добавляет их в обратном порядке:

Для примера работы такого скрипта — кликните на тексте на лосиной cтраничке

В старых руководствах и скриптах можно встретить модификацию HTML-кода страницы напрямую вызовом document.write .

В современных скриптах этот метод почти не используется, случаи его правильного применения можно пересчитать по пальцам.

Избегайте document.write.. Кроме случаев, когда вы действительно знаете, что делаете (а зачем тогда читаете самоучитель — вы и так гуру)

Разберем подробнее способы доступа и свойства элементов DOM.

Доступ к элементам

Любой доступ и изменения DOM берут свое начало от объекта document .

Начнем с вершины дерева.

document.documentElement

Самый верхний тег. В случае корректной HTML-страницы, это будет .

document.body

Тег , если есть в документе (обязан быть).

Следующий пример при нажатии на кнопку выдаст текстовое представление объектов document.documentElement и document.body . Сама строка зависит от браузера, хотя объекты везде одни и те же.

Типы DOM-элементов

У каждого элемента в DOM-модели есть тип. Его номер хранится в атрибуте elem.nodeType

Всего в DOM различают 12 типов элементов.

Обычно используется только один: Node.ELEMENT_NODE , номер которого равен 1. Элементам этого типа соответствуют HTML-теги.

Иногда полезен еще тип Node.TEXT_NODE , который равен 3. Это текстовые элементы.

Остальные типы в javascript программировании не используются.

Следующий пример при нажатии на кнопку выведет типы document.documentElement , а затем тип последнего потомка узла document.body . Им является текстовый узел.

Пример

Например, вот так выглядел бы в браузере документ из примера выше, если каждый видимый элемент обвести рамкой с цифрой nodeType в правом верхнем углу.

Здесь показаны только элементы внутри body , т.к только они отображаются на странице. Для элементов типа 1 (теги) в скобочках указан соответствующий тег, для текстовых элементов (тип 3) — стоит просто цифра.

Дочерние элементы

С вершины дерева можно пойти дальше вниз. Для этого каждый DOM-узел содержит массив всех детей, отдельно — ссылки на первого и последнего ребенка и еще ряд полезных свойств.

    Все дочерние элементы, включая текстовые находятся в массиве childNodes .

В следующем примере цикл перебирает всех детей document.body .

  • Свойства firstChild и lastChild показывают на первый и последний дочерние элементы и равны null , если детей нет.
  • Свойство parentNode указывает на родителя. Например, для таким элементом является :

  • Свойства previousSibling и nextSibling указывают на левого и правого братьев узла.
  • В общем. если взять отдельно с детьми из нормализованного DOM — такая картинка получается ОТ :


    И такая — для ссылок наверх и между узлами:

    • Синяя линия — массив childNodes
    • Зеленые линии — свойства firstChild , lastChild .
    • Красная линия — свойство parentNode
    • Бордовая и лавандовая линии внизу — previousSibling , nextSibling

    Этих свойств вполне хватает для удобного обращения к соседям.

    Свойства элементов

    У DOM-элементов есть масса свойств. Обычно используется максимум треть из них. Некоторые из них можно читать и устанавливать, другие — только читать.

    Есть еще и третий вариант, встречающийся в IE — когда устанавливать свойство можно только во время создания элемента.

    Рассмотрим здесь еще некоторые (не все) свойства элементов, полезные при работе с DOM.

    tagName

    Атрибут есть у элементов-тегов и содержит имя тега в верхнем регистре, только для чтения.

    style

    Это свойство управляет стилем. Оно аналогично установке стиля в CSS.

    Например, можно установить element.style.width :

    Исходный код этой кнопки:

    Есть общее правило замены — если CSS-атрибут имеет дефисы, то для установки style нужно заменить их на верхний регистр букв.

    Например, для установки свойства z-index в 1000, нужно поставить:

    innerHTML

    Когда-то это свойство поддерживалось только в IE. Теперь его поддерживают все современные браузеры.

    Оно содержит весь HTML-код внутри узла, и его можно менять.

    Свойство innerHTML применяется, в основном, для динамического изменения содержания страницы, например:

    Пожалуй, innerHTML — одно из наиболее часто используемых свойств DOM-элемента.

    className

    Это свойство задает класс элемента. Оно полностью аналогично html-атрибуту «class».

    onclick , onkeypress, onfocus .

    .. И другие свойства, начинающиеся на «on. «, хранят функции-обработчики соответствующих событий. Например, можно присвоить обработчик события onclick .

    Подробнее об этих свойствах и обработчиках событий — см. введение в события.

    Спецификация и функции DOM в PHP

    PHP, в настоящее время, – один из наиболее популярных языков для реализации веб-приложений. Данный курс посвящен изучению его основ. Акцент делается на практическое применение полученных навыков.

    Язык PHP был создан для решения конкретной практической задачи в среде интернет (какой именно можно узнать, прочитав первую лекцию курса). Мы тоже постараемся не отвлекаться слишком сильно на теоретические рассуждения, и будем стремиться к решению какой-нибудь конкретной задачи в каждой из лекций. Большинство примеров взяты из реально существующей системы: виртуального музея истории информатики. Первая часть курса посвящена изучению основ синтаксиса и управляющим конструкциям. После этого рассматривается технология клиент-сервер, как основная сфера приложения языка PHP. Затем переходим к изучению наиболее полезных на наш взгляд встроенных функций и решению с их помощью практических задач. Хотя объектная модель в языке PHP не самая богатая, ее принципиальное наличие позволяет естественным образом описывать объектные модели данных. В качестве базовой модели будет рассмотрена модель документа виртуального музея информатики. После этого будет рассмотрен ряд прикладных аспектов: работа с файловой системой, с БД, строками, сессиями, DOM XML — все это позволит рассмотреть ключевые задачи практического использования языка.

    Книга: Курс «Язык программирования PHP»

    Взаимодействие PHP и XML

    Разделы на этой странице:

    Взаимодействие PHP и XML

    Введение

    Прежде чем начать изучать способы работы PHP с XML, полезно хотя бы вкратце ознакомиться с самой технологией XML. В первой части лекции будут рассмотрены основные понятия этой технологии, базовый синтаксис XML–документов, области ее применения, а также понятие DOM XML. Вторая часть лекции посвящена непосредственно вопросам обработки XML при помощи PHP. Сюда входит установка расширения DOM XML, описание и примеры использования некоторых встроенных в PHP функций для обработки XML-документов.

    В качестве примера рассмотрим XML-файл, содержащий описания личностей, и попытаемся научиться добавлять, удалять и находить личность или отдельные элементы ее описания в этом файле с помощью PHP.

    XML

    XML (Extensible Markup Language) – это расширяемый язык разметки, являющийся подмножеством языка SGML и поэтому имеющий общие с ним цели – разметка любого типа документов.

    XML имеет много общего с языком разметки HTML, но они различны по своему назначению. HTML, как и XML, является подмножеством SGML, но предназначен только для отображения информации в браузере. XML же предназначен для структурированного хранения информации и не содержит никаких конструкций для отображения этих данных.

    Для отображения данных, хранящихся в XML-формате, используются различного рода преобразователи, например язык трансформаций XSLT. Комбинация XML + преобразователь позволяет достичь того же результата, что и использование HTML-форматированного отображения документа пользователю. Однако в случае использования XML и преобразователя данные хранятся отдельно от их представления, т. е. от инструкций о том, как они должны отображаться.

    XML очень похож на HTML по своему синтаксису, за исключением того, что теги XML можно придумывать собственные. По аналогии с HTML внутри XML-тегов можно использовать атрибуты. Каждый тег XML должен иметь соответствующий закрывающий тег (в HTML это не является обязательным). Каждый XML-документ начинается со строки декларации, например:

    которая указывает на версию языка XML (атрибут version), кодировку текста в этом документе (атрибут encoding) и показывает, существует ли документ сам по себе или зависит от других файлов (атрибут standalone).

    Приведем пример XML-документа.

    Пусть у нас имеется письмо. Содержащуюся в нем информацию можно хранить в следующем виде:

    Маша Петрова
    Привет, Маша!
    Как у тебя дела?
    У меня все хорошо.
    Собираюсь приехать
    к тебе в гости.

    Объектно-ориентированный PHP: специально для начинающих

    В этом уроке вы ознакомитесь с основами объектно-ориентированного программирования в PHP. Вы узнаете о принципах ООП вообще и научитесь писать простенькие скрипты на PHP.

    Добро пожаловать в первый из серии уроков по ООП на PHP! Ознакомившись со всеми уроками данной серии, вы узнаете об основных принципах и концепциях ООП и научитесь быстро и легко создавать полезные приложения на PHP.

    В этом уроке я начну вводить вас в курс дела и расскажу вам об основных понятиях ООП. Вы узнаете:

    • что такое ООП
    • как ООП поможет вам создавать лучшие PHP скрипты
    • некоторые основные понятия, такие как классы, объекты, методы, переменные класса
    • с чего начать написание PHP скрипта

    Вы готовы погрузиться в мир объектов PHP? Тогда вперед!

    Что такое объектно-ориентированное программирование?

    Если вы когда-то создавали собственные функции в PHP и использовали их, то вы использовали такой стиль программирования, как процедурный. В процедурном программировании вы обычно создаете структуры данных — числа, строки, массивы и т.д. — для хранения каких-то данных, а затем обрабатываете эти структуры специальными функциями, которые манипулируют этими данными.

    Объектно-ориентированное программирование, или ООП, пошло вперед, так как здесь мы храним структуры данных и функции, их обрабатывающие, в одной сущности, называемой объектом. Вместо того, чтобы обработать данные какой-либо функцией, вы загружаете эти данные в объект, а затем вызываете его методы для манипулирования ими и получаете желаемый результат.

    Чаще всего объекты, создаваемые с помощью ООП, отражают реальные сущности. Например, если вы создаете форум для своего сайта, вам следовало бы создать объект Member, который будет хранить информацию о каждом участнике форума (имя, логин, электронный адрес, пароль и др.), а также методы, которые будут обрабатывать эту информацию (регистрация, авторизация, выход из системы, бан и т.д.).

    Зачем использовать ООП?

    Процедурный и объектно-ориентированный — это два разных способа сделать одно и то же. Нельзя сказать, что один из них лучше другого — каждый пишет, как ему нравится, так что вы даже можете легко комбинировать эти два подхода в одном скрипте.

    Однако, вот некоторые преимущества ООП для разработчиков:

    • Легче отражать реальные ситуации: как я отметил выше, объекты отражают реальные сущности — люди, товары, карточки, статьи в блогах и др. Это во многом упрощает задачу, когда вы только начинаете проектировать свое приложение, так как назначение каждого объекта, как и цель отношений между объектами, будет ясно и понятно.
    • Легче писать модульные программы: ООП предполагает написание модулей. Разделяя код на модули, вам будет легче им управлять, дебажить и расширять его.
    • Легче писать код, который будет использоваться много раз: написание кода, который можно будет использовать не один раз, сэкономит время при написании приложения, и со временем вы даже можете создать целую библиотеку такого рода модулей, которые вы сможете использовать во многих приложениях. С помощью ООП становится сравнительно легче писать такой код, так как структуры данных и функции инкапсулируются в единственный объект, который можно использовать любое количество раз.

    Некоторые основные понятия

    Перед тем, как начать писать скрипты, необходимо хорошо разобраться с такими понятиями, как класс, объект, переменная класса и метод.

    Классы

    Класс — это каркас для объекта. Это кусок кода, который определяет:

    • Типы данных, которые будут содержать созданные объекты класса
    • Функции, которые будут содержать эти объекты.

    Когда вы создаете приложение на ООП, вы обычно будете создавать несколько классов, которые будут представлять различные типы сущностей вашего приложения. Например, для создания форума вы можете создать классы Forum, Topic, Post и Member.

    Объекты

    Объект — это переменная специального типа, которая создается через класс. Он содержит действительные данные и функции для манипулирования ими. Вы можете создавать сколько угодно объектов от одного единственного класса. Каждая функция объекта не зависит от другого объекта, даже если они созданы от одного и того же класса.

    Для сравнения с реальными сущностями:

    • Класс — это каркас для автомобиля: он определяет, как автомобиль будет выглядеть и действовать, но это все же абстрактная сущность
    • Объект — это настоящий автомобиль, созданный из каркаса: у него есть настоящие свойства (например, скорость) и поведение (например, ускорение или торможение).

    На заметку: Объект часто называют сущностью класса, а процесс создания объекта класса — реализацией.

    Переменные класса

    Значения данных, которые хранятся в том или ином объекте, записываются в специальные переменные, называемые переменными класса. Переменные класса тесно связаны с его объектом. Несмотря на то что все объекты класса имеют одни и те же переменные, их значения могут отличаться.

    Методы

    Функции, определяемые в классе и применяемые для объектов этого класса, называются методами. Они не во многом отличаются от обычных функций — вы можете передавать им значения, они могут содержать локальные переменные и возвращать значения. Однако, методы чаще работают с переменными объекта. К примеру, метод login() для авторизации пользователей в вашем форуме может устанавливать значение переменной класса loggedIn в true.

    Как создать класс в PHP?


    Теперь, когда вы уже знаете, что такое классы, методы, переменные класса и объекты, пришло время создать пару классов и объектов в коде PHP.

    Для начала посмотрим, как собственно нужно создавать класс. В принципе, скрипт по созданию класса выглядит так:

    К примеру, если вы создаете класс Member для вашего форума, вы напишите так:

    Это достаточно просто. Естественно, класс этот ничего не сделает, пока вы не добавите в него переменные и методы. Тем не менее, приведенный выше код создает валидный класс на PHP, который можно использовать.

    Правило хорошего тона: каждый класс помещайте в отдельный файл с названием, совпадающим с именем класса. Например, поместите класс Member в файл Member.php и храните его в папке, допустим, classes.

    Как создавать объекты в PHP?

    Создать объект можно с помощью ключевого слова new:

    Этот код создаст объект класса ClassName. Вам впоследствии понадобится использовать этот объект, поэтому его нужно хранить в переменной. Например, создадим объект класса Member и сохраним его в переменной $member:

    Мы также можем создать еще один объект того же класса:

    Несмотря на то что мы создали эти два объекта от одного и того же класса, переменные $member и $member2 не зависят друг от друга.

    Создаем переменные класса

    Теперь, когда мы уже умеем создавать классы и объекты классов, давайте посмотрим, как создавать переменные класса. Есть 3 идентификатора доступа для переменных класса, которые можно добавлять в класс:

    • Открытые переменные класса (public): доступны — т.е. их можно прочитать и/или изменять — в любом месте скрипта, независимо от того, где находится этот код — внутри класса или за его пределами
    • Частные переменные класса (private): доступны только методам класса. Лучше всего делать переменные класса именно частными, чтобы отделить объекты от остальной части кода.
    • Защищенные переменные класса (protected): доступны методам собственного класса, а также методам наследуемых классов (мы поговорим о наследовании позже).

    Чтобы создать переменную класса, напишите ключевое слово public, private или protected, а затем введите имя переменной:

    Давайте добавим переменную класса public нашему классу Member для хранения имени пользователя:

    Обратите внимание на то, что мы инициализировали нашу переменную класса, его значение — пустая строка, “”. Это значит, что при создании нового пользователя значение его имени по умолчанию будет равняться пустой строке. Так же, как и в случае с обычными переменными в PHP, переменные класса не обязательно инициализировать, но лучше все-таки не лениться. Если вы не инициализируете переменную класса, то по умолчанию ее значение равно null.

    Доступ к переменным класса

    Для получения доступа к переменной того или иного объекта используется оператор ->:

    Давайте попробуем. Напишем скрипт, который объявляет класс Member и переменную класса, создает объект этого класса, а затем задает значение переменной класса и выводит его на экран:

    Запустите данный код, он выведет на экран строку “Fred”, значение переменной класса $member->username. Как видите, вы оперируете переменной объекта так же, как обычной переменной — вы можете задать ей значение и прочитать его.

    Добавление методов в класс

    Что скажете насчет создания методов? Как я ранее упоминал, методы — это обычные функции, являющиеся частью класса. Так что вы, возможно, не удивитесь тому, что и создаются они с помощью того же ключевого слова function. Единственное отличие от создания обычных функций заключается в том, что вы также можете добавить один из идентификаторов доступа (public, private, protected) в ее объявлении. В этом методы схожи с переменными класса:

    На заметку: так же, как и в случае с переменными класса, методы public могут быть вызваны откуда угодно, методы private могут вызываться только в пределах класса, а методы protected — из самого класса и его наследника.

    Давайте попробуем добавить в наш класс некоторые методы и переменные класса:

    • переменная класса private $loggedIn для идентификации пользователя, т.е. зашел он или нет,
    • метод login(), который будет осуществлять вход на форум, устанавливая значение переменной класса $loggedIn в true,
    • метод logout(), который будет осуществлять выход из форума, устанавливая значение переменной класса $loggedIn в false,
    • метод isLoggedIn(), который будет возвращать значение переменной класса $loggedIn.

    Вы наверное заметили, что мы использовали новое ключевое слово $this. В контексте методов объекта специальная переменная $this ссылается на сам объект. Используя $this в методе объекта, метод может получить доступ к любой переменной класса и методу объекта.

    Например, метод login() может получить доступ к переменной класса $loggedIn объекта через $this->loggedIn.

    Кстати, наша переменная класса — частная (private), поэтому ее нельзя вызывать из любой части скрипта, а только из методов login(), logout() и isLoggedIn(). Это хороший подход, так как внутренняя часть объекта (например, то, как именно записывается, авторизовался ли пользователь или нет) находится отдельно от остального кода. По возможности старайтесь использовать именно переменные класса private, чтобы ваши объекты были автономными, мобильными и защищенными.

    На заметку: переменная класса $username в нашем примере — public. Я это сделал только для того, чтобы продемонстрировать, как можно получать доступ к переменным класса объекта. В реальных проектах скорее нужно сделать эту переменную частной и создать специальные переменные класса public для задания значений имени пользователя, если это необходимо.

    Использование методов

    Чтобы вызвать метод объекта, воспользуйтесь оператором ->, с которым вы уже успели подружиться.

    Это работает как и вызов обычной функции. Вы можете передать аргументы в скобках (если конечно он принимает какие-то аргументы), вызов метода также может возвращать определенные значения, которые вы затем можете использовать.

    Мы добавили некоторые методы в наш класс, теперь давайте попробуем их применить для чего-то:

    Данный скрипт отобразит следующее:

    Вот, как он работает:

    1. После описания класса Member мы создали его объект и сохранили в переменной $member. Также мы дали переменной класса $username данного объекта значение “Fred”.
    2. Затем мы вызвали метод $member->isLoggedIn() для того, чтобы определить, залогинился ли пользователь или нет. Данный метод просто-напросто возвращает значение переменной класса $loggedIn. Так как значение по умолчанию этой переменной класса — false, значит результатом вызова $member->isLoggedIn() будет ложь, поэтому отобразится сообщение «Fred is logged out».
    3. Затем вызовем метод login(). Он установит в true значение переменной класса $loggedIn.
    4. Теперь, при вызове метода $member->isLoggedIn() вернется истина, и выведется сообщение «Fred is logged in».
    5. Вызовем метод logout(), который устанавливает в false значение свойства $loggedIn.
    6. В третий раз вызовем метод $member->isLoggedIn(). Сейчас он вернет false, потому что значение свойства $loggedIn опять установлено в ложь. Так, снова выведется сообщение «Fred is logged out».

    На заметку: на случай, если вы в первые увидели такое: . — это тернарный оператор. Это упрощенная версия блоков if … else. Узнать о такого рода операторах можно здесь.

    Выводы

    В этом уроке вы познакомились с основами ООП в PHP. Вы узнали о таких вещах, как:

    • что такое ООП и почему его полезно применять
    • понятия классов, объектов, переменных класса и методов
    • как создавать классы и объекты
    • как создавать и использовать переменные классов
    • понятия идентификаторов доступа public, private, protected
    • как создавать и применять методы классов

    Вы уже много о чем узнали и еще много чему научитесь в следующих уроках. Тем не менее, если вы отработали хорошенько все примеры, приведенные мной, у вас есть крепкая основа. Можете приступать к созданию приложений на ООП.

    До новых встреч!

    Данный урок подготовлен для вас командой сайта ruseller.com
    Источник урока: www.elated.com/articles/object-oriented-php-for-absolute-beginners/
    Перевел: Станислав Протасевич
    Урок создан: 25 Июня 2011
    Просмотров: 144634
    Правила перепечатки

    5 последних уроков рубрики «PHP»

    Фильтрация данных с помощью zend-filter

    Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.

    Контекстное экранирование с помощью zend-escaper

    Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

    Подключение Zend модулей к Expressive

    Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

    Совет: отправка информации в Google Analytics через API

    Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

    Подборка PHP песочниц

    Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

    Парсинг и обработка веб-страницы на PHP: выбираем лучшую библиотеку

    Задача спарсить и обработать необходимую информацию со стороннего сайта встает перед веб-разработчиком довольно часто и по самым разнообразным причинам: таким образом можно заполнять свой проект контентом, динамически подгружать какую-то информацию и так далее.

    В таких случаях перед программистом встает вопрос: какую из десятков библиотек выбрать? В этой статье мы постарались рассмотреть самые популярные варианты и выбрать из них лучший.

    Регулярные выражения

    Даже не смотря на то, что «регулярки» — это первое, что приходит на ум, использовать их для настоящих проектов не стоит.

    Да, с простыми задачами регулярные выражения справляются лучше всех, но его использование значительно затрудняется, когда нужно спарсить большой и сложный кусок HTML-кода, который, к тому же, не всегда соответствует какому-то определенному шаблону и вообще может содержать синтаксические ошибки.

    Вместо «допиливания» своего регулярного выражения при каждом малейшем изменении кода рекомендуем использовать инструменты ниже — это и проще, и удобнее, и надежнее.

    XPath и DOM

    DOM и XPath не являются библиотеками в привычном смысле этого слова, это стандартные модули, которые встроены в PHP начиная с пятой версии. Именно отсутствие необходимости использовать сторонние решения делает их одними из лучших инструментов для парсинга HTML страниц.

    На первый взгляд может показаться, что низкий порог входа — это не о них, некоторые места и вправду являются весьма сложными. Но это только на первый взгляд: стоит только немного разобраться с синтаксисом и базовыми принципами, как XPath тут же станет для вас инструментом для парсинга номер один.

    Вот, например, код с использованием DOM и XPath, который ищет в разметке все теги и модифицирует их атрибуты src :

    Тем не менее, данный вариант не лишен минусов — для парсинга используется движок, в первую очередь предназначенный для работы с XML, а XML и HTML хоть и являются очень похожими языками, но всё же различаются. Из этого вытекают специфические требования к разметке: например, все HTML теги должны быть закрыты.

    Simple HTML DOM

    Simple HTML DOM — PHP-библиотека, позволяющая парсить HTML-код с помощью удобных jQuery-подобных селекторов.

    Она лишена главного недостатка XPath — библиотека умеет работать даже с невалидным HTML-кодом, что значительно упрощает работу. Вы также забудете о проблемах с кодировкой: все преобразования выполняются автоматически.

    Как и JQuery, Simple HTML DOM умеет искать и фильтровать вложенные элементы, обращаться к их атрибутам и даже выбирать отдельные логические элементы кода, например, комментарии.

    В этом примере сначала подгружается, а потом модифицируется заранее заготовленный HTML-код: во второй строке происходит добавление атрибута class со значением bar первом попавшемуся элементу div , а в следующей строке мы заменяем текст элемента с > на foo .

    Несмотря на не самую высокую производительность, по сравнению с другими вариантами, Simple HTML DOM имеет самое большое русскоязычное комьюнити и наибольшую распространенность в рунете — для новичков это делает написание кода с её использованием значительно проще.

    phpQuery

    Как и Simple HTML DOM, phpQuery является PHP вариантом JQuery, но на этот раз более похожим на своего «старшего javascript-брата».

    Портировано почти всё, что есть в JS-фреймворке: поддержка селекторов, атрибутов, манипуляций, обхода, плагинов, событий (в том числе имитации кликов и т.д.) и даже AJAX. Использовать можно как через PHP, так и через командную строку в виде отдельного приложения.

    Более того, согласно нашим бенчмаркам, phpQuery оказался в 8 (!) раз быстрее Simple HTML DOM.

    Вот небольшой пример на phpQuery, в котором происходит обработка заранее выбранных элементов списка ( li ):

    Подробную документацию и больше примеров найдете на официальной странице в Google Code.

    htmlSQL

    htmlSQL — экспериментальная PHP библиотека, позволяющая манипулировать HTML-разметкой посредством SQL-подобных запросов.

    Простейший пример, извлекающий атрибуты href и title всех ссылок (элементы a ) с классом list :

    Как и с обычными mysql_ функциями, воспользовавшись методами fetch_array() или fetch_objects(), мы можем получить результат выполнения данного запроса в виде привычного ассоциативного массива или объекта.

    Стоит также упомянуть о высоком быстродействии htmlSQL: часто она справляется в несколько раз быстрее phpQuery или того же Simple HTML DOM.

    Тем не менее, для сложных задач вам может не хватить функциональности, а разработка библиотеки давно прекращена. Но даже несмотря на это, она всё ещё представляет интерес для веб-разработчиков: в ряде случаев значительно удобнее использовать язык SQL вместо CSS-селекторов. Особенно когда вы не знаете, что такое CSS-селекторы ��

    Вывод

    В своем мини-исследовании мы пришли к выводу, что в большинстве случаев для парсинга лучше использовать библиотеку phpQuery: она быстрая, функциональная и современная.

    С другой стороны, для совсем простых задач логично было бы использовать стандартные модули PHP, такие как XPath, DOM или, на крайний случай, регулярные выражения.

    Что-то ещё?

    Для PHP существуют ещё десятки разнообразных библиотек и инструментов для парсинга, но в этой статье мы рассмотрели только самые интересные, функциональные и производительные.

    Подробнее о других способах парсинга средствами PHP можно прочитать в соответствующей теме на StackOverflow.

    Если вы не используете PHP, то можете ознакомится с кратким списком похожих инструментов для других языков программирования:

    Мастер Йода рекомендует:  Что такое Karma Blockchain, и как на нем зарабатывают
    Добавить комментарий