php-basics/doc/guides/overview/datastructures.html

453 lines
18 KiB
HTML
Raw Normal View History

2024-03-26 20:10:30 +01:00
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>PHP Basics</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<base href="../../">
<link rel="icon" href="images/favicon.ico"/>
<link rel="stylesheet" href="css/normalize.css">
<link rel="stylesheet" href="css/base.css">
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@100;200;300;400;600;700&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Source+Code+Pro:wght@400;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="css/template.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.0/css/all.min.css" integrity="sha256-ybRkN9dBjhcS2qrW1z+hfCxq+1aBdwyQM5wlQoQVt/0=" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs@1.23.0/themes/prism-okaidia.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs@1.23.0/plugins/line-numbers/prism-line-numbers.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs@1.23.0/plugins/line-highlight/prism-line-highlight.css">
<script src="https://cdn.jsdelivr.net/npm/fuse.js@3.4.6"></script>
<script src="https://cdn.jsdelivr.net/npm/css-vars-ponyfill@2"></script>
<script src="js/template.js"></script>
<script src="js/search.js"></script>
<script defer src="js/searchIndex.js"></script>
</head>
<body id="top">
<header class="phpdocumentor-header phpdocumentor-section">
<h1 class="phpdocumentor-title"><a href="" class="phpdocumentor-title__link">PHP Basics</a></h1>
<input class="phpdocumentor-header__menu-button" type="checkbox" id="menu-button" name="menu-button" />
<label class="phpdocumentor-header__menu-icon" for="menu-button">
<i class="fas fa-bars"></i>
</label>
<section data-search-form class="phpdocumentor-search">
<label>
<span class="visually-hidden">Search for</span>
<svg class="phpdocumentor-search__icon" width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="7.5" cy="7.5" r="6.5" stroke="currentColor" stroke-width="2"/>
<line x1="12.4892" y1="12.2727" x2="19.1559" y2="18.9393" stroke="currentColor" stroke-width="3"/>
</svg>
<input type="search" class="phpdocumentor-field phpdocumentor-search__field" placeholder="Loading .." disabled />
</label>
</section>
<nav class="phpdocumentor-topnav">
<ul class="phpdocumentor-topnav__menu">
<li class="phpdocumentor-topnav__menu-item -menu">
<a href="https://packagist.org/packages/opencultureconsulting/basics">
<span>
<i class="fab fa-php"></i>
</span>
</a>
</li>
<li class="phpdocumentor-topnav__menu-item -menu">
<a href="https://github.com/opencultureconsulting/php-basics">
<span>
<i class="fab fa-github"></i>
</span>
</a>
</li>
</ul>
</nav>
</header>
<main class="phpdocumentor">
<div class="phpdocumentor-section">
<input class="phpdocumentor-sidebar__menu-button" type="checkbox" id="sidebar-button" name="sidebar-button" />
<label class="phpdocumentor-sidebar__menu-icon" for="sidebar-button">
Menu
</label>
<aside class="phpdocumentor-column -three phpdocumentor-sidebar">
<section class="phpdocumentor-sidebar__category -documentation">
<h2 class="phpdocumentor-sidebar__category-header">Documentation</h2>
<h4 class="phpdocumentor-sidebar__root-namespace">
<a href="guides/overview/index.html#overview" class="">Overview</a>
</h4>
<ul class="phpdocumentor-list">
<li>
<a href="guides/overview/datastructures.html#typed-datastructures" class="">Typed Datastructures</a>
</li>
<li>
<a href="guides/overview/errorhandlers.html#error-and-exception-handlers" class="">Error and Exception Handlers</a>
</li>
<li>
<a href="guides/overview/interfaces.html#interface-traits" class="">Interface Traits</a>
</li>
<li>
<a href="guides/overview/traits.html#traits" class="">Traits</a>
</li>
</ul>
<h4 class="phpdocumentor-sidebar__root-namespace">
<a href="guides/usage/index.html#user-guide" class="">User Guide</a>
</h4>
<ul class="phpdocumentor-list">
<li>
<a href="guides/usage/requirements.html#requirements" class="">Requirements</a>
</li>
<li>
<a href="guides/usage/installation.html#installation" class="">Installation</a>
</li>
</ul>
<h4 class="phpdocumentor-sidebar__root-namespace">
<a href="guides/changelog.html#changelog" class="">Changelog</a>
</h4>
</section>
<section class="phpdocumentor-sidebar__category -namespaces">
<h2 class="phpdocumentor-sidebar__category-header">Namespaces</h2>
<h4 class="phpdocumentor-sidebar__root-namespace">
<a href="namespaces/occ.html" class="">OCC</a>
</h4>
<ul class="phpdocumentor-list">
<li>
<a href="namespaces/occ-basics.html" class="">Basics</a>
</li>
</ul>
</section>
<section class="phpdocumentor-sidebar__category -packages">
<h2 class="phpdocumentor-sidebar__category-header">Packages</h2>
<h4 class="phpdocumentor-sidebar__root-namespace">
<a href="packages/Basics.html" class="">Basics</a>
</h4>
<ul class="phpdocumentor-list">
<li>
<a href="packages/Basics-DataStructures.html" class="">DataStructures</a>
</li>
<li>
<a href="packages/Basics-ErrorHandlers.html" class="">ErrorHandlers</a>
</li>
<li>
<a href="packages/Basics-Interfaces.html" class="">Interfaces</a>
</li>
<li>
<a href="packages/Basics-Traits.html" class="">Traits</a>
</li>
</ul>
</section>
<section class="phpdocumentor-sidebar__category -reports">
<h2 class="phpdocumentor-sidebar__category-header">Reports</h2>
<h3 class="phpdocumentor-sidebar__root-package"><a href="reports/deprecated.html">Deprecated</a></h3>
<h3 class="phpdocumentor-sidebar__root-package"><a href="reports/errors.html">Errors</a></h3>
<h3 class="phpdocumentor-sidebar__root-package"><a href="reports/markers.html">Markers</a></h3>
</section>
<section class="phpdocumentor-sidebar__category -indices">
<h2 class="phpdocumentor-sidebar__category-header">Indices</h2>
<h3 class="phpdocumentor-sidebar__root-package"><a href="indices/files.html">Files</a></h3>
</section>
</aside>
<div class="phpdocumentor-column -nine phpdocumentor-content">
<div class="section" id="typed-datastructures">
2024-07-11 13:08:56 +02:00
<h1>Typed Datastructures</h1>
2024-03-26 20:10:30 +01:00
<div class="admonition-wrapper">
<div class="admonition admonition-sidebar"><p class="sidebar-title">Table of Contents</p>
2024-07-11 13:08:56 +02:00
<div class="contents">
<ul class="phpdocumentor-list">
<li class="toc-item">
<a href="guides/overview/datastructures.html#strictcollection">StrictCollection</a>
</li>
<li class="toc-item">
<a href="guides/overview/datastructures.html#strictarray">StrictArray</a>
</li>
<li class="toc-item">
<a href="guides/overview/datastructures.html#strictlist">StrictList</a>
</li>
<li class="toc-item">
<a href="guides/overview/datastructures.html#strictqueue">StrictQueue</a>
</li>
<li class="toc-item">
<a href="guides/overview/datastructures.html#strictstack">StrictStack</a>
</li>
</ul>
</div>
2024-03-26 20:10:30 +01:00
</div>
</div>
2024-07-11 13:08:56 +02:00
<p>The datastructures in this package are derived from their respective <a href="https://www.php.net/spl.datastructures">Standard PHP Library (SPL) counterparts</a> which they extend by the option to control the data types of items those
2024-03-27 12:19:43 +01:00
datastructures can hold.</p>
2024-07-11 13:08:56 +02:00
<p>To restrict allowed data types for items provide the constructor with an array of atomic types or fully qualified class
names (FQCN) you want to allow as item types. Available atomic types are <code>array</code>
, <code>bool</code>
, <code>callable</code>
, <code>countable</code>
,
<code>float</code>
(or <code>double</code>
), <code>int</code>
(or <code>integer</code>
or <code>long</code>
), <code>iterable</code>
, <code>null</code>
, <code>numeric</code>
, <code>object</code>
, <code>resource</code>
, <code>scalar</code>
and <code>string</code>
2024-03-26 20:10:30 +01:00
.</p>
2024-07-11 13:08:56 +02:00
<p>Trying to add an item with a data type not on the list of allowed types to a strict datastructure will result in an
<a href="classes/OCC-Basics-DataStructures-Exceptions-InvalidDataTypeException.html"><abbr title="\OCC\Basics\DataStructures\Exceptions\InvalidDataTypeException">InvalidDataTypeException</abbr></a>
being thrown.</p>
<p>All strict datastructures inherit the implementation of the <a href="https://www.php.net/arrayaccess">\ArrayAccess</a>,
2024-03-27 12:19:43 +01:00
<a href="https://www.php.net/countable">\Countable</a> and <a href="https://www.php.net/serializable">\Serializable</a> interfaces. All
2024-07-11 13:08:56 +02:00
but <code>StrictCollection</code>
also implement a <a href="https://www.php.net/traversable">\Traversable</a> interface.</p>
<blockquote>
<p>Examples:</p>
<pre><code class="language-php">// create a collection of strings
$stringCollection = new StrictCollection([&#039;string&#039;]);</code></pre>
<pre><code class="language-php">// create a queue of PSR-15 middlewares
$middlewareQueue = new StrictQueue([&#039;Psr\Http\Server\MiddlewareInterface&#039;]);</code></pre>
</blockquote>
2024-03-26 20:10:30 +01:00
<div class="admonition-wrapper">
<div class="admonition admonition-sidebar"><p class="sidebar-title">API Documentation</p>
2024-03-27 12:19:43 +01:00
<ul>
<li><a href="classes/OCC-Basics-DataStructures-StrictCollection.html"><abbr title="\OCC\Basics\DataStructures\StrictCollection">StrictCollection</abbr></a>
</li>
</ul>
2024-03-26 20:10:30 +01:00
</div>
</div>
2024-03-31 17:41:04 +02:00
<div class="section" id="strictcollection">
2024-07-11 13:08:56 +02:00
<h2>StrictCollection</h2>
<p><em>A type-sensitive, unsorted collection of items.</em>
</p>
2024-03-31 17:41:04 +02:00
2024-07-11 13:08:56 +02:00
<p>Holds items as key/value pairs where keys identify the items and have to be valid array keys while values can be of any
2024-03-27 12:19:43 +01:00
controlled type. The collection can be accessed like an array, but not traversed because it has no particular order.</p>
2024-07-11 13:08:56 +02:00
2024-03-27 12:19:43 +01:00
<div class="phpdocumentor-admonition note">
<svg class="phpdocumentor-admonition__icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z"></path></svg>
<article>
2024-07-11 13:08:56 +02:00
<p>Internally it holds the items in the <code>$_data</code>
array, the same as most <a href="guides/overview/interfaces.html">Interface Traits</a> and <a href="guides/overview/traits.html">Traits</a> of this
2024-03-31 17:41:04 +02:00
package.</p>
2024-07-11 13:08:56 +02:00
2024-03-27 12:19:43 +01:00
</article>
</div>
<div class="admonition-wrapper">
<div class="admonition admonition-sidebar"><p class="sidebar-title">API Documentation</p>
<ul>
<li><a href="classes/OCC-Basics-DataStructures-StrictArray.html"><abbr title="\OCC\Basics\DataStructures\StrictArray">StrictArray</abbr></a>
</li>
</ul>
</div>
</div>
2024-03-31 17:41:04 +02:00
</div>
<div class="section" id="strictarray">
2024-07-11 13:08:56 +02:00
<h2>StrictArray</h2>
2024-03-31 17:41:04 +02:00
2024-07-11 13:08:56 +02:00
<p><em>A type-sensitive, traversable array of items.</em>
</p>
<p>Holds items as key/value pairs where keys identify the items and have to be valid array keys while values can be of any
2024-03-27 12:19:43 +01:00
controlled type. The array can be accessed and traversed just like any other array.</p>
2024-07-11 13:08:56 +02:00
2024-03-26 20:10:30 +01:00
<div class="phpdocumentor-admonition note">
<svg class="phpdocumentor-admonition__icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z"></path></svg>
<article>
2024-07-11 13:08:56 +02:00
<p>Internally it holds the items in the <code>$_data</code>
array, the same as most <a href="guides/overview/interfaces.html">Interface Traits</a> and <a href="guides/overview/traits.html">Traits</a> of this
2024-03-31 17:41:04 +02:00
package.</p>
2024-07-11 13:08:56 +02:00
2024-03-26 20:10:30 +01:00
</article>
</div>
<div class="admonition-wrapper">
<div class="admonition admonition-sidebar"><p class="sidebar-title">API Documentation</p>
2024-03-27 12:19:43 +01:00
<ul>
<li><a href="classes/OCC-Basics-DataStructures-StrictList.html"><abbr title="\OCC\Basics\DataStructures\StrictList">StrictList</abbr></a>
</li>
</ul>
2024-03-26 20:10:30 +01:00
</div>
</div>
</div>
2024-03-31 17:41:04 +02:00
<div class="section" id="strictlist">
2024-07-11 13:08:56 +02:00
<h2>StrictList</h2>
<p><em>A type-sensitive, taversable list of items.</em>
</p>
2024-03-26 20:10:30 +01:00
2024-07-11 13:08:56 +02:00
<p>Extends <a href="https://www.php.net/spldoublylinkedlist">\SplDoublyLinkedList</a> with an option to restrict the allowed data
2024-03-31 17:41:04 +02:00
types for list items. The list can be accessed and traversed like an array, but has only consecutive numerical keys.</p>
2024-07-11 13:08:56 +02:00
2024-03-26 20:10:30 +01:00
<div class="admonition-wrapper">
<div class="admonition admonition-sidebar"><p class="sidebar-title">API Documentation</p>
2024-03-27 12:19:43 +01:00
<ul>
<li><a href="classes/OCC-Basics-DataStructures-StrictQueue.html"><abbr title="\OCC\Basics\DataStructures\StrictQueue">StrictQueue</abbr></a>
</li>
</ul>
2024-03-26 20:10:30 +01:00
</div>
</div>
2024-03-31 17:41:04 +02:00
</div>
<div class="section" id="strictqueue">
2024-07-11 13:08:56 +02:00
<h2>StrictQueue</h2>
<p><em>A type-sensitive, taversable queue (FIFO) of items.</em>
</p>
2024-03-31 17:41:04 +02:00
2024-07-11 13:08:56 +02:00
<p>Extends <a href="https://www.php.net/splqueue">\SplQueue</a> with an option to restrict the allowed data types for queue items.
2024-03-27 12:19:43 +01:00
The queue can be accessed and traversed like an array, but has only consecutive numerical keys. Traversal follows the
first-in, first-out (FIFO) principle meaning that items are returned in the same order they were added to the queue.</p>
2024-07-11 13:08:56 +02:00
<p>It is recommended to use the <code>StrictQueue::enqueue()</code>
and <code>StrictQueue::dequeue()</code>
alias methods when working with a
2024-03-27 12:19:43 +01:00
queue, because those will ensure proper FIFO behavior and remove items while traversing.</p>
2024-07-11 13:08:56 +02:00
2024-03-26 20:10:30 +01:00
<div class="admonition-wrapper">
<div class="admonition admonition-sidebar"><p class="sidebar-title">API Documentation</p>
2024-03-27 12:19:43 +01:00
<ul>
<li><a href="classes/OCC-Basics-DataStructures-StrictStack.html"><abbr title="\OCC\Basics\DataStructures\StrictStack">StrictStack</abbr></a>
</li>
</ul>
2024-03-26 20:10:30 +01:00
</div>
</div>
2024-03-31 17:41:04 +02:00
</div>
<div class="section" id="strictstack">
2024-07-11 13:08:56 +02:00
<h2>StrictStack</h2>
<p><em>A type-sensitive, taversable stack (LIFO) of items.</em>
</p>
2024-03-31 17:41:04 +02:00
2024-07-11 13:08:56 +02:00
<p>Extends <a href="https://www.php.net/splstack">\SplStack</a> with an option to restrict the allowed data types for stack items.
2024-03-27 12:19:43 +01:00
The stack can be accessed and traversed like an array, but has only consecutive numerical keys. Traversal follows the
last-in, first-out (LIFO) principle meaning that items are returned in the reversed order they were added to the stack.</p>
2024-07-11 13:08:56 +02:00
<p>It is recommended to use the <code>StrictStack::stack()</code>
and <code>StrictStack::unstack()</code>
alias methods when working with a
2024-03-27 12:19:43 +01:00
stack, because those will ensure proper LIFO behavior and remove items while traversing.</p>
2024-07-11 13:08:56 +02:00
2024-03-26 20:10:30 +01:00
</div>
</div>
</div>
<section data-search-results class="phpdocumentor-search-results phpdocumentor-search-results--hidden">
<section class="phpdocumentor-search-results__dialog">
<header class="phpdocumentor-search-results__header">
<h2 class="phpdocumentor-search-results__title">Search results</h2>
<button class="phpdocumentor-search-results__close"><i class="fas fa-times"></i></button>
</header>
<section class="phpdocumentor-search-results__body">
<ul class="phpdocumentor-search-results__entries"></ul>
</section>
</section>
</section>
</div>
2024-07-11 13:08:56 +02:00
<a href="#top" class="phpdocumentor-back-to-top"><i class="fas fa-chevron-circle-up"></i></a>
2024-03-26 20:10:30 +01:00
</main>
<script>
cssVars({});
</script>
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.23.0/prism.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.23.0/plugins/autoloader/prism-autoloader.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.23.0/plugins/line-numbers/prism-line-numbers.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.23.0/plugins/line-highlight/prism-line-highlight.min.js"></script>
</body>
</html>