OOP in PHP: __construct verstehen – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self OOP in PHP: __construct verstehen Fri, 06 Jul 18 08:57:14 Z https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726082#m1726082 https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726082#m1726082 <p>Hallo,</p> <p>wollte mich mal mit OOP beschäftigen, scheitere aber schon an so einfachen Dingen wie dem folgenden Code:</p> <pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">User</span><span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'data'</span><span class="token punctuation">]</span><span class="token operator">-></span><span class="token function">GetUserPersonData</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'userMenuItems'</span><span class="token punctuation">]</span><span class="token operator">-></span><span class="token function">GetUserMenuItems</span><span class="token punctuation">(</span> <span class="token variable">$this</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'data'</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'id'</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">GetUserPersonData</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment"># hier lese ich anhand des Loginnamens das ActiveDirectory aus</span> … <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">GetUserMenuItems</span><span class="token punctuation">(</span> <span class="token variable">$userId</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> … <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token delimiter important">?></span></span> </code></pre> <p>Da erhalte ich ein <strong>Fatal error: Uncaught Error: Cannot use object of type User as array</strong> und weiß nicht, was ich falsch mache/ falsch verstanden habe.</p> <p>Ich möchte beim Aufruf von <code>$user = new User();</code> im Hauptprogramm einen Nutzer erstellen, der schon vorbelegte Inhalte hat.</p> <p>Der $user soll so 'aussehen':</p> <p>$user['data']['id']</p> <p>$user['data']['email']</p> <p>$user['data']['name']</p> <p>Was mache ich falsch bzw sollte ich mir in einem Tutorial genauer ansehen/ nach welchem stichwort googlen?</p> <p>Anmerkung: Bei prozeduraler Programmierung habe ich kein Problem bei der Zuweisung. Was ich damit sagen will, der Code in den Functions ist korrekt.</p> <p>Vielen Dank und voab schon mal ein schönes Wochenende!</p> OOP in PHP: __construct verstehen Fri, 06 Jul 18 09:08:13 Z https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726083#m1726083 https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726083#m1726083 <p>Tach!</p> <blockquote> <p>Da erhalte ich ein <strong>Fatal error: Uncaught Error: Cannot use object of type User as array</strong> und weiß nicht, was ich falsch mache/ falsch verstanden habe.</p> </blockquote> <p>Handbuch nicht gelesen? Das was du geschrieben hast, funktioniert bei Javascript, aber PHP verwendet die <code>-></code>-Syntax für den Zugriff auf Mitglieder.</p> <p>dedlfix.</p> OOP in PHP: __construct verstehen Fri, 06 Jul 18 21:44:42 Z https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726118#m1726118 https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726118#m1726118 <p>Lieber Jens,</p> <p>Deine Klasse definiert ein Objekt mit Methoden, aber ohne Eigenschaften.</p> <blockquote> <p>Der $user soll so 'aussehen':<br> $user['data']['id']<br> $user['data']['email']<br> $user['data']['name']</p> </blockquote> <p>Du notierst hier anscheinend ein assoziatives Array. Willst Du das auch so? Das ginge so:</p> <pre><code class="block language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">User</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token variable">$data</span> <span class="token operator">=</span> <span class="token keyword">array</span> <span class="token punctuation">(</span> <span class="token string single-quoted-string">'id'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">''</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'email'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">''</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'name'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">''</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">...</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">GetUserPersonData</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">...</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token keyword">function</span> <span class="token function-definition function">GetUserMenuItems</span> <span class="token punctuation">(</span> <span class="token variable">$userId</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">...</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <blockquote> <p>Ich möchte beim Aufruf von <code>$user = new User();</code> im Hauptprogramm einen Nutzer erstellen, der schon vorbelegte Inhalte hat.</p> </blockquote> <pre><code class="block language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">User</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token variable">$data</span> <span class="token operator">=</span> <span class="token keyword">array</span> <span class="token punctuation">(</span> <span class="token string single-quoted-string">'id'</span> <span class="token operator">=></span> <span class="token function">uniqid</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'user_'</span><span class="token punctuation">,</span> <span class="token constant boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'email'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">''</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'name'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">''</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span> <span class="token punctuation">(</span><span class="token variable">$params</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// copy values into $this->data</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span><span class="token variable">$params</span><span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token function">is_array</span><span class="token punctuation">(</span><span class="token variable">$params</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token function">array_keys</span><span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">data</span><span class="token punctuation">)</span> <span class="token keyword">as</span> <span class="token variable">$key</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// exclude 'id' since it must be unique</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$key</span> <span class="token operator">!=</span> <span class="token string single-quoted-string">'id'</span> <span class="token operator">&&</span> <span class="token function">array_key_exists</span><span class="token punctuation">(</span><span class="token variable">$key</span><span class="token punctuation">,</span> <span class="token variable">$params</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">data</span><span class="token punctuation">[</span><span class="token variable">$key</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$params</span><span class="token punctuation">[</span><span class="token variable">$key</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator">...</span> <span class="token punctuation">}</span> <span class="token variable">$user</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">User</span><span class="token punctuation">(</span><span class="token keyword">array</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'email'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'user@example.org'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'name'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'Fiffy the Great'</span> <span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Liebe Grüße,</p> <p>Felix Riesterer.</p> OOP in PHP: __construct verstehen Fri, 06 Jul 18 09:13:15 Z https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726085#m1726085 https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726085#m1726085 <p>Hatte auch <code>$this->data->GetUserPersonData();</code> und <code>$this->['data']->GetUserPersonData();</code> probiert, aber beides führt zu Fehlern :(</p> OOP in PHP: __construct verstehen Fri, 06 Jul 18 09:22:27 Z https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726086#m1726086 https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726086#m1726086 <blockquote> <p>Hatte auch <code>$this->data->GetUserPersonData();</code> und <code>$this->['data']->GetUserPersonData();</code> probiert, aber beides führt zu Fehlern :(</p> </blockquote> <p>Kein Wunder. Wenn Du:</p> <pre><code class="block language-php"><span class="token variable">$this</span> <span class="token operator">-></span> <span class="token property">data</span> <span class="token operator">=</span> <span class="token variable">$this</span> <span class="token operator">-></span> <span class="token function">GetUserPersonData</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>willst. Dann solltest Du das auch so notieren.</p> OOP in PHP: __construct verstehen Fri, 06 Jul 18 09:24:13 Z https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726087#m1726087 https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726087#m1726087 <p>Tach!</p> <blockquote> <p>Hatte auch <code>$this->data->GetUserPersonData();</code> und <code>$this->['data']->GetUserPersonData();</code> probiert, aber beides führt zu Fehlern :(</p> </blockquote> <p>Der Fehlermeldungstext ist nicht nur zur Zierde da und fällt auch nicht unter die DSGVO. Du darfst den zeigen, damit man was draus entnehmen kann. Ich rate, dass wohl keine Eigenschaft <code>data</code> existiert und der Zugriff auf Dinge davon natürlich fehlschlägt.</p> <p>dedlfix.</p> OOP in PHP: __construct verstehen Fri, 06 Jul 18 09:27:03 Z https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726088#m1726088 https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726088#m1726088 <p>Oh, wunderbar. Das klappt. Vielen, vielen Dank! Macht es Sinn dies noch mit in den Code aufzunehmen (vor dem '__construct' )?</p> <p><code>private $data = array();</code></p> OOP in PHP: __construct verstehen Fri, 06 Jul 18 09:29:09 Z https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726089#m1726089 https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726089#m1726089 <blockquote> <p>Macht es Sinn dies noch mit in den Code aufzunehmen (vor dem '__construct' )?</p> <pre><code class="block">private $data = array(); </code></pre> </blockquote> <p>Nein. Weil es im Deklarationsteil nicht erlaubt ist und ergo zu einer Fehlermeldung führen wird.</p> <p>Aber:</p> <pre><code class="block language-php"><span class="token keyword">private</span> <span class="token variable">$data</span><span class="token punctuation">;</span> </code></pre> <p>oder</p> <pre><code class="block language-php"><span class="token keyword">private</span> <span class="token variable">$data</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> </code></pre> <p>sollte funktionieren.</p> OOP in PHP: __construct verstehen Fri, 06 Jul 18 09:37:23 Z https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726090#m1726090 https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726090#m1726090 <p>Auch hier noch mal ein DANKE.</p> <p>Einen Fehler produziert <code>private $data = array();</code> ( zumindest bei mir ) nicht, werde es dann aber so machen, wie von dir geschrieben.</p> OOP in PHP: __construct verstehen Fri, 06 Jul 18 10:38:02 Z https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726092#m1726092 https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726092#m1726092 <p>Tach!</p> <blockquote> <p>Einen Fehler produziert <code>private $data = array();</code> ( zumindest bei mir ) nicht, werde es dann aber so machen, wie von dir geschrieben.</p> </blockquote> <p>Wenn ich mich recht erinnere, ist das mal hinzugefügt worden, dass man nicht nur Konstanten sondern auch solche zu berechnenden Ausdrücke angeben kann. Andererseits ist array() auch keine Funktion, sondern ein Sprachkonstrukt. Das wird also auch nicht wie eine herkömmliche Funktion erst zur Laufzeit aufgerufen, sondern schon vom Compiler ausgewertet.</p> <p>dedlfix.</p> OOP in PHP: __construct verstehen Fri, 06 Jul 18 11:39:49 Z https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726093#m1726093 https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726093#m1726093 <p>Hallo dedlfix,</p> <p>gerade mal im <a href="http://sandbox.onlinephpfunctions.com/" rel="nofollow noopener noreferrer">Sandkasten</a> gespielt - Angabe eines Array als Initializer einer private-Variablen geht seit PHP 5.0. Ok, vielleicht auch schon in PHP 4, aber da habe ich die Klassen-Syntax nicht mehr drauf und hatte keine Lust, archäologisch aktiv zu sein.</p> <p>Verwendung von arithmetischen Ausdrücken im Initializer geht seit PHP 5.6.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> OOP in PHP: __construct verstehen Wed, 11 Jul 18 10:04:28 Z https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726391#m1726391 https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726391#m1726391 <p><strong>Ja. Ihr habt recht.</strong></p> <p>Das <code>$foo=array()</code> im Initialisierungsteil einer Klasse zu einem Fehler führt ist nicht richtig.</p> <p>Ich wende zu meiner Entschuldigung ein, dass ich mir einfach mal nicht gemerkt habe, was GENAU bei der Initialisierung eines Objektes ab welcher Version von PHP geht oder nicht. Insbesondere im Hinblick darauf, dass es Sonderfälle wie <a href="http://php.net/manual/de/function.array.php" rel="noopener noreferrer">array()</a> gibt, <a href="http://php.net/manual/de/book.array.php" rel="noopener noreferrer">die in der Dokumentation unter „Funktion“ geführt werden</a>, auch genau so notiert werden - und dann gar keine sind…</p> <p>Ich habe mir <strong>der Einfachheit wegen</strong> gesagt und gemerkt:</p> <ul> <li>Konstante Wertzuweisung ohne irgendwelche Funktionen oder Berechnungen geht immer.</li> <li>Die Bestimmung, ob Eigenschaft <code>public</code> oder <code>private</code> sein soll, soll sein und geht immer.</li> <li>Für alles andere gibt es <code>__construct()</code>.</li> <li>„Fertig“.</li> </ul> OOP in PHP: __construct verstehen Wed, 11 Jul 18 11:37:56 Z https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726394#m1726394 https://forum.selfhtml.org/self/2018/jul/6/oop-in-php-construct-verstehen/1726394#m1726394 <p>Hallo Regina,</p> <p>und es ist auch gut so, sich das so zu merken. Nicht jedes Sprachkonstrukt trägt zur Lesbarkeit bei.</p> <p>Performancetechnisch dürfte es keinen Unterschied machen, ob ich eine Inline-Initialisierung mache oder das in den Konstruktor tippe.</p> <p>Der Konstruktor hat den Vorteil, dass alles beisammen ist und sich nicht irgendwo in der Klasse eine Extra-Initialisierung versteckt.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div>