tag:forum.selfhtml.org,2005:/self Alternativen für Restriktiven Property-Zugriff im Model (OOP) – SELFHTML-Forum 2020-02-12T10:14:38Z https://forum.selfhtml.org/self/2020/feb/11/alternativen-fur-restriktiven-property-zugriff-im-model-oop/1764918#m1764918 MB 2020-02-11T20:36:44Z 2020-02-11T20:39:10Z Alternativen 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#m1764920 Felix Riesterer https://felix-riesterer.de 2020-02-11T21:36:11Z 2020-02-11T21:36:11Z Alternativen 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#m1764929 Rolf B 2020-02-12T07:02:33Z 2020-02-12T07:02:33Z Alternativen 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#m1764930 pl https://rolfrost.de/tapi 2020-02-12T07:18:38Z 2020-02-12T07:18:38Z Alternativen 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#m1764936 dedlfix 2020-02-12T07:59:57Z 2020-02-12T07:59:57Z Alternativen 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#m1764921 MB 2020-02-11T22:04:25Z 2020-02-11T22:09:20Z Alternativen 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#m1764935 MB 2020-02-12T07:59:00Z 2020-02-12T07:59:00Z Alternativen 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#m1764934 dedlfix 2020-02-12T07:48:50Z 2020-02-12T07:48:50Z Alternativen 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#m1764937 MB 2020-02-12T08:01:47Z 2020-02-12T08:01:47Z Alternativen 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#m1764938 MB 2020-02-12T08:08:31Z 2020-02-12T08:09:15Z Alternativen 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#m1764940 pl https://rolfrost.de/tapi 2020-02-12T08:23:38Z 2020-02-12T08:23:38Z Alternativen 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#m1764947 dedlfix 2020-02-12T08:49:49Z 2020-02-12T08:49:49Z Alternativen 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#m1764949 dedlfix 2020-02-12T08:56:12Z 2020-02-12T08:56:12Z Alternativen 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#m1764951 MB 2020-02-12T09:05:13Z 2020-02-12T09:05:34Z Alternativen 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#m1764968 dedlfix 2020-02-12T10:14:38Z 2020-02-12T10:14:38Z Alternativen 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>