xref: /PHP-7.0/ext/spl/spl.php (revision 06fdf359)
1<?php
2
3/** @file spl.php
4 * @ingroup SPL
5 * @brief Documentation of internal classes and interfaces
6 *
7 * SPL - Standard PHP Library
8 *
9 * (c) Marcus Boerger, 2003 - 2008
10 */
11
12/** @mainpage SPL - Standard PHP Library
13 *
14 * SPL - Standard PHP Library
15 *
16 * SPL is a collection of interfaces and classes that are meant to solve
17 * standard problems and implements some efficient data access interfaces
18 * and classes. You'll find the classes documented using php code in the
19 * file spl.php or in corresponding .inc files in subdirectories examples
20 * and internal. Based on the internal implementations or the files in the
21 * examples subdirectory there are also some .php files to experiment with.
22 *
23 * The .inc files are not included automatically because they are sooner or
24 * later integrated into the extension. That means that you either need to
25 * put the code of examples/autoload.inc into your autoprepend file or that
26 * you have to point your ini setting auto_prepend_file to that file.
27 *
28 * Below is a list of interfaces/classes already availabel natively through
29 * the SPL extension grouped by category.
30 *
31 * 1) Iterators
32 *
33 * SPL offers some advanced iterator algorithms:
34 *
35 * - interface RecursiveIterator extends Iterator
36 * - interface OuterIterator extends Iterator
37 * - class RecursiveIteratorIterator implements OuterIterator
38 * - class RecursiveTreeIterator extends RecursiveIteratorIterator
39 * - abstract class FilterIterator implements OuterIterator
40 * - class ParentIterator extends FilterIterator implements RecursiveIterator
41 * - interface SeekableIterator extends Iterator
42 * - class LimitIterator implements OuterIterator
43 * - class CachingIterator implements OuterIterator
44 * - class RecursiveCachingIterator extends CachingIterator implements RecursiveIterator
45 * - class IteratorIterator implements OuterIterator
46 * - class NoRewindIterator implements OuterIterator
47 * - class EmptyIterator implements Iterator
48 * - class InfiniteIterator extends IteratorIterator
49 * - class AppendIterator implements OuterIterator
50 * - class RegexIterator extends FilterIterator
51 * - class RecursiveRegexIterator extends RegexIterator implements RecursiveIterator
52 * - class MultipleIterator extends Iterator
53 *
54 * 2) Directories and Files
55 *
56 * SPL offers two advanced directory and file handling classes:
57 *
58 * - class SplFileInfo
59 * - class DirectoryIterator extends SplFileInfo implements Iterator
60 * - class FilesystemIterator extends DirectoryIterator
61 * - class RecursiveDirectoryIterator extends FilesystemIterator implements RecursiveIterator
62 * - class GlobIterator extends FilesystemIterator implements Countable
63 * - class SplFileObject extends SplFileInfo implements RecursiveIterator, SeekableIterator
64 * - class SplTempFileObject extends SplFileObject
65 *
66 * 3) XML
67 *
68 * SPL offers an advanced XML handling class:
69 *
70 * - class SimpleXMLIterator extends simplexml_element implements RecursiveIterator
71 *
72 * 4) Array Overloading
73 *
74 * SPL offers advanced Array overloading:
75 *
76 * - class ArrayObject implements IteratorAggregate, ArrayAccess, Countable
77 * - class ArrayIterator implements Iterator, ArrayAccess, Countable, SeekableIterator
78 * - class RecursiveArrayIterator extends ArrayIterator implements RecursiveIterator
79 * - class SplFixedArray implements Iterator, ArrayAccess, Countable
80 *
81 * As the above suggest an ArrayObject creates an ArrayIterator when it comes to
82 * iteration (e.g. ArrayObject instance used inside foreach).
83 *
84 * 5) Counting
85 *
86 * - interface Countable allows to hook into the standard array function count().
87 *
88 * 6) Exception%s
89 *
90 * SPL provides a set of standard Exception classes each meant to indicate a
91 * certain problem type.
92 *
93 * - class LogicException           extends Exception
94 * - class BadFunctionCallException extends LogicException
95 * - class BadMethodCallException   extends BadFunctionCallException
96 * - class DomainException          extends LogicException
97 * - class InvalidArgumentException extends LogicException
98 * - class LengthException          extends LogicException
99 * - class OutOfRangeException      extends LogicException
100 * - class RuntimeException         extends Exception
101 * - class OutOfBoundsException     extends RuntimeException
102 * - class OverflowException        extends RuntimeException
103 * - class RangeException           extends RuntimeException
104 * - class UnderflowException       extends RuntimeException
105 *
106 * 7) Observer
107 *
108 * SPL suggests a standard way of implementing the observer pattern.
109 *
110 * - interface SplObserver
111 * - interface SplSubject
112 * - class SplObjectStorage
113 *
114 * 8) Datastructures
115 *
116 * SPL proposes a set of datastructures implemented internally.
117 *
118 * - class SplDoublyLinkedList
119 * - class SplStack                 extends SplDoublyLinkedList
120 * - class SplQueue                 extends SplDoublyLinkedList
121 *
122 * 9) @ref Examples
123 *
124 * The classes and interfaces in this group are contained as PHP code in the
125 * examples subdirectory of ext/SPL. Sooner or later they will be moved to
126 * c-code.
127 *
128 * 10) Some articles about SPL:
129 * - <a href="http://www.phpro.org/tutorials/Introduction-to-SPL.html">Introduction to Standard PHP Library (SPL)</a>
130 * - <a href="http://www.sitepoint.com/article/php5-standard-library/1">Introducing PHP 5's Standard Library</a>
131 * - <a href="http://www.ramikayyali.com/archives/2005/02/25/iterators">Iterators in PHP5</a>
132 * - <a href="http://www.phpriot.com/d/articles/php/oop/oop-with-spl-php-5-1/index.html">Advanced OOP with SPL in PHP 5</a>
133 * - <a href="http://www.devshed.com/c/a/PHP/The-Standard-PHP-Library-Part-1/">The Standard PHP Library, Part 1</a>
134 * - <a href="http://www.devshed.com/c/a/PHP/The-Standard-PHP-Library-Part-2/">The Standard PHP Library, Part 2</a>
135 * - <a href="http://www.professionelle-softwareentwicklung-mit-php5.de/erste_auflage/oop.iterators.spl.html">Die Standard PHP Library (SPL) [german]</a>
136 *
137 * 11) Talks on SPL:
138 * - SPL Update <a href="http://talks.somabo.de/200702_vancouver_spl_update.pps">[pps]</a>, <a href="http://talks.somabo.de/200702_vancouver_spl_update.pdf">[pdf]</a>
139 * - Happy SPLing <a href="http://talks.somabo.de/200509_toronto_happy_spling.pps">[pps]</a>, <a href="http://talks.somabo.de/200509_toronto_happy_spling.pdf">[pdf]</a>
140 * - From engine overloading to SPL <a href="http://talks.somabo.de/200505_cancun_from_engine_overloading_to_spl.pps">[pps]</a>, <a href="http://talks.somabo.de/200505_cancun_from_engine_overloading_to_spl.pdf">[pdf]</a>
141 * - SPL for the masses <a href="http://talks.somabo.de/200504_php_quebec_spl_for_the_masses.pps">[pps]</a>, <a href="http://talks.somabo.de/200504_php_quebec_spl_for_the_masses.pdf">[pdf]</a>
142 *
143 * 12) Debug sessions:
144 * - Debug session 1 <a href="200407_oscon_introduction_to_iterators_debug.pps">[pps]</a>, <a href="200407_oscon_introduction_to_iterators_debug.pdf">[pdf]</a>
145 * - Debug session 2 <a href="http://talks.somabo.de/200509_toronto_iterator_debug_session_1.pps">[pps]</a>, <a href="http://talks.somabo.de/200509_toronto_iterator_debug_session_1.pdf">[pdf]</a>, <a href="http://taks.somabo.de/200411_php_conference_frankfrurt_iterator_debug_session.swf">[swf]</a>
146 * - Debug session 3 <a href="http://talks.somabo.de/200509_toronto_iterator_debug_session_2.pps">[pps]</a>, <a href="http://talks.somabo.de/200509_toronto_iterator_debug_session_2.pdf">[pdf]</a>
147 *
148 * (c) Marcus Boerger, 2003 - 2007
149 */
150
151/** @defgroup ZendEngine Zend engine classes
152 *
153 * The classes and interfaces in this group are contained in the c-code of
154 * PHP's Zend engine.
155 */
156
157/** @defgroup SPL Internal classes
158 *
159 * The classes and interfaces in this group are contained in the c-code of
160 * ext/SPL.
161 */
162
163/** @defgroup Examples Example classes
164 *
165 * The classes and interfaces in this group are contained as PHP code in the
166 * examples subdirectory of ext/SPL. Sooner or later they will be moved to
167 * c-code.
168 */
169
170/** @ingroup SPL
171 * @brief Default implementation for __autoload()
172 * @since PHP 5.1
173 *
174 * @param class_name        name of class to load
175 * @param file_extensions   file extensions (use defaults if NULL)
176 */
177function spl_autoload(string $class_name, string $file_extensions = NULL) {/**/};
178
179/** @ingroup SPL
180 * @brief Manual invocation of all registerd autoload functions
181 * @since PHP 5.1
182 *
183 * @param class_name        name of class to load
184 */
185function spl_autoload_call(string $class_name) {/**/};
186
187/** @ingroup SPL
188 * @brief Register and return default file extensions for spl_autoload
189 * @since PHP 5.1
190 *
191 * @param file_extensions optional comma separated list of extensions to use in
192 *        default autoload function. If not given just return the current list.
193 * @return comma separated list of file extensions to use in default autoload
194 *        function.
195 */
196function spl_autoload_extensions($file_extensions) {/**/};
197
198/** @ingroup SPL
199 * @brief Return all registered autoload functionns
200 * @since PHP 5.1
201 *
202 * @return array of all registered autoload functions or false
203 */
204function spl_autoload_functions() {/**/};
205
206/** @ingroup SPL
207 * @brief Register given function as autoload implementation
208 * @since PHP 5.1
209 *
210 * @param autoload_function  name of function or array of object/class and
211 *                           function name to register as autoload function.
212 * @param throw              whether to throw or issue an error on failure.
213 */
214function spl_autoload_register(string $autoload_function = "spl_autoload", $throw = true) {/**/};
215
216/** @ingroup SPL
217 * @brief Unregister given function as autoload implementation
218 * @since PHP 5.1
219 *
220 * @param autoload_function  name of function or array of object/class and
221 *                           function name to unregister as autoload function.
222 */
223function spl_autoload_unregister(string $autoload_function = "spl_autoload") {/**/};
224
225/** @ingroup SPL
226 * @brief Return an array of classes and interfaces in SPL
227 *
228 * @return array containing the names of all clsses and interfaces defined in
229 *         extension SPL
230 */
231function spl_classes() {/**/};
232
233/** @ingroup SPL
234 * @brief Count the elements in an iterator
235 * @since PHP 5.1
236 *
237 * @return number of elements in an iterator
238 */
239function iterator_count(Traversable $it) {/**/};
240
241/** @ingroup SPL
242 * @brief Copy iterator elements into an array
243 * @since PHP 5.1
244 *
245 * @param it  iterator to copy
246 * @param use_keys whether touse the keys
247 * @return array with elements copied from the iterator
248 */
249function iterator_to_array(Traversable $it, $use_keys = true) {/**/};
250
251/** @ingroup ZendEngine
252 * @brief Basic Exception class.
253 * @since PHP 5.0
254 */
255class Exception
256{
257	/** The exception message */
258	protected $message;
259
260	/** The string representations as generated during construction */
261	private $string;
262
263	/** The code passed to the constructor */
264	protected $code;
265
266	/** The file name where the exception was instantiated */
267	protected $file;
268
269	/** The line number where the exception was instantiated */
270	protected $line;
271
272	/** The stack trace */
273	private $trace;
274
275	/** Prevent clone
276	 */
277	final private function __clone() {}
278
279	/** Construct an exception
280	 *
281	 * @param $message Some text describing the exception
282	 * @param $code    Some code describing the exception
283	 */
284	function __construct($message = NULL, $code = 0) {
285		if (func_num_args()) {
286			$this->message = $message;
287		}
288		$this->code = $code;
289		$this->file = __FILE__; // of throw clause
290		$this->line = __LINE__; // of throw clause
291		$this->trace = debug_backtrace();
292		$this->string = StringFormat($this);
293	}
294
295	/** @return the message passed to the constructor
296	 */
297	final public function getMessage()
298	{
299		return $this->message;
300	}
301
302	/** @return the code passed to the constructor
303	 */
304	final public function getCode()
305	{
306		return $this->code;
307	}
308
309	/** @return the name of the file where the exception was thrown
310	 */
311	final public function getFile()
312	{
313		return $this->file;
314	}
315
316	/** @return the line number where the exception was thrown
317	 */
318	final public function getLine()
319	{
320		return $this->line;
321	}
322
323	/** @return the stack trace as array
324	 */
325	final public function getTrace()
326	{
327		return $this->trace;
328	}
329
330	/** @return the stack trace as string
331	 */
332	final public function getTraceAsString()
333	{
334	}
335
336	/** @return string representation of exception
337	 */
338	public function __toString()
339	{
340		return $this->string;
341	}
342}
343
344/** @ingroup SPL
345 * @brief Exception that represents error in the program logic.
346 * @since PHP 5.1
347 *
348 * This kind of exceptions should directly leed to a fix in your code.
349 */
350class LogicException extends Exception
351{
352}
353
354/** @ingroup SPL
355 * @brief Exception thrown when a function call was illegal.
356 * @since PHP 5.1
357 */
358class BadFunctionCallException extends LogicException
359{
360}
361
362/** @ingroup SPL
363 * @brief Exception thrown when a method call was illegal.
364 * @since PHP 5.1
365 */
366class BadMethodCallException extends BadFunctionCallException
367{
368}
369
370/** @ingroup SPL
371 * @brief Exception that denotes a value not in the valid domain was used.
372 * @since PHP 5.1
373 *
374 * This kind of exception should be used to inform about domain erors in
375 * mathematical sense.
376 *
377 * @see RangeException
378 */
379class DomainException extends LogicException
380{
381}
382
383/** @ingroup SPL
384 * @brief Exception that denotes invalid arguments were passed.
385 * @since PHP 5.1
386 *
387 * @see UnexpectedValueException
388 */
389class InvalidArgumentException extends LogicException
390{
391}
392
393/** @ingroup SPL
394 * @brief Exception thrown when a parameter exceeds the allowed length.
395 * @since PHP 5.1
396 *
397 * This can be used for strings length, array size, file size, number of
398 * elements read from an Iterator and so on.
399 */
400class LengthException extends LogicException
401{
402}
403
404/** @ingroup SPL
405 * @brief Exception thrown when an illegal index was requested.
406 * @since PHP 5.1
407 *
408 * This represents errors that should be detected at compile time.
409 *
410 * @see OutOfBoundsException
411 */
412class OutOfRangeException extends LogicException
413{
414}
415
416/** @ingroup SPL
417 * @brief Exception thrown for errors that are only detectable at runtime.
418 * @since PHP 5.1
419 */
420class RuntimeException extends Exception
421{
422}
423
424/** @ingroup SPL
425 * @brief Exception thrown when an illegal index was requested.
426 * @since PHP 5.1
427 *
428 * This represents errors that cannot be detected at compile time.
429 *
430 * @see OutOfRangeException
431 */
432class OutOfBoundsException extends RuntimeException
433{
434}
435
436/** @ingroup SPL
437 * @brief Exception thrown to indicate arithmetic/buffer overflow.
438 * @since PHP 5.1
439 */
440class OverflowException extends RuntimeException
441{
442}
443
444/** @ingroup SPL
445 * @brief Exception thrown to indicate range errors during program execution.
446 * @since PHP 5.1
447 *
448 * Normally this means there was an arithmetic error other than under/overflow.
449 * This is the runtime version of DomainException.
450 *
451 * @see DomainException
452 */
453class RangeException extends RuntimeException
454{
455}
456
457/** @ingroup SPL
458 * @brief Exception thrown to indicate arithmetic/buffer underflow.
459 * @since PHP 5.1
460 */
461class UnderflowException extends RuntimeException
462{
463}
464
465/** @ingroup SPL
466 * @brief Exception thrown to indicate an unexpected value.
467 * @since PHP 5.1
468 *
469 * Typically this happens when a function calls another function and espects
470 * the return value to be of a certain type or value not including arithmetic
471 * or buffer related errors.
472 *
473 * @see InvalidArgumentException
474 */
475class UnexpectedValueException extends RuntimeException
476{
477}
478
479/** @ingroup ZendEngine
480 * @brief Interface to override array access of objects.
481 * @since PHP 5.0
482 */
483interface ArrayAccess
484{
485	/** @param $offset to modify
486	 * @param $value new value
487	 */
488	function offsetSet($offset, $value);
489
490	/** @param $offset to retrieve
491	 * @return value at given offset
492	 */
493	function offsetGet($offset);
494
495	/** @param $offset to delete
496	 */
497	function offsetUnset($offset);
498
499	/** @param $offset to check
500	 * @return whether the offset exists.
501	 */
502	function offsetExists($offset);
503}
504
505/** @ingroup ZendEngine
506 * @brief Interface to detect a class is traversable using foreach.
507 * @since PHP 5.0
508 *
509 * Abstract base interface that cannot be implemented alone. Instead it
510 * must be implemented by either IteratorAggregate or Iterator.
511 *
512 * @note Internal classes that implement this interface can be used in a
513 * foreach construct and do not need to implement IteratorAggregate or
514 * Iterator.
515 *
516 * @note This is an engine internal interface which cannot be implemented
517 * in PHP scripts. Either IteratorAggregate or Iterator must be used
518 * instead.
519 */
520interface Traversable
521{
522}
523
524/** @ingroup ZendEngine
525 * @brief Interface to create an external Iterator.
526 * @since PHP 5.0
527 *
528 * @note This is an engine internal interface.
529 */
530interface IteratorAggregate extends Traversable
531{
532	/** @return an Iterator for the implementing object.
533	 */
534	function getIterator();
535}
536
537/** @ingroup ZendEngine
538 * @brief Basic iterator
539 * @since PHP 5.0
540 *
541 * Interface for external iterators or objects that can be iterated
542 * themselves internally.
543 *
544 * @note This is an engine internal interface.
545 */
546interface Iterator extends Traversable
547{
548	/** Rewind the Iterator to the first element.
549	 */
550	function rewind();
551
552	/** Return the current element.
553	 */
554	function current();
555
556	/** Return the key of the current element.
557	 */
558	function key();
559
560	/** Move forward to next element.
561	 */
562	function next();
563
564	/** Check if there is a current element after calls to rewind() or next().
565	 */
566	function valid();
567}
568
569/** @ingroup SPL
570 * @brief This Interface allows to hook into the global count() function.
571 * @since PHP 5.1
572 */
573interface Countable
574{
575	/** @return the number the global function count() should show
576	 */
577	function count();
578}
579
580/** @ingroup ZendEngine
581 * @brief Interface for customized serializing
582 * @since 5.1
583 *
584 * Classes that implement this interface no longer support __sleep() and
585 * __wakeup(). The method serialized is called whenever an instance needs to
586 * be serialized. This does not invoke __destruct() or has any other side
587 * effect unless programmed inside the method. When the data is unserialized
588 * the class is known and the appropriate unserialize() method is called as a
589 * constructor instead of calling __construct(). If you need to execute the
590 * standard constructor you may do so in the method.
591 */
592interface Serializable
593{
594	/**
595	 * @return string representation of the instance
596	 */
597	function serialize();
598
599	/**
600	 * @note This is a constructor
601	 *
602	 * @param $serialized data read from stream to construct the instance
603	 */
604	function unserialize($serialized);
605}
606
607/** @ingroup SPL
608 * @brief An Array wrapper
609 * @since PHP 5.0
610 * @version 1.2
611 *
612 * This array wrapper allows to recursively iterate over Arrays and public
613 * Object properties.
614 *
615 * @see ArrayIterator
616 */
617class ArrayObject implements IteratorAggregate, ArrayAccess, Countable
618{
619	/** Properties of the object have their normal functionality
620	 * when accessed as list (var_dump, foreach, etc.) */
621	const STD_PROP_LIST     = 0x00000001;
622	/** Array indices can be accessed as properties in read/write */
623	const ARRAY_AS_PROPS    = 0x00000002;
624
625	/** Construct a new array iterator from anything that has a hash table.
626	 * That is any Array or Object.
627	 *
628	 * @param $array the array to use.
629	 * @param $flags see setFlags().
630	 * @param $iterator_class class used in getIterator()
631	 */
632	function __construct($array, $flags = 0, $iterator_class = "ArrayIterator") {/**/}
633
634	/** Set behavior flags.
635	 *
636	 * @param $flags bitmask as follows:
637	 *        0 set: properties of the object have their normal functionality
638	 *               when accessed as list (var_dump, foreach, etc.)
639	 *        1 set: array indices can be accessed as properties in read/write
640	 */
641	function setFlags($flags) {/**/}
642
643	/** @return current flags
644	 */
645	function getFlags() {/**/}
646
647	/** Sort the entries by values.
648	 */
649	function asort() {/**/}
650
651	/** Sort the entries by key.
652	 */
653	function ksort() {/**/}
654
655	/** Sort the entries by values using user defined function.
656	 */
657	function uasort(mixed cmp_function) {/**/}
658
659	/** Sort the entries by key using user defined function.
660	 */
661	function uksort(mixed cmp_function) {/**/}
662
663	/** Sort the entries by values using "natural order" algorithm.
664	 */
665	function natsort() {/**/}
666
667	/** Sort the entries by values using case insensitive "natural order" algorithm.
668	 */
669	function natcasesort() {/**/}
670
671	/** @param $array new array or object
672	 */
673	function exchangeArray($array) {/**/}
674
675	/** @return the iterator which is an ArrayIterator object connected to
676	 * this object.
677	 */
678	function getIterator() {/**/}
679
680	/** @param $index offset to inspect
681	 * @return whetehr offset $index esists
682	 */
683	function offsetExists($index) {/**/}
684
685	/** @param $index offset to return value for
686	 * @return value at offset $index
687	 */
688	function offsetGet($index) {/**/}
689
690	/** @param $index index to set
691	 * @param $newval new value to store at offset $index
692	 */
693	function offsetSet($index, $newval) {/**/}
694
695	/** @param $index offset to unset
696	 */
697	function offsetUnset($index) {/**/}
698
699	/** @param $value is appended as last element
700	 * @warning this method cannot be called when the ArrayObject refers to
701	 *          an object.
702	 */
703	function append($value) {/**/}
704
705	/** @return a \b copy of the array
706	 * @note when the ArrayObject refers to an object then this method
707	 *       returns an array of the public properties.
708	 */
709	function getArrayCopy() {/**/}
710
711	/** @return the number of elements in the array or the number of public
712	 * properties in the object.
713	 */
714	function count() {/**/}
715
716	/* @param $iterator_class new class used in getIterator()
717	 */
718	function setIteratorClass($itertor_class) {/**/}
719
720	/* @return class used in getIterator()
721	 */
722	function getIteratorClass() {/**/}
723}
724
725/** @ingroup SPL
726 * @brief An Array iterator
727 * @since PHP 5.0
728 * @version 1.2
729 *
730 * This iterator allows to unset and modify values and keys while iterating
731 * over Arrays and Objects.
732 *
733 * When you want to iterate over the same array multiple times you need to
734 * instanciate ArrayObject and let it create ArrayIterator instances that
735 * refer to it either by using foreach or by calling its getIterator()
736 * method manually.
737 */
738class ArrayIterator implements SeekableIterator, ArrayAccess, Countable
739{
740	/** Properties of the object have their normal functionality
741	 * when accessed as list (var_dump, foreach, etc.) */
742	const STD_PROP_LIST  = 0x00000001;
743	/** Array indices can be accessed as properties in read/write */
744	const ARRAY_AS_PROPS = 0x00000002;
745
746	/** Construct a new array iterator from anything that has a hash table.
747	 * That is any Array or Object.
748	 *
749	 * @param $array the array to use.
750	 * @param $flags see setFlags().
751	 */
752	function __construct($array, $flags = 0) {/**/}
753
754	/** Set behavior flags.
755	 *
756	 * @param $flags bitmask as follows:
757	 *        0 set: properties of the object have their normal functionality
758	 *               when accessed as list (var_dump, foreach, etc.)
759	 *        1 set: array indices can be accessed as properties in read/write
760	 */
761	function setFlags($flags) {/**/}
762
763	/**
764	 * @return current flags
765	 */
766	function getFlags() {/**/}
767
768	/** Sort the entries by values.
769	 */
770	function asort() {/**/}
771
772	/** Sort the entries by key.
773	 */
774	function ksort() {/**/}
775
776	/** Sort the entries by values using user defined function.
777	 */
778	function uasort(mixed cmp_function) {/**/}
779
780	/** Sort the entries by key using user defined function.
781	 */
782	function uksort(mixed cmp_function) {/**/}
783
784	/** Sort the entries by values using "natural order" algorithm.
785	 */
786	function natsort() {/**/}
787
788	/** Sort the entries by values using case insensitive "natural order" algorithm.
789	 */
790	function natcasesort() {/**/}
791
792	/** @param $index offset to inspect
793	 * @return whetehr offset $index esists
794	 */
795	function offsetExists($index) {/**/}
796
797	/** @param $index offset to return value for
798	 * @return value at offset $index
799	 */
800	function offsetGet($index) {/**/}
801
802	/** @param $index index to set
803	 * @param $newval new value to store at offset $index
804	 */
805	function offsetSet($index, $newval) {/**/}
806
807	/** @param $index offset to unset
808	 */
809	function offsetUnset($index) {/**/}
810
811	/** @param $value is appended as last element
812	 * @warning this method cannot be called when the ArrayIterator refers to
813	 *          an object.
814	 */
815	function append($value) {/**/}
816
817	/** @return a \b copy of the array
818	 * @note when the ArrayIterator refers to an object then this method
819	 *       returns an array of the public properties.
820	 */
821	function getArrayCopy() {/**/}
822
823	/** @param $position offset to seek to
824	 * @throw OutOfBoundsException if $position is invalid
825	 */
826	function seek($position) {/**/}
827
828	/** @return the number of elements in the array or the number of public
829	 * properties in the object.
830	 */
831	function count() {/**/}
832
833	/** @copydoc Iterator::rewind */
834	function rewind() {/**/}
835
836	/** @copydoc Iterator::valid */
837	function valid() {/**/}
838
839	/** @copydoc Iterator::current */
840	function current() {/**/}
841
842	/** @copydoc Iterator::key */
843	function key() {/**/}
844
845	/** @copydoc Iterator::next */
846	function next() {/**/}
847}
848
849/** @ingroup SPL
850 * @brief File info class
851 * @since PHP 5.1.3
852 */
853class SplFileInfo
854{
855	/** Construct a file info object
856	 *
857	 * @param $file_name path or file name
858	 */
859	function __construct($file_name) {/**/}
860
861	/** @return the path part only.
862	 */
863	function getPath() {/**/}
864
865	/** @return the filename only.
866	 */
867	function getFilename() {/**/}
868
869	/** @return SplFileInfo created for the file
870	 * @param class_name name of class to instantiate
871	 * @see SplFileInfo::setInfoClass()
872	 */
873	function getFileInfo(string class_name = NULL) {/**/}
874
875	/** @return The current entries path and file name.
876	 */
877	function getPathname() {/**/}
878
879	/** @return SplFileInfo created for the path
880	 * @param class_name name of class to instantiate
881	 * @see SplFileInfo::setInfoClass()
882	 */
883	function getPathInfo(string class_name = NULL) {/**/}
884
885	/** @return The current entry's permissions.
886	 */
887	function getPerms() {/**/}
888
889	/** @return The current entry's inode.
890	 */
891	function getInode() {/**/}
892
893	/** @return The current entry's size in bytes .
894	 */
895	function getSize() {/**/}
896
897	/** @return The current entry's owner name.
898	 */
899	function getOwner() {/**/}
900
901	/** @return The current entry's group name.
902	 */
903	function getGroup() {/**/}
904
905	/** @return The current entry's last access time.
906	 */
907	function getATime() {/**/}
908
909	/** @return The current entry's last modification time.
910	 */
911	function getMTime() {/**/}
912
913	/** @return The current entry's last change time.
914	 */
915	function getCTime() {/**/}
916
917	/** @return The current entry's file type.
918	 */
919	function getType() {/**/}
920
921	/** @return Whether the current entry is writeable.
922	 */
923	function isWritable() {/**/}
924
925	/** @return Whether the current entry is readable.
926	 */
927	function isReadable() {/**/}
928
929	/** @return Whether the current entry is executable.
930	 */
931	function isExecutable() {/**/}
932
933	/** @return Whether the current entry is .
934	 */
935	function isFile() {/**/}
936
937	/** @return Whether the current entry is a directory.
938	 */
939	function isDir() {/**/}
940
941	/** @return whether the current entry is a link.
942	 */
943	function isLink() {/**/}
944
945	/** @return target of link.
946	 */
947	function getLinkTarget() {/**/}
948
949	/** @return The resolved path
950	 */
951	function getRealPath() {/**/}
952
953	/** @return getPathname()
954	 */
955	function __toString() {/**/}
956
957	/** Open the current file as a SplFileObject instance
958	 *
959	 * @param mode              open mode
960	 * @param use_include_path  whether to search include paths (don't use)
961	 * @param context           resource context to passed to open function
962	 * @throw RuntimeException  if file cannot be opened (e.g. insufficient
963	 *                          access rights).
964	 * @return The opened file as a SplFileObject instance
965	 *
966	 * @see SplFileObject
967	 * @see SplFileInfo::setFileClass()
968	 * @see file()
969	 */
970	function openFile($mode = 'r', $use_include_path = false, $context = NULL) {/**/}
971
972	/** @param class_name name of class used with openFile(). Must be derived
973	 * from SPLFileObject.
974	 */
975	function setFileClass(string class_name = "SplFileObject") {/**/}
976
977	/** @param class_name name of class used with getFileInfo(), getPathInfo().
978	 *                     Must be derived from SplFileInfo.
979	 */
980	function setInfoClass(string class_name = "SplFileInfo") {/**/}
981}
982
983/** @ingroup SPL
984 * @brief Directory iterator
985 * @version 1.1
986 * @since PHP 5.0
987 */
988class DirectoryIterator extends SplFileInfo implements Iterator
989{
990	/** Construct a directory iterator from a path-string.
991	 *
992	 * @param $path directory to iterate.
993	 */
994	function __construct($path) {/**/}
995
996	/** @copydoc Iterator::rewind */
997	function rewind() {/**/}
998
999	/** @copydoc Iterator::valid */
1000	function valid() {/**/}
1001
1002	/** @return index of entry
1003	 */
1004	function key() {/**/}
1005
1006	/** @return $this
1007	 */
1008	function current() {/**/}
1009
1010	/** @copydoc Iterator::next */
1011	function next() {/**/}
1012
1013	/** @return Whether the current entry is either '.' or '..'.
1014	 */
1015	function isDot() {/**/}
1016
1017	/** @return whether the current entry is a link.
1018	 */
1019	function isLink() {/**/}
1020
1021	/** @return getFilename()
1022	 */
1023	function __toString() {/**/}
1024}
1025
1026/** @ingroup SPL
1027 * @brief recursive directory iterator
1028 * @version 1.1
1029 * @since PHP 5.0
1030 */
1031class RecursiveDirectoryIterator extends DirectoryIterator implements RecursiveIterator
1032{
1033	const CURRENT_AS_FILEINFO   0x00000000; /* make RecursiveDirectoryTree::current() return SplFileInfo */
1034	const CURRENT_AS_SELF       0x00000010; /* make RecursiveDirectoryTree::current() return getSelf() */
1035	const CURRENT_AS_PATHNAME   0x00000020; /* make RecursiveDirectoryTree::current() return getPathname() */
1036
1037	const KEY_AS_PATHNAME       0x00000000; /* make RecursiveDirectoryTree::key() return getPathname() */
1038	const KEY_AS_FILENAME       0x00000100; /* make RecursiveDirectoryTree::key() return getFilename() */
1039
1040	const NEW_CURRENT_AND_KEY   0x00000100; /* CURRENT_AS_FILEINFO + KEY_AS_FILENAME */
1041
1042	/** Construct a directory iterator from a path-string.
1043	 *
1044	 * @param $path   directory to iterate.
1045	 * @param $flags  open flags
1046	 * - CURRENT_AS_FILEINFO
1047	 * - CURRENT_AS_SELF
1048	 * - CURRENT_AS_PATHNAME
1049	 * - KEY_AS_PATHNAME
1050	 * - KEY_AS_FILENAME
1051	 * - NEW_CURRENT_AND_KEY
1052	 */
1053	function __construct($path, $flags = 0) {/**/}
1054
1055	/** @return getPathname() or getFilename() depending on flags
1056	 */
1057	function key() {/**/}
1058
1059	/** @return getFilename() or getFileInfo() depending on flags
1060	 */
1061	function current() {/**/}
1062
1063	/** @return whether the current is a directory (not '.' or '..').
1064	 */
1065	function hasChildren() {/**/}
1066
1067	/** @return a RecursiveDirectoryIterator for the current entry.
1068	 */
1069	function getChildren() {/**/}
1070
1071	/** @return sub path only (without main path)
1072	 */
1073	function getSubPath() {/**/}
1074
1075	/** @return the current sub path
1076	 */
1077	function getSubPathname() {/**/}
1078}
1079
1080/** @ingroup SPL
1081 * @brief recursive SimpleXML_Element iterator
1082 * @since PHP 5.0
1083 *
1084 * The SimpleXMLIterator implements the RecursiveIterator interface. This
1085 * allows iteration over all elements using foreach or an appropriate while
1086 * construct, just like SimpleXMLElement does. When using the foreach construct,
1087 * you will also iterate over the subelements. For every element which
1088 * has subelements, hasChildren() returns true.  This will trigger a call to
1089 * getChildren() which returns the iterator for that sub element.
1090 */
1091class SimpleXMLIterator extends SimpleXMLElement implements RecursiveIterator, Countable
1092{
1093	/** @return whether the current node has sub nodes.
1094	 */
1095	function hasChildren() {/**/}
1096
1097	/** @return a SimpleXMLIterator for the current node.
1098	 */
1099	function getChildren() {/**/}
1100
1101	/** @return number of elements/attributes seen with foreach()
1102	 */
1103	function count() {/**/}
1104
1105	/** @copydoc Iterator::rewind */
1106	function rewind() {/**/}
1107
1108	/** @copydoc Iterator::valid */
1109	function valid() {/**/}
1110
1111	/** @copydoc Iterator::current */
1112	function current() {/**/}
1113
1114	/** @copydoc Iterator::key */
1115	function key() {/**/}
1116
1117	/** @copydoc Iterator::next */
1118	function next() {/**/}
1119}
1120
1121/** @ingroup SPL
1122 * @brief Observer of the observer pattern
1123 * @since PHP 5.1
1124 *
1125 * For a detailed explanation see Observer pattern in
1126 * <em>
1127 * Gamma, Helm, Johnson, Vlissides<br />
1128 * Design Patterns
1129 * </em>
1130 */
1131interface SplObserver
1132{
1133	/** Called from the subject (i.e. when it's value has changed).
1134	 * @param $subject the callee
1135	 */
1136	function update(SplSubject $subject);
1137}
1138
1139/** @ingroup SPL
1140 * @brief Subject to the observer pattern
1141 * @since PHP 5.1
1142 * @see Observer
1143 */
1144interface SplSubject
1145{
1146	/** @param $observer new observer to attach
1147	 */
1148	function attach(SplObserver $observer);
1149
1150	/** @param $observer existing observer to detach
1151	 * @note a non attached observer shouldn't result in a warning or similar
1152	 */
1153	function detach(SplObserver $observer);
1154
1155	/** Notify all observers
1156	 */
1157	function notify();
1158}
1159
1160?>
1161