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

517 lines
19 KiB
HTML

<!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">
<h1>Traits</h1>
<div class="admonition-wrapper">
<div class="admonition admonition-sidebar"><p class="sidebar-title">Table of Contents</p>
<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>
</div>
</div>
<p>This package provides a number of generic traits like different getter and setter methods, an implementation of the
singleton design pattern and some little helpers. Those traits are too small to justify their own packages and most of them
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>
<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>
</div>
</div>
<div class="section" id="getter">
<h2>Getter</h2>
<p><em>Reads data from inaccessible properties by using magic methods.</em>
</p>
<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
letter).</p>
<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>
<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">
<h2>Setter</h2>
<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
letter).</p>
<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>
<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>
</div>
<div class="section" id="overloadinggetter">
<h2>OverloadingGetter</h2>
<p><em>Overloads a class with readable virtual properties.</em>
</p>
<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>
<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>
<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
package.</p>
</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>
</div>
<div class="section" id="overloadingsetter">
<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>
<blockquote>
<p>Example: <code>Foo-&gt;bar = 42;</code>
will set <code>Foo::$_data[&#039;bar&#039;]</code>
to <code>42</code>
.</p>
</blockquote>
<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>
<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
package.</p>
</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>
</div>
<div class="section" id="singleton">
<h2>Singleton</h2>
<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
(irrespective of the given arguments).</p>
<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>
<p>In order for this to work as expected, the constructor has to be implemented as <code>private</code>
to prevent direct
instantiation of the class.</p>
</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>
</div>
<div class="section" id="typechecker">
<h2>TypeChecker</h2>
<p><em>A generic data type checker.</em>
</p>
<p>This allows to set a list of allowed atomic data types and fully qualified class names. It also provides a method to
check if a value&#039;s data type matches at least one of these types.</p>
<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>
</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>
<a href="#top" class="phpdocumentor-back-to-top"><i class="fas fa-chevron-circle-up"></i></a>
</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>