Although **phpQuery** is a [jQuery port](jQueryPortingState.md), there is extensive PHP-specific support. # Table of Contents * [Class Interfaces](#class-interfaces) * [Iterator Interface](#iterator) * [ArrayAccess](#array-access) * [Countable Interface](#countable) * [Callbacks](#callbacks) * [PHP Code Support](#php-code-support) * [Opening PHP files as DOM](#opening-php-files-as-dom) * [Inputting PHP code](#inputting-php-code) * [Outputting PHP code](#outputting-php-code) ## Class Interfaces phpQuery implements some of [Standard PHP Library (SPL)](http://pl.php.net/spl) interfaces. #### Iterator Iterator interface allows looping objects thou native PHP **foreach loop**. Example: ``` // get all direct LI elements from UL list of class 'im-the-list' $LIs = pq('ul.im-the-list > li'); foreach($LIs as $li) { pq($li)->addClass('foreached'); } ``` Now there is a catch above. Foreach loop **doesn't return phpQuery object**. Instead it returns pure DOMNode. That's how jQuery does, because not always you need **phpQuery** when you found interesting nodes. #### Array Access If you like writing arrays, with phpQuery you can still do it, thanks to the ArrayAccess interface. ``` $pq = phpQuery::newDocumentFile('somefile.html'); // print first list outer HTML print $pq['ul:first']; // change INNER HTML of second LI directly in first UL $pq['ul:first > li:eq(1)'] = 'new inner html of second LI directly in first UL'; // now look at the difference (outer vs inner) print $pq['ul:first > li:eq(1)']; // will print
  • new inner html of second LI directly in first UL
  • ``` #### Countable If used to do `count($something)` you can still do this that way, instead of eg `pq('p')->size()`. ``` // count all direct LIs in first list print count(pq('ul:first > li')); ``` ## Callbacks There is a special [Callbacks](Callbacks.md) wiki section, to which you should refer to. ## PHP Code Support #### Opening PHP files as DOM PHP files can be opened using **phpQuery::newDocumentPHP($markup)** or **phpQuery::newDocumentFilePHP($file)**. Such files are visible as DOM, where: * PHP tags beetween DOM elements are available (queryable) as ` ...code... ` * PHP tags inside attributes are HTML entities * PHP tags between DOM element's attributes are **not yet supported** #### Inputting PHP code Additional methods allows placing PHP code inside DOM. Below each method visible is it's logic equivalent. * **attrPHP**($attr, $code) * [attr](http://docs.jquery.com/Attributes/attr)($attr, "") * **addClassPHP**($code) * [addClass](http://docs.jquery.com/Attributes/addClass)("") * **beforePHP**($code) * [before](http://docs.jquery.com/Manipulation/before)("") * **afterPHP**($code) * [after](http://docs.jquery.com/Manipulation/after)("") * **prependPHP**($code) * [prepend](http://docs.jquery.com/Manipulation/prepend)("") * **appendPHP**($code) * [append](http://docs.jquery.com/Manipulation/append)("") * **php**($code) * [html](http://docs.jquery.com/Manipulation/html)("") * **wrapAllPHP**($codeBefore, $codeAfter) * [wrapAll](http://docs.jquery.com/Manipulation/wrapAll)("") * **wrapPHP**($codeBefore, $codeAfter) * [wrap](http://docs.jquery.com/Manipulation/wrap)("") * **wrapInnerPHP**($codeBefore, $codeAfter) * [wrapInner](http://docs.jquery.com/Manipulation/wrapInner)("") * **replaceWithPHP**($code) * [replaceWith](http://docs.jquery.com/Manipulation/replaceWith)("") #### Outputting PHP code Code inserted with methods above won't be returned as valid (runnable) using classic output methods such as **html()**. To make it work, **php()** method without parameter have to be used. Optionaly **phpQuery::markupToPHP($markup)** can activate tags in string outputed before. **REMEMBER** Outputing runnable code and placing it on webserver is always dangerous !