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

517 lines
19 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="traits">
2024-07-11 13:08:56 +02:00
<h1>Traits</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/traits.html#getter">Getter</a>
</li>
<li class="toc-item">
<a href="guides/overview/traits.html#setter">Setter</a>
</li>
<li class="toc-item">
<a href="guides/overview/traits.html#overloadinggetter">OverloadingGetter</a>
</li>
<li class="toc-item">
<a href="guides/overview/traits.html#overloadingsetter">OverloadingSetter</a>
</li>
<li class="toc-item">
<a href="guides/overview/traits.html#singleton">Singleton</a>
</li>
<li class="toc-item">
<a href="guides/overview/traits.html#typechecker">TypeChecker</a>
</li>
</ul>
</div>
2024-03-31 17:41:04 +02:00
</div>
</div>
2024-07-11 13:08:56 +02:00
<p>This package provides a number of generic traits like different getter and setter methods, an implementation of the
2024-03-31 17:41:04 +02:00
singleton design pattern and some little helpers. Those traits are too small to justify their own packages and most of them
2024-07-11 13:08:56 +02:00
are dependencies of the <a href="guides/overview/datastructures.html">Typed Datastructures</a> and <a href="guides/overview/interfaces.html">Interface Traits</a> anyway.</p>
2024-03-31 17:41:04 +02:00
<div class="admonition-wrapper">
<div class="admonition admonition-sidebar"><p class="sidebar-title">API Documentation</p>
<ul>
<li><a href="classes/OCC-Basics-Traits-Getter.html"><abbr title="\OCC\Basics\Traits\Getter">Getter</abbr></a>
</li>
</ul>
2024-03-26 20:10:30 +01:00
</div>
</div>
<div class="section" id="getter">
2024-07-11 13:08:56 +02:00
<h2>Getter</h2>
<p><em>Reads data from inaccessible properties by using magic methods.</em>
</p>
2024-03-26 20:10:30 +01:00
2024-07-11 13:08:56 +02:00
<p>To make a <code>protected</code>
or <code>private</code>
property readable, provide a method named <code>_magicGet{Property}()</code>
which handles the
reading. Replace <code>{Property}</code>
in the method&#039;s name with the name of the actual property (with an uppercase first
2024-03-31 17:41:04 +02:00
letter).</p>
2024-07-11 13:08:56 +02:00
<p>Trying to access an undefined property or a property without corresponding &quot;magic&quot; getter method will result in an
<a href="https://www.php.net/invalidargumentexception">\InvalidArgumentException</a> being thrown.</p>
<blockquote>
<p>Example: If the property is named <code>$fooBar</code>
, the &quot;magic&quot; method has to be <code>_magicGetFooBar()</code>
. This method is then
called when <code>$fooBar</code>
is read in a context where it normally would not be accessible.</p>
</blockquote>
2024-03-31 17:41:04 +02:00
<div class="admonition-wrapper">
<div class="admonition admonition-sidebar"><p class="sidebar-title">API Documentation</p>
<ul>
<li><a href="classes/OCC-Basics-Traits-Setter.html"><abbr title="\OCC\Basics\Traits\Setter">Setter</abbr></a>
</li>
</ul>
</div>
</div>
</div>
<div class="section" id="setter">
2024-07-11 13:08:56 +02:00
<h2>Setter</h2>
2024-03-31 17:41:04 +02:00
2024-07-11 13:08:56 +02:00
<p><em>Writes data to inaccessible properties by using magic methods.</em>
</p>
<p>To make a <code>protected</code>
or <code>private</code>
property writable, provide a method named <code>_magicSet{Property}()</code>
which handles the
writing. Replace <code>{Property}</code>
in the method&#039;s name with the name of the actual property (with an uppercase first
2024-03-31 17:41:04 +02:00
letter).</p>
2024-07-11 13:08:56 +02:00
<p>Trying to access an undefined property or a property without corresponding &quot;magic&quot; setter method will result in an
<a href="https://www.php.net/invalidargumentexception">\InvalidArgumentException</a> being thrown.</p>
<blockquote>
<p>Example: If the property is named <code>$fooBar</code>
, the &quot;magic&quot; method has to be <code>_magicSetFooBar()</code>
. This method is then
called when <code>$fooBar</code>
is written to in a context where it normally would not be accessible.</p>
</blockquote>
2024-03-31 17:41:04 +02:00
<div class="admonition-wrapper">
<div class="admonition admonition-sidebar"><p class="sidebar-title">API Documentation</p>
<ul>
<li><a href="classes/OCC-Basics-Traits-OverloadingGetter.html"><abbr title="\OCC\Basics\Traits\OverloadingGetter">OverloadingGetter</abbr></a>
</li>
</ul>
</div>
</div>
2024-03-26 20:10:30 +01:00
</div>
<div class="section" id="overloadinggetter">
2024-07-11 13:08:56 +02:00
<h2>OverloadingGetter</h2>
<p><em>Overloads a class with readable virtual properties.</em>
</p>
2024-03-26 20:10:30 +01:00
2024-07-11 13:08:56 +02:00
<p>It reads a protected internal array whose keys are interpreted as property names.</p>
<p>Trying to access an undefined virtual property will not issue any warning or error, but return <code>NULL</code>
instead.</p>
<blockquote>
<p>Example: Reading <code>Foo-&gt;bar</code>
will return the value of <code>Foo::$_data[&#039;bar&#039;]</code>
.</p>
</blockquote>
2024-03-31 17:41:04 +02: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 uses the <code>$_data</code>
array, the same as some <a href="guides/overview/datastructures.html">Typed Datastructures</a> and all <a href="guides/overview/interfaces.html">Interface Traits</a> of this
2024-03-31 17:41:04 +02:00
package.</p>
2024-07-11 13:08:56 +02:00
2024-03-31 17:41:04 +02: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-Traits-OverloadingSetter.html"><abbr title="\OCC\Basics\Traits\OverloadingSetter">OverloadingSetter</abbr></a>
</li>
</ul>
</div>
</div>
2024-03-26 20:10:30 +01:00
</div>
<div class="section" id="overloadingsetter">
2024-07-11 13:08:56 +02:00
<h2>OverloadingSetter</h2>
<p><em>Overloads a class with writable virtual properties.</em>
</p>
<p>It writes a protected internal array whose keys are interpreted as property names.</p>
<p>Trying to access a previously undefined virtual property will create a new one with the given name.</p>
2024-03-26 20:10:30 +01:00
2024-07-11 13:08:56 +02:00
<blockquote>
<p>Example: <code>Foo-&gt;bar = 42;</code>
will set <code>Foo::$_data[&#039;bar&#039;]</code>
to <code>42</code>
.</p>
</blockquote>
2024-03-26 20:10:30 +01:00
2024-03-31 17:41:04 +02: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 uses the <code>$_data</code>
array, the same as some <a href="guides/overview/datastructures.html">Typed Datastructures</a> and all <a href="guides/overview/interfaces.html">Interface Traits</a> of this
2024-03-31 17:41:04 +02:00
package.</p>
2024-07-11 13:08:56 +02:00
2024-03-31 17:41:04 +02: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-Traits-Singleton.html"><abbr title="\OCC\Basics\Traits\Singleton">Singleton</abbr></a>
</li>
</ul>
</div>
</div>
2024-03-26 20:10:30 +01:00
</div>
<div class="section" id="singleton">
2024-07-11 13:08:56 +02:00
<h2>Singleton</h2>
2024-03-26 20:10:30 +01:00
2024-07-11 13:08:56 +02:00
<p><em>Allows just a single instance of the class using this trait.</em>
</p>
<p>Get the singleton by calling the static method <code>getInstance()</code>
. If there is no object yet, the constructor is called
with the same arguments as <code>getInstance()</code>
. Any later call will just return the already instantiated object
2024-03-31 17:41:04 +02:00
(irrespective of the given arguments).</p>
2024-07-11 13:08:56 +02:00
2024-03-31 17:41:04 +02:00
<div class="phpdocumentor-admonition caution">
<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="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path></svg>
<article>
2024-07-11 13:08:56 +02:00
<p>In order for this to work as expected, the constructor has to be implemented as <code>private</code>
to prevent direct
2024-03-31 17:41:04 +02:00
instantiation of the class.</p>
2024-07-11 13:08:56 +02:00
2024-03-31 17:41:04 +02: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-Traits-TypeChecker.html"><abbr title="\OCC\Basics\Traits\TypeChecker">TypeChecker</abbr></a>
</li>
</ul>
</div>
</div>
2024-03-26 20:10:30 +01:00
</div>
<div class="section" id="typechecker">
2024-07-11 13:08:56 +02:00
<h2>TypeChecker</h2>
<p><em>A generic data type checker.</em>
</p>
2024-03-26 20:10:30 +01:00
2024-07-11 13:08:56 +02:00
<p>This allows to set a list of allowed atomic data types and fully qualified class names. It also provides a method to
2024-03-31 17:41:04 +02:00
check if a value&#039;s data type matches at least one of these types.</p>
2024-07-11 13:08:56 +02:00
<p>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>
.</p>
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>