tag:forum.selfhtml.org,2005:/selfAlternativen für Restriktiven Property-Zugriff im Model (OOP) – SELFHTML-Forum2020-02-12T10:14:38Zhttps://forum.selfhtml.org/self/2020/feb/11/alternativen-fur-restriktiven-property-zugriff-im-model-oop/1764918#m1764918MB2020-02-11T20:36:44Z2020-02-11T20:39:10ZAlternativen für Restriktiven Property-Zugriff im Model (OOP)<p>moin,</p>
<p>wie kann man den Zugriff auf Properties im Model beschränken ohne auf Methoden im Model zurück zu greifen z.B. <code class="language-php"><span class="token variable">$model</span><span class="token operator">-></span><span class="token property">qux</span></code> und nicht <code class="language-php"><span class="token variable">$model</span><span class="token operator">-></span><span class="token function">getQux</span><span class="token punctuation">(</span><span class="token punctuation">)</span></code>?</p>
<p>Ich möchte Methoden im Model nicht unbedingt verwenden wenn es nur ein paar zusammengehaltende Strings sein sollen.</p>
<p>Meine Lösung:</p>
<pre><code class="block language-php"><span class="token keyword">trait</span> <span class="token class-name-definition class-name">TraitStaticInstance</span> <span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__set</span><span class="token punctuation">(</span> <span class="token variable">$property</span><span class="token punctuation">,</span> <span class="token variable">$value</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">void</span> <span class="token punctuation">{</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">__get</span><span class="token punctuation">(</span> <span class="token variable">$property</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">void</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<pre><code class="block language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">FoobarModel</span> <span class="token punctuation">{</span>
<span class="token keyword">use</span> <span class="token package">TraitStaticInstance</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token variable">$qux</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token variable">$tuk</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 keyword type-hint">string</span> <span class="token variable">$qux</span><span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$tux</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">qux</span> <span class="token operator">=</span> <span class="token variable">$qux</span><span class="token punctuation">;</span>
<span class="token variable">$this</span><span class="token operator">-></span><span class="token property">tux</span> <span class="token operator">=</span> <span class="token variable">$tux</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<p>Output:</p>
<pre><code class="block language-php"><span class="token variable">$fb</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FoobarModel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$fb</span><span class="token operator">-></span><span class="token property">qux</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'hello world'</span><span class="token punctuation">;</span> <span class="token comment">// geht leider</span>
<span class="token variable">$fb</span><span class="token operator">-></span><span class="token property">tux</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'hello world'</span><span class="token punctuation">;</span> <span class="token comment">// geht leider</span>
<span class="token variable">$fb</span><span class="token operator">-></span><span class="token property">hi</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'hello world'</span><span class="token punctuation">;</span> <span class="token comment">// geht nicht</span>
<span class="token keyword">echo</span> <span class="token variable">$fb</span><span class="token operator">-></span><span class="token property">qux</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token variable">$fb</span><span class="token operator">-></span><span class="token property">tuk</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token variable">$fb</span><span class="token operator">-></span><span class="token property">by</span><span class="token punctuation">;</span> <span class="token comment">// geht nicht</span>
</code></pre>
<p>Etwas bessere habe ich im Internet nicht gesehen . Habt ihr mehr Erfolg???</p>
<p>lgmb</p>
https://forum.selfhtml.org/self/2020/feb/11/alternativen-fur-restriktiven-property-zugriff-im-model-oop/1764920#m1764920Felix Riestererhttps://felix-riesterer.de2020-02-11T21:36:11Z2020-02-11T21:36:11ZAlternativen für Restriktiven Property-Zugriff im Model (OOP)<p>Lieber MB,</p>
<p>ich verstehe Dein Problem nicht.</p>
<blockquote>
<p>wie kann man den Zugriff auf Properties im Model beschränken ohne auf Methoden im Model zurück zu greifen z.B. <code class="language-php"><span class="token variable">$model</span><span class="token operator">-></span><span class="token property">qux</span></code> und nicht <code class="language-php"><span class="token variable">$model</span><span class="token operator">-></span><span class="token function">getQux</span><span class="token punctuation">(</span><span class="token punctuation">)</span></code>?</p>
</blockquote>
<p>was ist ein <em>Model</em>? Sprichst Du von <em>MVC</em> "Model"?</p>
<blockquote>
<p>Meine Lösung:</p>
</blockquote>
<p>Du definierst eine Klasse mit öffentlichen Eigenschaften. Es kommt (wie immer) darauf an, ob man das tatsächlich wollen möchte. Machst Du sie <em>public</em>, kannst Du mit <code class="language-php"><span class="token variable">$obj</span><span class="token operator">-></span><span class="token property">qux</span></code> direkt schreibend und lesend zugreifen. Die Sache mit den Traits hilft da überhaupt nicht.</p>
<p>Machst Du <code class="language-php"><span class="token variable">$obj</span><span class="token operator">-></span><span class="token property">qux</span></code> dagegen <em>private</em>, benötigt <code class="language-php"><span class="token variable">$obj</span></code> jeweils eine Methode, um den Wert in <code class="language-php"><span class="token variable">$obj</span><span class="token operator">-></span><span class="token property">qux</span></code> zu lesen und zu schreiben. Wenn man das <a href="https://de.wikipedia.org/wiki/Datenkapselung_(Programmierung)" rel="nofollow noopener noreferrer">Geheimnisprinzip</a> anwendet, soll das auch so sein.</p>
<p>Liebe Grüße</p>
<p>Felix Riesterer</p>
https://forum.selfhtml.org/self/2020/feb/11/alternativen-fur-restriktiven-property-zugriff-im-model-oop/1764929#m1764929Rolf B2020-02-12T07:02:33Z2020-02-12T07:02:33ZAlternativen für Restriktiven Property-Zugriff im Model (OOP)<p>Hallo MB,</p>
<p>Du hast beim Schreiben auf existierende Properties ein leider gesetzt.</p>
<p>Suchst du ein Objekt mit readonly-Properties?</p>
<p><em>Rolf</em></p>
<div class="signature">-- <br>
sumpsi - posui - clusi
</div>
https://forum.selfhtml.org/self/2020/feb/11/alternativen-fur-restriktiven-property-zugriff-im-model-oop/1764930#m1764930plhttps://rolfrost.de/tapi2020-02-12T07:18:38Z2020-02-12T07:18:38ZAlternativen für Restriktiven Property-Zugriff im Model (OOP)<p>Eigene Methoden sollten nicht mit <code>__</code> beginnen. Warum steht im Handbuch. MFG</p>
https://forum.selfhtml.org/self/2020/feb/11/alternativen-fur-restriktiven-property-zugriff-im-model-oop/1764936#m1764936dedlfix2020-02-12T07:59:57Z2020-02-12T07:59:57ZAlternativen für Restriktiven Property-Zugriff im Model (OOP)<p>Tach!</p>
<blockquote>
<p>Habt ihr mehr Erfolg???</p>
</blockquote>
<p>Dein Beispiel enthält Syntaxfehler und die beiden Methoden <code>__set()</code> und <code>__get()</code> enthalten keinen Code. Deswegen ist "geht nicht" erklärlich.</p>
<p>Der Zugriff bei "geht leider" ist auch normal, denn vorhandene und zugängliche (public) Eigenschaften triggern nicht den Aufruf von __set()/__get().</p>
<p>dedlfix.</p>
https://forum.selfhtml.org/self/2020/feb/11/alternativen-fur-restriktiven-property-zugriff-im-model-oop/1764921#m1764921MB2020-02-11T22:04:25Z2020-02-11T22:09:20ZAlternativen für Restriktiven Property-Zugriff im Model (OOP)<p>moin,</p>
<blockquote>
<p>was ist ein <em>Model</em>? Sprichst Du von <em>MVC</em> "Model"?</p>
</blockquote>
<p>Ja meine ich <em>als</em> Beispiel.</p>
<blockquote>
<p>Die Sache mit den Traits hilft da überhaupt nicht.</p>
</blockquote>
<p>Fals ich Dich richtig verstehe, meinst du, dass zur Laufzeit hinzufügbare
Instanz Properties nichts aus machen z.B. <code class="language-php"><span class="token variable">$obj</span><span class="token operator">-></span><span class="token property">hi</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'by'</span><span class="token punctuation">;</span></code>. Ich hingegen möchte die Instanz so beschränkt wie möglich halten und es das machen was es soll und nix anderes. Nur darum habe ich ja auch diese Interzeptor-Methoden im Trait ergänzt. Oder verstehe ich dich da miss???</p>
<blockquote>
<p>Machst Du […] dagegen <em>private</em>, benötigt […] jeweils eine Methode, um den Wert in […] zu lesen und zu schreiben.</p>
</blockquote>
<p>Die Datenkapselung wollte ich erst zur Veranschaulichung meines Problemes hacken, habs aber dann verworfen, weil es offensichtlich ist - schien mir so. Da habe ich den Platz in der Selfhtml Datenbank eingespart.</p>
<p>lgmb</p>
https://forum.selfhtml.org/self/2020/feb/11/alternativen-fur-restriktiven-property-zugriff-im-model-oop/1764935#m1764935MB2020-02-12T07:59:00Z2020-02-12T07:59:00ZAlternativen für Restriktiven Property-Zugriff im Model (OOP)<p>moin,</p>
<blockquote>
<p>Suchst du ein Objekt mit readonly-Properties?</p>
</blockquote>
<p>Ja stimmt, meine ich. Sorry, war gestern spät und ein kurzes Zeitfenster .</p>
<p>lgmb</p>
https://forum.selfhtml.org/self/2020/feb/11/alternativen-fur-restriktiven-property-zugriff-im-model-oop/1764934#m1764934dedlfix2020-02-12T07:48:50Z2020-02-12T07:48:50ZAlternativen für Restriktiven Property-Zugriff im Model (OOP)<p>Tach!</p>
<blockquote>
<p>Eigene Methoden sollten nicht mit <code>__</code> beginnen. Warum steht im Handbuch.</p>
</blockquote>
<p>Du meinst diesen Satz?</p>
<p><a href="https://www.php.net/manual/en/language.oop5.magic.php" rel="nofollow noopener noreferrer">Caution
PHP reserves all function names starting with __ as magical. It is recommended that you do not use function names with __ in PHP unless you want some documented magic functionality.</a></p>
<p>Nun, die Einschränkung beginnend ab "unless" ist das, <a href="https://www.php.net/manual/en/language.oop5.overloading.php" rel="nofollow noopener noreferrer">was für den vorliegenden Fall gewünscht ist</a>.</p>
<p>dedlfix.</p>
https://forum.selfhtml.org/self/2020/feb/11/alternativen-fur-restriktiven-property-zugriff-im-model-oop/1764937#m1764937MB2020-02-12T08:01:47Z2020-02-12T08:01:47ZAlternativen für Restriktiven Property-Zugriff im Model (OOP)<p>moin,</p>
<blockquote>
<p>Eigene Methoden sollten nicht mit <code>__</code> beginnen. Warum steht im Handbuch. MFG</p>
</blockquote>
<p><a href="/users/27" class="mention registered-user" rel="noopener noreferrer">@dedlfix</a> hat die Referenz <a href="https://forum.selfhtml.org/self/2020/feb/11/alternativen-fur-restriktiven-property-zugriff-im-model-oop/1764934#m1764934" rel="noopener noreferrer">siehe hier</a></p>
<p>lgmb</p>
https://forum.selfhtml.org/self/2020/feb/11/alternativen-fur-restriktiven-property-zugriff-im-model-oop/1764938#m1764938MB2020-02-12T08:08:31Z2020-02-12T08:09:15ZAlternativen für Restriktiven Property-Zugriff im Model (OOP)<p>moin,</p>
<blockquote>
<p>Dein Beispiel enthält Syntaxfehler und die beiden Methoden <code>__set()</code> und <code>__get()</code> enthalten keinen Code. Deswegen ist "geht nicht" erklärlich.</p>
</blockquote>
<p>war auch nur als beispiel gedacht, ich dachte das wäre klar .</p>
<blockquote>
<p>Der Zugriff bei "geht leider" ist auch normal, denn vorhandene und zugängliche (public) Eigenschaften triggern nicht den Aufruf von __set()/__get().</p>
</blockquote>
<p>Schon klar. Ich hab ja in der Vergangenheit die Instance Properties mit private deklariert und hab mit der magic method <code>__get()</code> in der Instance drauf zugegriffen. Geht wie am Schnürchen, aber Du oder ein anderer hast mich drauf hingewiesen, dass das mit private bezüglich intellisense nicht geht. Schade . Und deswegen suche ich im der neuste version nach alternativen.</p>
<p>lgmb</p>
https://forum.selfhtml.org/self/2020/feb/11/alternativen-fur-restriktiven-property-zugriff-im-model-oop/1764940#m1764940plhttps://rolfrost.de/tapi2020-02-12T08:23:38Z2020-02-12T08:23:38ZAlternativen für Restriktiven Property-Zugriff im Model (OOP)<p>moin,</p>
<blockquote>
<blockquote>
<p>Eigene Methoden sollten nicht mit <code>__</code> beginnen. Warum steht im Handbuch. MFG</p>
</blockquote>
<p><a href="/users/27" class="mention registered-user" rel="noopener noreferrer">@dedlfix</a> hat die Referenz <a href="https://forum.selfhtml.org/self/2020/feb/11/alternativen-fur-restriktiven-property-zugriff-im-model-oop/1764934#m1764934" rel="noopener noreferrer">siehe hier</a></p>
</blockquote>
<p>Ich würde dieser Empfehlung auch folgen und das generell so machen, also eigene Methoden eben nicht mit führenden Unterstrichen notieren. Im Übrigen gibt es solche Reservierungen ja nicht nur in PHP. Und auch keinen Grund diese zu mißachten.</p>
<p>Und wie gesagt, das ist auch eine Erfahrung die ich hier weitergebe. MFG</p>
https://forum.selfhtml.org/self/2020/feb/11/alternativen-fur-restriktiven-property-zugriff-im-model-oop/1764947#m1764947dedlfix2020-02-12T08:49:49Z2020-02-12T08:49:49ZAlternativen für Restriktiven Property-Zugriff im Model (OOP)<p>Tach!</p>
<blockquote>
<blockquote>
<p>Dein Beispiel enthält Syntaxfehler und die beiden Methoden <code>__set()</code> und <code>__get()</code> enthalten keinen Code. Deswegen ist "geht nicht" erklärlich.</p>
</blockquote>
<p>war auch nur als beispiel gedacht, ich dachte das wäre klar .</p>
</blockquote>
<p>Wenn die beiden Methoden Inhalt haben, dann ist mir nicht klar, was du mit "geht nicht" meinst. "Geht" und "geht nicht" sind zu allgemein, um Probleme nachvollziehbar zu beschreiben.</p>
<blockquote>
<blockquote>
<p>Der Zugriff bei "geht leider" ist auch normal, denn vorhandene und zugängliche (public) Eigenschaften triggern nicht den Aufruf von __set()/__get().</p>
</blockquote>
<p>Schon klar. Ich hab ja in der Vergangenheit die Instance Properties mit private deklariert und hab mit der magic method <code>__get()</code> in der Instance drauf zugegriffen. Geht wie am Schnürchen, aber Du oder ein anderer hast mich drauf hingewiesen, dass das mit private bezüglich intellisense nicht geht. Schade . Und deswegen suche ich im der neuste version nach alternativen.</p>
</blockquote>
<p>Die Code-Analyse kann selbstverständlich auch nicht-öffentliche Mitglieder lesen und der Autovervollständigung zur Verfügung stellen. Dann aber nur, wenn man sich im Code innerhalb der Klasse befindet. Eigenschaften, die nur über die Magic Methods __set()/__get() erreichbar sind, sind nicht statisch sondern erst zur Laufzeit verfügbar, denn dein Code kann beliebig auf angefragte Namen reagieren. Kennst du die verfügbaren Namen doch schon zur Entwicklungszeit, dann kannst du diese <a href="https://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.property.pkg.html" rel="nofollow noopener noreferrer">mit PHPDoc-Syntax bekanntgeben</a>.</p>
<p>Intellisense ist der Name der Programmiererunterstützung in Microsoft-Produkten, kein allgemeiner Begriff für Autovervollständigung.</p>
<p>dedlfix.</p>
https://forum.selfhtml.org/self/2020/feb/11/alternativen-fur-restriktiven-property-zugriff-im-model-oop/1764949#m1764949dedlfix2020-02-12T08:56:12Z2020-02-12T08:56:12ZAlternativen für Restriktiven Property-Zugriff im Model (OOP)<p>Tach!</p>
<blockquote>
<p>Ich würde dieser Empfehlung auch folgen und das generell so machen, also eigene Methoden eben nicht mit führenden Unterstrichen notieren. Im Übrigen gibt es solche Reservierungen ja nicht nur in PHP. Und auch keinen Grund diese zu mißachten.</p>
</blockquote>
<p>Es gibt keinen Grund, weiterhin zu missachten, dass die vorliegenden Methodennamen keine eigenen Erfindungen sind, sondern eine genau definierte Funktionalität haben und für diese vom Entwickler verwendet werden können, was bei MB der Fall ist.</p>
<p>dedlfix.</p>
https://forum.selfhtml.org/self/2020/feb/11/alternativen-fur-restriktiven-property-zugriff-im-model-oop/1764951#m1764951MB2020-02-12T09:05:13Z2020-02-12T09:05:34ZAlternativen für Restriktiven Property-Zugriff im Model (OOP)<p>moin,</p>
<blockquote>
<p>[…] sind nicht statisch sondern erst zur Laufzeit verfügbar, denn dein Code kann beliebig auf angefragte Namen reagieren.</p>
</blockquote>
<p>schon klar.</p>
<blockquote>
<p>[…] Kennst du die verfügbaren Namen doch schon zur Entwicklungszeit, dann kannst du diese <a href="https://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_tags.property.pkg.html" rel="nofollow noopener noreferrer">mit PHPDoc-Syntax bekanntgeben</a>.</p>
</blockquote>
<p>Wow. habe ich nicht bedacht! Danke Dir !!!</p>
<p>lgmb</p>
https://forum.selfhtml.org/self/2020/feb/11/alternativen-fur-restriktiven-property-zugriff-im-model-oop/1764968#m1764968dedlfix2020-02-12T10:14:38Z2020-02-12T10:14:38ZAlternativen für Restriktiven Property-Zugriff im Model (OOP)<p>Tach!</p>
<blockquote>
<blockquote>
<p>[…] sind nicht statisch sondern erst zur Laufzeit verfügbar, denn dein Code kann beliebig auf angefragte Namen reagieren.</p>
</blockquote>
<p>schon klar.</p>
</blockquote>
<p>Ich meinte damit, dass das der Grund ist, warum die Hilfen der IDE hier nicht (richtig) ziehen können, weil sie den Code nur statisch analysieren und nicht laufen lassen können.</p>
<p>dedlfix.</p>