tag:forum.selfhtml.org,2005:/self Warum nicht Error & Exception Überprüfung in Validatoren – SELFHTML-Forum 2019-12-19T17:19:48Z https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761556#m1761556 MB 2019-12-12T19:35:32Z 2019-12-12T19:35:32Z Warum nicht Error & Exception Überprüfung in Validatoren <p>moin,</p> <p>warum nicht die Überprüfungs Code in Validatoren auslagern:</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">checkCustomerID</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token class-name static-context">Database</span><span class="token operator">::</span><span class="token function">fetch</span> <span class="token punctuation">(</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token constant">null</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'can\'t fint Customer ID'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment">// der struktur IF-ELSE zu liebe</span> <span class="token keyword">return</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// so on</span> <span class="token punctuation">}</span> </code></pre> <p>warum nicht einfach den Code auslagern, wenn mehr als eine Prüfung mit dem gleichen Sachverhalt existieren.</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">checkCustomerID</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token class-name static-context">DataValidator</span><span class="token operator">::</span><span class="token function">existData</span><span class="token punctuation">(</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// so on</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>…oder…</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">checkCustomerID</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span> <span class="token punctuation">{</span> <span class="token class-name static-context">DataValidator</span><span class="token operator">::</span><span class="token function">existData</span><span class="token punctuation">(</span> <span class="token variable">$id</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// so on</span> <span class="token punctuation">}</span> </code></pre> <p>…dann…</p> <pre><code class="block language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">DataValidator</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">function</span> <span class="token function-definition function">existData</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token class-name static-context">Database</span><span class="token operator">::</span><span class="token function">fetch</span> <span class="token punctuation">(</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token constant">null</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'can\'t find Data'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>die herangehensweise spart Code und trennt Code bezügl. der Zuständigkeit und bewart einen besseren überblich finde ich.</p> <p>lgmb</p> <p><em>PS: Warum funktioniert „~~~[code]“ nicht?</em></p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761558#m1761558 Matthias Apsel matthias.apsel@selfhtml.org https://brückentage.info 2019-12-12T19:47:50Z 2019-12-12T19:47:50Z Warum nicht Error & Exception Überprüfung in Validatoren <p>Hallo MB,</p> <blockquote> <p><em>PS: Warum funktioniert „~~~[code]“ nicht?</em></p> </blockquote> <p>Was meinst du damit?</p> <p>Bis demnächst<br> Matthias</p> <div class="signature">-- <br> Du kannst das Projekt SELFHTML unterstützen,<br> indem du bei Amazon-Einkäufen <a href="https://smile.amazon.de/ch/314-570-45498" rel="nofollow noopener noreferrer">Amazon smile</a> (<a href="https://www.amazon.de/gp/help/customer/display.html?ie=UTF8&nodeId=202035970%5D" rel="nofollow noopener noreferrer">Was ist das?</a>) nutzt. </div> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761559#m1761559 pl 2019-12-12T19:54:33Z 2019-12-12T19:54:33Z Warum nicht Error & Exception Überprüfung in Validatoren <p>Natürlich lagern wir Code aus wenn sich Redundanzen abzeichnen und machen ihn damit wiederverwertbar. MFG</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761566#m1761566 dedlfix 2019-12-12T23:45:45Z 2019-12-12T23:45:45Z Warum nicht Error & Exception Überprüfung in Validatoren <p>Tach!</p> <blockquote> <p>warum nicht die Überprüfungs Code in Validatoren auslagern:</p> </blockquote> <p>Was genau ist denn dein Problem, das du zu lösen versuchst?</p> <blockquote> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">checkCustomerID</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token class-name static-context">Database</span><span class="token operator">::</span><span class="token function">fetch</span> <span class="token punctuation">(</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token constant">null</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'can\'t fint Customer ID'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment">// der struktur IF-ELSE zu liebe</span> <span class="token keyword">return</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// so on</span> <span class="token punctuation">}</span> </code></pre> </blockquote> <p>Es gibt jedenfalls kein Gesetz, dass <code>if</code> immer ein <code>else</code> benötigt. Der else-Zweig ist hier überflüssig, das <code>return true</code> kann einfach so notiert werden. Wenn die Bedingung zutrifft, wird die Funktion über das throw verlassen und der nachfolgende Code nicht mehr ausführt. Deshalb ist es nicht notwendig, zwischen Code im false-Fall (else) und allgemein auszuführendem Code zu trennen. Im true-Fall wird weder das eine noch das andere ausgeführt, und im false-Fall sowie beides. Daran ändert auch nicht, dass es nur ein return-Statement und keinen allgemein auszuführenden Code gibt.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761607#m1761607 pl 2019-12-13T14:59:38Z 2019-12-13T14:59:38Z Warum nicht Error & Exception Überprüfung in Validatoren <p>hi MB,</p> <p>ich habe Dir <a href="https://rolfrost.de/ctype.htm" rel="nofollow noopener noreferrer">hier</a> mal aufgeschrieben wie ich meine Fehlerbehandlung mache und Du kannst das da auch ausprobieren, ein Link macht einen Fehler anschaulich.</p> <p>Und natürlich lege ich auch den Code für die als statische Route an den URL gebundene Klasse offen. Wie Du sehen kannst, Fehlerbehandlung und OOP kann auch etwas Einfaches sein und das ist ja auch das Ziel einer überschaubaren Programmierung.</p> <p>Und es muss nicht immer eine Exception sein die im Fehlerfall geworfen wird. Bei mir wird z.B. nur die Zeilennummer ausgegeben, was völlig ausreicht, weil der Fehler faktisch nur in einer Datei, die dem Entwickler namentlich bekannt ist, auftreten kann. Also brauchen wir gar keinen Backtrace mit Dateinamen. Das ist der Vorteil einer flachen Klassenhierarchie.</p> <p>MFG</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761628#m1761628 djr 2019-12-13T23:19:16Z 2019-12-13T23:19:16Z Warum nicht Error & Exception Überprüfung in Validatoren <p><strong>Spezifischere Exceptions lassen sich besser verarbeiten.</strong><br> Aus ausgelagertem ÜberprüfungsCode ist es schwer solche zu schmeißen.</p> <p>Beispiel:</p> <p>Bei mir hat jede Domäne ihre eigene <a href="https://www.php.net/throwable" rel="nofollow noopener noreferrer">Throwable</a>-Familie.</p> <p>Vorteile:</p> <ul> <li>im <code>catch</code> wahlweise Eltern <em>und</em> Kinder fangen.</li> <li>der ClassName ersetzt die Message bzw. dient als Key für die Übersetzung.</li> <li>Reflektionen</li> <li><em>previous Exception</em> nutzen</li> <li>...</li> </ul> <pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">my_app</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">throwableException</span> <span class="token keyword">extends</span> <span class="token class-name class-name-fully-qualified"><span class="token punctuation">\</span>Exception</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> </span></code></pre> <pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">my_app<span class="token punctuation">\</span>Customer</span><span class="token punctuation">;</span> <span class="token keyword">final</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">EntityNotFoundException</span> <span class="token keyword">extends</span> <span class="token class-name class-name-fully-qualified"><span class="token punctuation">\</span>my_app<span class="token punctuation">\</span>throwableException</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> </span></code></pre> <pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">my_app<span class="token punctuation">\</span>Product</span><span class="token punctuation">;</span> <span class="token keyword">final</span> <span class="token keyword">class</span> <span class="token class-name-definition class-name">EntityNotFoundException</span> <span class="token keyword">extends</span> <span class="token class-name class-name-fully-qualified"><span class="token punctuation">\</span>my_app<span class="token punctuation">\</span>throwableException</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> </span></code></pre> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761574#m1761574 pl 2019-12-13T07:32:27Z 2019-12-13T07:32:27Z Warum nicht Error & Exception Überprüfung in Validatoren <blockquote> <p>Natürlich lagern wir Code aus wenn sich Redundanzen abzeichnen und machen ihn damit wiederverwertbar. MFG</p> </blockquote> <p>PS: Eine Fehlerbehandlung über Exceptions abzuwickeln ist eine Frage ob damit der Code einfacher und leserlicher wird. In PHP ist es jedoch so, daß eine Exception immer auch einen Trace beinhaltet und das ist das was man einem Anwender bei einer fehlerhaften Eingabe nicht zeigen möchte denn die Zeile wo es knallt interessiert den Anwender sicher nicht.</p> <p>MFG</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761568#m1761568 Rolf B 2019-12-13T00:06:07Z 2019-12-13T00:07:26Z Warum nicht Error & Exception Überprüfung in Validatoren <p>Hallo dedlfix,</p> <p>eine Funktion, die im Fehlerfall eine Exception wirft und ansonsten nur true zurückgibt, braucht gar nichts zurückzugeben.</p> <p>Ich halte eine solche Funktion aber für überflüssig. Wenn ich schon die id durch fetch (also den Kunden einlesen) überprüfe und Fehler durch Exception anzeige, dann kann ich auch gleich eine Funktion get schreiben</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">getCustomer</span><span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token class-name return-type">Customer</span> <span class="token punctuation">{</span> <span class="token variable">$customer</span> <span class="token operator">=</span> <span class="token class-name static-context">Database</span><span class="token operator">::</span><span class="token function">fetch</span> <span class="token punctuation">(</span> <span class="token variable">$id</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token variable">$customer</span> <span class="token operator">===</span> <span class="token constant">null</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span> <span class="token string double-quoted-string">"can't find Customer ID <span class="token interpolation"><span class="token variable">$id</span></span>"</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$customer</span> <span class="token punctuation">}</span> </code></pre> <p>das könnte dann in die Customer-Repositoryklasse hinein (wobei Database:fetch ein schlechter Methodenname ist um Kunden zu lesen - aber ich nehme mal an, dass der generische Name dem Umstand geschuldet ist, dass es sich um ein abstraktes Beispiel handelt).</p> <p>Wenn ich jetzt nur wissen will, ob die id ok ist, ignoriere ich die Rückgabe. Ansonsten arbeite ich gleich mit dem gefundenen Kunden weiter. So ergibt es einen Sinn.</p> <p>Eine echte checkCustomerId Methode sollte sinnvollerweise einen anderen Datenbankzugriff machen, der ausschließlich die ID validiert. Ein voller Fetch dürfte außer einem Index Seek auch das Lesen der Tabledaten benötigen. Liest man nur die ID, reicht ein Index Seek. Das ist schneller. Ich würde einer solchen Funktion aber auch einen echten bool-Rückgabewert verpassen und Exceptions nur im Fall eines fehlgeschlagenen Datenbankzugriffs werfen. Denn wenn ich eine solche Methode tatsächlich brauche, dann ist true und false halbwegs gleichwahrscheinlich, das ist nicht der Anwendungsfall für Excptions. Exceptions wirft man dann, wenn dieser Fall im Normalbetrieb nicht auftaucht; zumindest habe ich das mal so gelernt.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761621#m1761621 MB 2019-12-13T18:51:39Z 2019-12-13T18:51:39Z Warum nicht Error & Exception Überprüfung in Validatoren <p>moin,</p> <blockquote> <p>Es gibt jedenfalls kein Gesetz, dass <code>if</code> immer ein <code>else</code> benötigt.</p> </blockquote> <p>durch aus nicht</p> <blockquote> <p>Der else-Zweig ist hier überflüssig, das <code>return true</code> kann einfach so notiert werden.</p> </blockquote> <p>stimmt, aber du schreibst ja auch am ende eines <strong>Attribut</strong>-Wertes des letzten Attributes eines <em>CSS</em> Selektors ein Semikolon obwohl da keins hin muss.</p> <pre><code class="block language-css"><span class="token selector">small</span> <span class="token punctuation">{</span> <span class="token property">display</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>lgmb</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761625#m1761625 MB 2019-12-13T21:29:48Z 2019-12-13T21:29:48Z Warum nicht Error & Exception Überprüfung in Validatoren <p>moin,</p> <blockquote> <blockquote> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">checkCustomerID</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token class-name static-context">Database</span><span class="token operator">::</span><span class="token function">fetch</span> <span class="token punctuation">(</span> <span class="token variable">$id</span> <span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token constant">null</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'can\'t fint Customer ID'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token comment">// der struktur IF-ELSE zu liebe</span> <span class="token keyword">return</span> <span class="token constant boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// so on</span> <span class="token punctuation">}</span> </code></pre> </blockquote> <p>Es gibt jedenfalls kein Gesetz, dass <code>if</code> immer ein <code>else</code> benötigt. Der else-Zweig ist hier überflüssig[…]</p> </blockquote> <p>Ich bin wohl einwenig zu fest in der Einhaltung gefahren und ich sehe es ein. Sorry dafür. Ich weis das es keinen unterschied mach, weil ja genau das selbe heraus kommt.</p> <p>lgmb</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761570#m1761570 dedlfix 2019-12-13T00:16:24Z 2019-12-13T00:16:24Z Warum nicht Error & Exception Überprüfung in Validatoren <p>Tach!</p> <p>Wenn man den konkreten Fall kennt, kommt man durchaus zu einer anderen Antwort auf die Frage nach der sinnvollen Lösung, als wenn man irgendwelche Pauschalitäten beurteilen soll. Darin sind wir uns sicher einig, und deswegen hatte ich auch erstmal nur nach dem zu lösenden Problem gefragt, und als Nebenschauplatz ein paar technische Argumente zu if-else-Konstrukten mit Abbruch/Ende im if geliefert. Ob sowas überhaupt in der Lösung zum konkreten Problem auftaucht, steht auf einem anderen Blatt.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761571#m1761571 pl 2019-12-13T06:39:25Z 2019-12-13T06:39:25Z Warum nicht Error & Exception Überprüfung in Validatoren <blockquote> <p>Hallo dedlfix,</p> <p>eine Funktion, die im Fehlerfall eine Exception wirft und ansonsten nur true zurückgibt, braucht gar nichts zurückzugeben.</p> <p>Ich halte eine solche Funktion aber für überflüssig.</p> </blockquote> <p>Hier geht es ums Prinzip!</p> <p>MFG</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761622#m1761622 MB 2019-12-13T19:01:24Z 2019-12-13T19:01:24Z Warum nicht Error & Exception Überprüfung in Validatoren <p>moin,</p> <blockquote> <p>eine Funktion, die im Fehlerfall eine Exception wirft und ansonsten nur true zurückgibt, braucht gar nichts zurückzugeben.</p> </blockquote> <p>siehe <a href="https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761621#m1761621" rel="noopener noreferrer">hier</a></p> <blockquote> <p>Ich halte eine solche Funktion aber für überflüssig. [...]</p> </blockquote> <p>Ein Einwand. Jedoch ist diese Funktion aus der Luft gegriffen. ich hätte auch Metasyntaxtische Variablen <code>fubar</code> schreiben können, aber man hat mir gesagt - ich glaube @@Gunnar Bittersmann, @@dedlfix oder du - das es besser ist im Konkreten Fall ein exemplarisches Beispiel zu geben.</p> <p>lgmb</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761576#m1761576 dedlfix 2019-12-13T07:52:13Z 2019-12-13T07:52:13Z Warum nicht Error & Exception Überprüfung in Validatoren <p>Tach!</p> <blockquote> <p>In PHP ist es jedoch so, daß eine Exception immer auch einen Trace beinhaltet und das ist das was man einem Anwender bei einer fehlerhaften Eingabe nicht zeigen möchte denn die Zeile wo es knallt interessiert den Anwender sicher nicht.</p> </blockquote> <p>Das klingt, als ob es einen unauflöslichen Zusammenhang gäbe, zwischen den Daten in einer Exception und dem, was man dem Anwender präsentiert. Man kann aber display_errors auf 0 setzen und Fehlermeldungen in Logfiles schreiben. Das wirkt auch bei Exceptions.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761618#m1761618 MB 2019-12-13T18:33:35Z 2019-12-13T18:33:35Z Warum nicht Error & Exception Überprüfung in Validatoren <p>moin,</p> <blockquote> <p>[...] und das ist das was man einem Anwender bei einer fehlerhaften Eingabe nicht zeigen möchte denn die Zeile wo es knallt interessiert den Anwender sicher nicht.</p> </blockquote> <p>Ich weiß </p> <p>lgmb</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761579#m1761579 pl 2019-12-13T09:16:51Z 2019-12-13T09:16:51Z Warum nicht Error & Exception Überprüfung in Validatoren <p>Tach!</p> <blockquote> <blockquote> <p>In PHP ist es jedoch so, daß eine Exception immer auch einen Trace beinhaltet und das ist das was man einem Anwender bei einer fehlerhaften Eingabe nicht zeigen möchte denn die Zeile wo es knallt interessiert den Anwender sicher nicht.</p> </blockquote> <p>Das klingt, als ob es einen unauflöslichen Zusammenhang gäbe, zwischen den Daten in einer Exception und dem, was man dem Anwender präsentiert. Man kann aber display_errors auf 0 setzen und Fehlermeldungen in Logfiles schreiben. Das wirkt auch bei Exceptions.</p> </blockquote> <p>Fehlerbehandlung über Logfiles abzuwickeln ist keine gute Idee. Erstens kann es da passsieren daß Fehler übersehen werden und zweitens ist das ziemlich umständlich.</p> <p>Nicht empfehlenswert!</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761591#m1761591 Rolf B 2019-12-13T10:08:21Z 2019-12-13T10:08:21Z Warum nicht Error & Exception Überprüfung in Validatoren <p>Hallo dedlfix,</p> <p>ich würde es eher mit try/catch versuchen und im Fall eines fachlichen Fehlers, der per Exception signalisiert wird, auch eine fachliche Fehlermeldung präsentieren.</p> <blockquote> <p>Verzeihen Sie, lieber User, aber Ihre Eingabe war einfach nur Scheiße!</p> </blockquote> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761580#m1761580 dedlfix 2019-12-13T09:22:43Z 2019-12-13T09:22:43Z Warum nicht Error & Exception Überprüfung in Validatoren <p>Tach!</p> <blockquote> <p>Fehlerbehandlung über Logfiles abzuwickeln ist keine gute Idee. Erstens kann es da passsieren daß Fehler übersehen werden und zweitens ist das ziemlich umständlich.</p> </blockquote> <p>Die bessere Lösung lautet wie?</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761619#m1761619 MB 2019-12-13T18:38:19Z 2019-12-13T18:38:19Z Warum nicht Error & Exception Überprüfung in Validatoren <p>moin,</p> <blockquote> <p>Fehlerbehandlung über Logfiles abzuwickeln ist keine gute Idee. Erstens kann es da passsieren daß Fehler übersehen werden und zweitens ist das ziemlich umständlich.</p> <p>Nicht empfehlenswert!</p> </blockquote> <p>für kleine Projekte mag es sein das es durchaus sinnhaft und empfehlenswert ist es nicht zutun, aber bei komplexen Projekten wo ein Entwickler Team dahinter steckt, ist es - denke ich mal - pflicht es zutun!</p> <p>lgmb</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761620#m1761620 MB 2019-12-13T18:45:03Z 2019-12-13T18:45:03Z Warum nicht Error & Exception Überprüfung in Validatoren <p>moin,</p> <blockquote> <p>ich würde es eher mit try/catch versuchen und im Fall eines fachlichen Fehlers, der per Exception signalisiert wird, auch eine fachliche Fehlermeldung präsentieren.</p> </blockquote> <p>sry, <code class="language-php"><span class="token function">spl_exception_handler</span><span class="token punctuation">(</span><span class="token punctuation">)</span></code> hab ich nicht erwähnt . bei <code class="language-php"><span class="token function">error_report</span><span class="token punctuation">(</span> <span class="token constant">E_ALL</span> <span class="token punctuation">)</span></code> fängt der Interpreter auch nach <code class="language-php"><span class="token keyword">throw</span></code></p> <p><em>PS: ich muss dazu sagen das ich leider seit gefühl monaten nicht mehr mit PHP entwickelt habe und jetzt wieder entsteige.</em></p> <p>lgmb</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761624#m1761624 markk 2019-12-13T19:53:35Z 2019-12-13T19:53:35Z Warum nicht Error & Exception Überprüfung in Validatoren <p>Moin Hotti,</p> <blockquote> <p>Und natürlich lege ich auch den Code für die als statische Route an den URL gebundene Klasse offen.</p> </blockquote> <p>Hast du dazu einen Git-Link o.ä.?</p> <blockquote> <p>Und es muss nicht immer eine Exception sein die im Fehlerfall geworfen wird. Bei mir wird z.B. nur die Zeilennummer ausgegeben, was völlig ausreicht</p> </blockquote> <p>Und um einen Fehler zu analysieren musst du dir dann jeweils die Version auschecken, die zu dem genauen Zeitpunkt des Fehlers live war? Stelle ich mir recht aufwendig vor, wenn man, wie doch eigentlich üblich heutzutage, noch einen CI dazwischen hat..</p> <p>Cheers, markk</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761626#m1761626 pl 2019-12-13T22:26:54Z 2019-12-14T06:33:49Z Warum nicht Error & Exception Überprüfung in Validatoren <blockquote> <p>moin,</p> <blockquote> <p>[...] und das ist das was man einem Anwender bei einer fehlerhaften Eingabe nicht zeigen möchte denn die Zeile wo es knallt interessiert den Anwender sicher nicht.</p> </blockquote> <p>Ich weiß </p> </blockquote> <p>PS: In Perl ist es wesentlich einfacher mit Exceptions zu arbeiten. So wirft ein einfaches <code>die "Das eingegebene Datum ist ungültig!\n"</code> eine Exception wobei der Backtrace infolge des angefügten Newline unterdückt wird.</p> <p>Wenn man Klassen hat wo es Fehler nur aufgrund fehlerhafte Benutzereingaben geben kann, ist das eine elegante Art und Weise der Fehlerbehandlung.</p> <p>Und noch cleverer ist es, die Fehlertexte gar nicht selber zu schreiben sondern das zu nehmen wo die Meldungen schon drinstehen. Beschwerden vom OS z.B. stehen in <code>$^E</code> sogar in deutscher Sprache.</p> <p>MFG</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761627#m1761627 MB 2019-12-13T22:42:00Z 2019-12-13T22:42:00Z Warum nicht Error & Exception Überprüfung in Validatoren <p>moin,</p> <blockquote> <p>PS: In Perl ist es wesentlich einfacher mit Exceptions zu arbeiten. […]</p> </blockquote> <p>Wie du weißt arbeite ich nicht mit <em>Perl</em> und ich werde es auch in meiner Lage nicht tun. Sicherlich gibt es Problemlösungen, wo diese Programmiersprache wirklich Perfekt ist, aber das sind nicht meine.</p> <p>Schönen Abend </p> <p>lgmb</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761631#m1761631 MB 2019-12-14T00:01:43Z 2019-12-14T00:01:43Z Warum nicht Error & Exception Überprüfung in Validatoren <p>moin,</p> <p>Das tut doch nichts zur Sache oder vertuhe ich mich da? Sry, dafür.</p> <p><em><strong>z.B.:</strong></em></p> <ol> <li>irgend eine <em>Business</em> Klasse von <em>Business</em> Klassen arbeitet etwas ab.</li> <li>Vor der abarbeitung, übereicht eine <em>Klassenmethode</em> den zu behandelte Sachverhalt an einen <em>Validator</em> der für diese spezielle Situation zuständig ist.</li> <li>Ist dieser zu behandelnde Sachverhalt validiert, arbeitet die <em>Klassenmethode</em> der <em>Business</em> Klasse einfach weiter, wenn nicht, wirft der <em>Validator</em> eine <em>Exception</em> oder <em>Error</em> (z.B. <code class="language php">new FoobarError()</code>, <code class="language php">new FoobarException()</code> usw.) die man geschrieben hat.</li> </ol> <p>Bist du mit diesem Thread im Bilde uns hast die Lösung die du präsentierst? Dann fürchte ich habe ich den zusammenhang nicht im Blick, sorry !</p> <p>lgmb</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761633#m1761633 dedlfix 2019-12-14T06:31:55Z 2019-12-14T06:31:55Z Warum nicht Error & Exception Überprüfung in Validatoren <p>Tach!</p> <blockquote> <ol start="3"> <li>Ist dieser zu behandelnde Sachverhalt validiert, arbeitet die <em>Klassenmethode</em> der <em>Business</em> Klasse einfach weiter, wenn nicht, wirft der <em>Validator</em> eine <em>Exception</em> oder <em>Error</em> (z.B. <code class="language php">new FoobarError()</code>, <code class="language php">new FoobarException()</code> usw.) die man geschrieben hat.</li> </ol> </blockquote> <p>Die Validatorklasse kann nur eine allgemeine ValidationFailed werfen, aber keine Exception, die für den Business Case spezifisch ist. Dazu müsste man dort die allgemeine Exception abfangen und umpacken. Das kann man sich sparen, wenn man den Aufrufer selbst die Exception werfen lässt, die er für richtig hält. Außerdem kann eine fehlende Validierung immer nur als so schwerwiegend eingestuft werden, dass eine Exception nötig ist, selbst wenn dem Aufrufer eine einfache Information reichen würde.</p> <p>Der Validator sollte seine Aufgabe des Validierens erfüllen und nicht in den Control Flow eingreifen, wenn dazu keine zwingende Notwendigkeit besteht. Wenn der Aufrufer immer eine Exception abzufangen hat, macht das die Behandlung nur unnötig komplex, auch an Stellen, wo das nicht nötig ist.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761634#m1761634 Rolf B 2019-12-14T10:01:18Z 2019-12-14T10:01:18Z Warum nicht Error & Exception Überprüfung in Validatoren <p>Hallo dedlfix,</p> <p>ich glaube, ihr seit euch über die Spezifität der Validatoren uneins.</p> <p>Mir scheint, dass MB sehr spezifische Validatoren bauen will, die nur an einer einzigen Ecke der Businesslogik verwendet werden. Die können dann auch spezifische Fehler erzeugen.</p> <p>Den Nutzen des Routings der Prüfung über eine Klassenmethode (= static function?) habe ich allerdings auch nicht verstanden.</p> <p>Und das Auslagern von Code in eigene Klassen, um Klassen zu haben, scheint mir auch nicht die beste Idee. Ich weiß nicht wie gut PHP das unter Fast CGI oder mit anderen Code-Caching Verfahren optimieren kann, aber grundsätzlich ist eine Klasse erstmal eine Struktur, die PHP zur Laufzeit aufbaut. Jede zusätzliche Klasse ist zusätzliche Arbeit, die pro Request vom Server geleistet werden muss.</p> <p>Es gibt verschiedene Anlässe, technische Klassen zu bilden (ich rede nicht von Businessklassen!):</p> <ul> <li>rein statisch mit statischen Methoden. Sowas macht man bspw. in Java oder C#, um einen Namespace für eine Funktionensammlung zu haben. In PHP bieten sich da eher Funktionen und <a href="https://www.php.net/manual/en/language.namespaces.rationale.php" rel="nofollow noopener noreferrer">Namespaces</a> an</li> <li>ich baue eine Methode, und sie wird gigantisch. Es ist viel zu tun, und ich brauche eine Menge Arbeitsvariablen. Es wird gruselig, diese Methode zu testen, und es wird unüberschaubar, das Monster über Testargumente in allen Facetten zu validieren. Statt nun Code aus der Methode in private Methoden der Klasse auszulagern, die dann entweder viele Parameter haben oder die Klasse mit Instanzvariablen zumüllen, lagere ich das in eine Worker-Klasse aus, die ich dann auch separat testen kann.</li> <li>ich möchte in Test und Produktion unterschiedlichen Code laufen lassen. Insbesondere im Bereich Logging, oder auch Fehlerprüfungen. Im Test prüfe ich vielleicht deutlich aufwändiger, und logge mehr. Man kann das so lösen, dass man den Code in zwei Klassen unterbringt, eine für Test, eine für Produktion, die beide das gleiche Interface haben. Und ich stelle an geeigneter Stelle eine Instanz dieser Klasse zur Nutzung durch den Rest des Codes zur Verfügung. Dann muss ich genau 1x testen, ob ich in Test oder Prod bin, den Rest erledigt die Polymorphie.</li> </ul> <p>Sicherlich gibt's noch mehr Anlässe.</p> <p>Deine Validatoren könnten durch Anlass 3 gerechtfertigt sein.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761651#m1761651 MB 2019-12-14T12:49:04Z 2019-12-14T12:49:04Z Warum nicht Error & Exception Überprüfung in Validatoren <p>moin,</p> <blockquote> <p>Den Nutzen des Routings der Prüfung über eine Klassenmethode (= static function?) habe ich allerdings auch nicht verstanden.</p> </blockquote> <p>Ups, sorry!!! ich meinte Instanzmethoden. Sry </p> <p>lgmb</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761653#m1761653 Rolf B 2019-12-14T13:24:24Z 2019-12-14T13:24:24Z Warum nicht Error & Exception Überprüfung in Validatoren <p>Hallo MB,</p> <p><strong>dann</strong> verstehe ich das . Die kannst Du im Zweifel sogar von einer abstrakten Klasse erben oder als Trait einmischen.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761667#m1761667 MB 2019-12-14T18:12:09Z 2019-12-14T18:12:54Z Warum nicht Error & Exception Überprüfung in Validatoren <p>moin,</p> <blockquote> <p><strong>dann</strong> verstehe ich das . Die kannst Du im Zweifel sogar von einer abstrakten Klasse erben oder als Trait einmischen.</p> </blockquote> <p>Habe ich bei Template Construktor gemacht.</p> <pre><code class="block language-php"><span class="token comment">// create</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">foobarTable</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Table</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// built</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">foobarTable</span> <span class="token operator">-></span><span class="token function">setCaption</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">setSettings</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">setHead</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">setBody</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span><span class="token function">foot</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Tut mir wirklich leid. Ich <em><strong>„musste“</strong></em> in der Vergangenheit mit <em>CSS</em> arbeite was ich garnicht mag. Da habe ich <em>PHP</em> aus den augen verloren .</p> <p>lgmb</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761671#m1761671 MB 2019-12-14T19:05:01Z 2019-12-14T19:17:17Z Warum nicht Error & Exception Überprüfung in Validatoren <p>moin,</p> <pre><code class="block language-php"><span class="token variable">$ta</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableAttributs</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'id'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'class'</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$tcol</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableColum</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'id'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'class'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'1'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$tset</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableSettings</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'id'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'class'</span><span class="token punctuation">,</span> <span class="token constant">null</span><span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token variable">$tcol</span><span class="token punctuation">,</span> <span class="token variable">$tcol</span><span class="token punctuation">,</span> <span class="token variable">$tcol</span><span class="token punctuation">,</span> <span class="token variable">$tcol</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$tc</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableCell</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'foobar'</span><span class="token punctuation">,</span> <span class="token variable">$ta</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$tr</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableRow</span><span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token variable">$tc</span><span class="token punctuation">,</span> <span class="token variable">$tc</span><span class="token punctuation">,</span> <span class="token variable">$tc</span><span class="token punctuation">,</span> <span class="token variable">$tc</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$ts</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableSection</span><span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token variable">$tr</span><span class="token punctuation">,</span> <span class="token variable">$tr</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token variable">$ta</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$t</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableConstructor</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'Foo Bar'</span><span class="token punctuation">,</span> <span class="token variable">$tset</span><span class="token punctuation">,</span> <span class="token variable">$ts</span><span class="token punctuation">,</span> <span class="token variable">$ts</span><span class="token punctuation">,</span> <span class="token variable">$ts</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$t</span><span class="token punctuation">;</span> </code></pre> <p>mit Template</p> <pre><code class="block language-php"><span class="token comment"><!-- TABLE --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>table</span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> <span class="token comment"><!-- COLUMN GROUPS --></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$settings</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$settings</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>colgroup</span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">id</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">span</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">span</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">span</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">span</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">for</span><span class="token punctuation">(</span> <span class="token variable">$i</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$i</span> <span class="token operator"><</span> <span class="token function">count</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>col</span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">id</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">span</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">span</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">span</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$settings</span><span class="token operator">-></span><span class="token property">columns</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">span</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endfor</span> <span class="token delimiter important">?></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>colgroup</span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span> <span class="token delimiter important">?></span></span> <span class="token comment"><!-- CAPTION --></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$caption</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$caption</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>caption</span><span class="token punctuation">></span></span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$caption</span> <span class="token delimiter important">?></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>caption</span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span> <span class="token comment"><!-- MATRIX --></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">foreach</span><span class="token punctuation">(</span> <span class="token variable">$sections</span> <span class="token keyword">as</span> <span class="token variable">$key</span> <span class="token operator">=></span> <span class="token variable">$section</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token variable">$section</span> <span class="token operator">===</span> <span class="token constant">null</span> <span class="token punctuation">)</span> <span class="token keyword">continue</span><span class="token punctuation">;</span> <span class="token comment">// if one of section is not defined like '<tfoot>' </span><span class="token delimiter important">?></span></span> <span class="token comment"><!-- SECTION --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>t<span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$key</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">for</span><span class="token punctuation">(</span> <span class="token variable">$i</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$i</span> <span class="token operator"><</span> <span class="token function">count</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$i</span><span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tr</span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">for</span><span class="token punctuation">(</span> <span class="token variable">$j</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$j</span> <span class="token operator"><</span> <span class="token function">count</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$j</span><span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token php language-php"><span class="token delimiter important"><?php</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">'head'</span> <span class="token keyword">or</span> <span class="token variable">$j</span> <span class="token operator">===</span> <span class="token number">0</span> <span class="token keyword">and</span> <span class="token variable">$key</span> <span class="token operator">!==</span> <span class="token string single-quoted-string">'foot'</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span><span class="token delimiter important">?></span></span>th<span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">else</span><span class="token punctuation">:</span> <span class="token delimiter important">?></span></span>td<span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">id</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token keyword">class</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">row</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">row</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">rowspan</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">row</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token keyword">isset</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">column</span> <span class="token punctuation">)</span> <span class="token keyword">and</span> <span class="token operator">!</span><span class="token keyword">empty</span><span class="token punctuation">(</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">column</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token delimiter important">?></span></span></span> <span class="token attr-name">colspan</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token property">column</span> <span class="token delimiter important">?></span></span><span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span><span class="token punctuation">[</span> <span class="token variable">$i</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span> <span class="token variable">$j</span> <span class="token punctuation">]</span><span class="token operator">-></span><span class="token property">content</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token php language-php"><span class="token delimiter important"><?php</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">'head'</span> <span class="token keyword">or</span> <span class="token variable">$j</span> <span class="token operator">===</span> <span class="token number">0</span> <span class="token keyword">and</span> <span class="token variable">$key</span> <span class="token operator">!==</span> <span class="token string single-quoted-string">'foot'</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span><span class="token delimiter important">?></span></span>th<span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">else</span><span class="token punctuation">:</span> <span class="token delimiter important">?></span></span>td<span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endif</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endfor</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tr</span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endfor</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>t<span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$key</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endforeach</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>table</span><span class="token punctuation">></span></span> </code></pre> <p>heraus kam</p> <pre><code class="block language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>table</span><span class="token punctuation">></span></span> <span class="token comment"><!-- COLUMN GROUPS --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>colgroup</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>id<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>class<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>col</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>id<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>class<span class="token punctuation">"</span></span> <span class="token attr-name">span</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token comment"><!-- soon --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>colgroup</span><span class="token punctuation">></span></span> <span class="token comment"><!-- CAPTION --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>caption</span><span class="token punctuation">></span></span>Foo Bar<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>caption</span><span class="token punctuation">></span></span> <span class="token comment"><!-- MATRIX --></span> <span class="token comment"><!-- SECTION --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>thead</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>id<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>class<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tr</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>th</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>id<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>class<span class="token punctuation">"</span></span> <span class="token attr-name">rowspan</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span> <span class="token attr-name">colspan</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> foobar <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>th</span><span class="token punctuation">></span></span> <span class="token comment"><!-- soon --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tr</span><span class="token punctuation">></span></span> <span class="token comment"><!-- soon --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>thead</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tbody</span><span class="token punctuation">></span></span> <span class="token comment"><!-- soon --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tbody</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>tfoot</span><span class="token punctuation">></span></span> <span class="token comment"><!-- soon --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tfoot</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>table</span><span class="token punctuation">></span></span> </code></pre> <p>Ich habs mit abstrakten Eltern Klassen gemacht und Interfaces verwendet</p> <p>lgmb</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761676#m1761676 Rolf B 2019-12-14T22:06:13Z 2019-12-14T22:09:57Z Warum nicht Error & Exception Überprüfung in Validatoren <p>Hallo MB,</p> <p>Whoa, was ist denn das für ein Template? Wieso <?php ... ?> auf jeder einzelnen Zeile? Und man darf in einem Template, wenn es mit PHP geschrieben ist, durchaus programmieren. Also Helper-Funktionen und -Variablen verwenden.</p> <p>Unter anderem auch htmlspecialchars(), das fehlt bei Dir noch ganz - es sei denn das hast Du schon anderweit gemacht. Ich baue es hier deshalb bewusst nicht ein, aber ich denke, sowas gehört eigentlich ins Template, nicht ins Viewmodel.</p> <p>Zum Beispiel könntest Du diesen Helper bauen:</p> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">renderAttribute</span><span class="token punctuation">(</span><span class="token variable">$attrName</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">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">$value</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">" <span class="token interpolation"><span class="token variable">$attrName</span></span>='<span class="token interpolation"><span class="token variable">$value</span></span>'"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>isset brauchst Du nicht, empty() ist ein Sprachkonstrukt, keine Funktion und prüft isset implizit mit ab. Im Handbuch steht:</p> <blockquote> <p>A variable is considered empty if it does not exist or if its value equals FALSE</p> </blockquote> <p>(Beachte: equals FALSE meint <code>== FALSE</code>, nicht <code>=== FALSE</code>).</p> <p>Damit schreibst Du ins Template:</p> <pre><code class="block language-php"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>table<span class="token php language-php"><span class="token delimiter important"><?=</span><span class="token function">renderAttribute</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"id"</span><span class="token punctuation">,</span> <span class="token variable">$attributs</span><span class="token operator">-></span><span class="token property">id</span><span class="token punctuation">)</span><span class="token delimiter important">?></span></span><span class="token php language-php"><span class="token delimiter important"><?=</span><span class="token function">renderAttribute</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"class"</span><span class="token punctuation">,</span> <span class="token variable">$attributs</span><span class="token operator">-></span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> </code></pre> <p>oder verlässt PHP für den Moment gar nicht (sollte unterm Strich aber egal sein):</p> <pre><code class="block language-php"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>table<span class="token php language-php"><span class="token delimiter important"><?=</span><span class="token function">renderAttribute</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"id"</span><span class="token punctuation">,</span> <span class="token variable">$attributs</span><span class="token operator">-></span><span class="token property">id</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token function">renderAttribute</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"class"</span><span class="token punctuation">,</span> <span class="token variable">$attributs</span><span class="token operator">-></span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> </code></pre> <p>Es geht aber noch deutlich besser. Du könntest deine Klasse <code>TableAttributs</code> ertüchtigen (und vermutlich könnte sie sogar <code>ElementAttributes</code> heißen, weil sie nicht nur für Tabellen funktioniert):</p> <pre><code class="block language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">ElementAttributes</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">render</span><span class="token punctuation">(</span><span class="token operator">...</span><span class="token variable">$attributes</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 variable">$attributes</span> <span class="token keyword">as</span> <span class="token variable">$attr</span><span class="token punctuation">)</span> <span class="token punctuation">{</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">$this</span><span class="token operator">-></span><span class="token variable">$attrName</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">" <span class="token interpolation"><span class="token variable">$attrName</span></span>='<span class="token interpolation"><span class="token punctuation">{</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token variable">$attrName</span><span class="token punctuation">}</span></span>'"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>Ich habe das ganze Attribut mit echo ausgegeben, statt dauernd zwischen PHP und HTML zu wechseln.</p> <p>Damit hättest Du dann statt 7 Zeilen nur noch diese (und es ist auch kompakter, <?= ... ?> statt <? echo ...; ?> zu schreiben. Das predige ich schon länger </p> <pre><code class="block language-php"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>table</span> <span class="token attr-name"><span class="token php language-php"><span class="token delimiter important"><?=</span><span class="token variable">$attributs</span><span class="token operator">-></span><span class="token function">render</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"id"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"class"</span><span class="token punctuation">)</span><span class="token delimiter important">?></span></span></span> <span class="token punctuation">></span></span>; </code></pre> <p>Es wäre dann auch sinnvoll, hinter den beiden for-Schleifen jeweils eine Variable mit dem aktuellen Schleifenwert zu setzen. Oder gleich die foreach-Schleife zu verwenden - was aber nur sinnvoll ist wenn Du $i oder $j nicht brauchst...</p> <pre><code class="block language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$section</span><span class="token operator">-></span><span class="token property">row</span> <span class="token keyword">as</span> <span class="token variable">$rowData</span><span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token operator"><</span>tr <span class="token operator"><</span><span class="token operator">?</span><span class="token operator">=</span><span class="token variable">$rowData</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token function">render</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"id"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"class"</span><span class="token punctuation">)</span><span class="token delimiter important">?></span></span> > <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">for</span><span class="token punctuation">(</span> <span class="token variable">$j</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token variable">$j</span> <span class="token operator"><</span> <span class="token function">count</span><span class="token punctuation">(</span> <span class="token variable">$rowData</span><span class="token operator">-></span><span class="token property">cell</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$j</span><span class="token operator">++</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token variable">$cellData</span> <span class="token operator">=</span> <span class="token variable">$rowData</span><span class="token operator">-></span><span class="token property">cell</span><span class="token punctuation">[</span><span class="token variable">$j</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$cellTag</span> <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token variable">$key</span> <span class="token operator">===</span> <span class="token string single-quoted-string">'head'</span> <span class="token keyword">or</span> <span class="token variable">$j</span> <span class="token operator">===</span> <span class="token number">0</span> <span class="token keyword">and</span> <span class="token variable">$key</span> <span class="token operator">!==</span> <span class="token string single-quoted-string">'foot'</span> <span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token string double-quoted-string">"th"</span> <span class="token punctuation">:</span> <span class="token string double-quoted-string">"td"</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token php language-php"><span class="token delimiter important"><?=</span><span class="token variable">$cellTag</span> <span class="token operator">.</span> <span class="token variable">$cellData</span><span class="token operator">-></span><span class="token property">attributs</span><span class="token operator">-></span><span class="token function">render</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"id"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"class"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"rowSpan"</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">"colSpan"</span><span class="token punctuation">)</span><span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?=</span><span class="token variable">$cellData</span><span class="token operator">-></span><span class="token property">content</span><span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token php language-php"><span class="token delimiter important"><?=</span><span class="token variable">$cellTag</span><span class="token delimiter important">?></span></span></span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endfor</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>tr</span><span class="token punctuation">></span></span> <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">endforeach</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span> </code></pre> <p>Das ist signifikant kleiner als dein Code. Ich find's auch besser lesbar.</p> <p>Ob es sinnvoll ist, im Schleifenkern den PHP-Modus zu verlassen, weiß ich nicht. Vermutlich nicht. Außer < und > kommt ja eh alles aus PHP.</p> <p>Schneller laufen wird's auch nicht, durch die Methodenaufrufe gehen einige Mikrosekunden drauf. Ob das jetzt sofort funktioniert weiß ich nicht, das ist teilweise in der Sandbox probiert, aber teilweise auch vom Hirn ins Forum gehauen.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761906#m1761906 pl 2019-12-19T07:46:53Z 2019-12-19T07:51:34Z Warum nicht Error & Exception Überprüfung in Validatoren <p>Nun, wie wärs denn damit:</p> <pre><code class="block language-php"><span class="token variable">$t</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableConstruktor</span><span class="token punctuation">(</span> <span class="token variable">$tableprops</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token function">tr</span><span class="token punctuation">(</span> <span class="token variable">$rowprops</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token function">tbody</span><span class="token punctuation">(</span><span class="token variable">$options</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token function">th</span><span class="token punctuation">(</span><span class="token variable">$opts</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$t</span><span class="token operator">-></span><span class="token function">td</span><span class="token punctuation">(</span><span class="token variable">$opts</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Da hast Du alles in einer Klasse und ruft nur noch die Methoden auf! Wobei die übergebenen Options auch die Zelleninhalte und Attribute enthalten.</p> <p>MFG</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761934#m1761934 pl 2019-12-19T12:02:54Z 2019-12-19T12:02:54Z OOP Polymorphie <p>Hier mal ein Beispiel was Du auch auf Deine Tabellenklasse anwenden kannst:</p> <pre><code class="block language-php"># Klasse zum Erstellen einer sitemap.xml /urlset class Sitemap{ function __construct($opts){ $opts = array_merge( array( 'proto' => '', 'domain' => '', 'version' => '1.0', 'encoding' => 'UTF-8', 'xmlns' => 'http://www.sitemaps.org/schemas/sitemap/0.9' ), $opts); $this->OPTS = $opts; $this->URLSET = array(); $this->BUFFER = ''; } function add($url){ $this->URLSET[] = $url; } function out(){ $this->BUFFER = sprintf("<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>?xml</span> <span class="token attr-name">version</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">'</span>%s<span class="token punctuation">'</span></span> <span class="token attr-name">encoding</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">'</span>%s<span class="token punctuation">'</span></span><span class="token punctuation">></span></span>\n", $this->OPTS['version'], $this->OPTS['encoding']); $this->BUFFER .= sprintf("\t<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>urlset</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">'</span>%s<span class="token punctuation">'</span></span><span class="token punctuation">></span></span>\n", $this->OPTS['xmlns']); $this->urlset(); $this->BUFFER .= "\t<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>urlset</span><span class="token punctuation">></span></span>"; return $this->BUFFER; } function urlset(){ foreach( $this->URLSET as $url ){ $this->BUFFER .= sprintf("\t\t<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>url</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>loc</span><span class="token punctuation">></span></span>%s<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>loc</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>url</span><span class="token punctuation">></span></span>\n", $url); } } } $s = new Sitemap( array( 'proto' => 'https', 'domain' => 'example.org' )); $s->add('/index.html'); $s->add('/foo.html'); $s->add('/find'); echo $s->out(); </code></pre> <p>Damit ist es einfach, weitere XML-Elemente einzubauen. OOP lebt von der Vielgestaltigkeit und umgekehrt.</p> <p>MFG</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761680#m1761680 MB 2019-12-15T00:30:03Z 2019-12-15T00:46:37Z Warum nicht Error & Exception Überprüfung in Validatoren <p>moin,</p> <blockquote> <p>Whoa, was ist denn das für ein Template? Wieso <?php ... ?> auf jeder einzelnen Zeile?</p> </blockquote> <p>Kontext wechsel </p> <blockquote> <p>Und man darf in einem Template, wenn es mit PHP geschrieben ist, durchaus programmieren. Also Helper-Funktionen und -Variablen verwenden.</p> </blockquote> <blockquote></blockquote> <pre><code class="block language-php"><span class="token keyword">function</span> <span class="token function-definition function">renderAttribute</span><span class="token punctuation">(</span><span class="token variable">$attrName</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">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">$value</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">echo</span> <span class="token string double-quoted-string">" <span class="token interpolation"><span class="token variable">$attrName</span></span>='<span class="token interpolation"><span class="token variable">$value</span></span>'"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>mir ist es deutlich lieber wenn ich <em>BuiltIn</em>-Funktionen nehme</p> <p>Ich zerhacke immer alles und plaziere immer alles schön seeehr weit weg . Hab da gute und weniger gute Erfahrungen gemacht.</p> <blockquote> <p>Unter anderem auch htmlspecialchars(), das fehlt bei Dir noch ganz - es sei denn das hast Du schon anderweit gemacht.</p> </blockquote> <p>hätte ich is aber nur n Test </p> <blockquote> <p>Ich baue es hier deshalb bewusst nicht ein, aber ich denke, sowas gehört eigentlich ins Template, nicht ins Viewmodel.</p> </blockquote> <p>ich denke nicht, weil es ja nur ein Template ist. Aber ich bin im gegensatz zu dir (einen Profil) n echtes greenhorn .</p> <blockquote> <p>isset brauchst Du nicht, empty() ist ein Sprachkonstrukt, keine Funktion und prüft isset implizit mit ab. Im Handbuch steht:</p> </blockquote> <p>…ja ich erinner mich da an was. Danke für die Auffrischung</p> <blockquote> <p>Damit hättest Du dann statt 7 Zeilen nur noch diese (und es ist auch kompakter, <?= ... ?> statt <? echo ...; ?> zu schreiben. Das predige ich schon länger </p> </blockquote> <p>ja aber <strong>php.ini</strong> schaltet das per Default aus und es gibt da glaube ich Probleme mit <em>DB</em> bezügl. <em>SQL-Injection</em> oder so. Lasst mich erst in der <em>PHP</em>-Welt ankommen .</p> <p>Irgend wann baue ich mal einen simplen <em>MarkDown</em>-PlugIn.</p> <blockquote> <p>Es wäre dann auch sinnvoll, hinter den beiden for-Schleifen jeweils eine Variable mit dem aktuellen Schleifenwert zu setzen. Oder gleich die foreach-Schleife zu verwenden - was aber nur sinnvoll ist wenn Du $i oder $j nicht brauchst...</p> </blockquote> <p>da habe ich auch meine Problemchen wie ich das lösen kann. Dank für den Rat.</p> <blockquote> <p>[…] Das ist signifikant kleiner als dein Code. Ich find's auch besser lesbar.</p> </blockquote> <p>das ist es… ich werde mich apäter damit beschäftigen, weil ichs weniger wichtig finde, Wichtig! aber weniger.</p> <blockquote> <p>Ob es sinnvoll ist, im Schleifenkern den PHP-Modus zu verlassen, weiß ich nicht. Vermutlich nicht. […]</p> </blockquote> <p>Kontext wechsel. Wenn ich im HTML Template bin dann notiere ich z.B. <code class="language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">echo</span> <span class="token variable">$foobar</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span></code> und <code class="language-php"><span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</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 delimiter important">?></span></span></code>.</p> <p>lgmb</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761684#m1761684 dedlfix 2019-12-15T07:20:47Z 2019-12-15T07:20:47Z Warum nicht Error & Exception Überprüfung in Validatoren <p>Tach!</p> <blockquote> <blockquote> <p>Damit hättest Du dann statt 7 Zeilen nur noch diese (und es ist auch kompakter, <?= ... ?> statt <? echo ...; ?> zu schreiben. Das predige ich schon länger </p> </blockquote> <p>ja aber <strong>php.ini</strong> schaltet das per Default aus und es gibt da glaube ich Probleme mit <em>DB</em> bezügl. <em>SQL-Injection</em> oder so.</p> </blockquote> <p>Nein, <code><?=</code> steht seit Version 5.4 unabschaltbar zur Verfügung. Die Versionen, in denen das abschaltbar war sind ausgestorben (lies: unsupportet). Ein Zusammenhang zu DB-Handling und SQL-Injection oder jeglicher Art anderer Injection besteht auch nicht. Wenn ein Kontextwechsel vorhanden ist, muss der in beiden Schreibweisen in exakt gleicher Art und Weise berücksichtigt werden.</p> <blockquote> <blockquote> <p>Ob es sinnvoll ist, im Schleifenkern den PHP-Modus zu verlassen, weiß ich nicht. Vermutlich nicht. […]</p> </blockquote> </blockquote> <p>Jedenfalls ist es nicht sonderlich sinnvoll, zwischen <code>?></code> und <code><?php</code> nur Whitespace stehen zu haben, der für die Ausgabe irrelevant ist. Da kann man gleich im PHP-Modus bleiben. Der erzeugte HTML-Code ist nur bedingt lesbar, weil ein dem <code>?></code> nachfolgender Zeilenumbruch nicht in der Ausgabe erscheint, aber die Einrückungs-Whitespace-Zeichen. Da entsteht also ohne zusätzliche Zeilenschaltung nur eine lange Zeilenwurst. Wichtig ist in erster Linie die syntaktische Korrektheit, nicht die menschliche Lesbarkeit. Syntaktische Korrektheit kann auch ein Automat prüfen, dem der Whitespace egal ist. Inhaltliche Probleme geht man hingegen meist in der DOM-Ansicht an, die der Browser anhand der logischen Struktur des Dokuments präsentiert.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761694#m1761694 Rolf B 2019-12-15T10:45:17Z 2019-12-15T10:45:17Z Warum nicht Error & Exception Überprüfung in Validatoren <p>Hallo MB,</p> <blockquote> <p>mir ist es deutlich lieber wenn ich BuiltIn-Funktionen nehme</p> </blockquote> <p>Du musst natürlich so programmieren, wie Du es am besten lesen und verstehen kannst.</p> <p>Deswegen aber auf Helper-Funktionen zu verzichten und Megabytes an Boilerplate-Code zu tippen - ist das besser? Je mehr Code da steht, desto mehr musst Du lesen. Wenn der relevante Code aus ein paar Stecknadeln in Bergen von repetitivem Basiszeugs besteht, erschwert das die Fehlersuche ungemein. Sind nur meine 2ct dazu, die Entscheidung bleibt bei Dir. Ich werde dir - weil ich keine Akten über meine Gesprächspartner führe und sowas hier schnell wieder vergesse - vermutlich trotzdem regelmäßig dazu was erzählen wenn Du Codebeispiele bringst. Nimm's mir dann nicht übel </p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761720#m1761720 MB 2019-12-15T16:56:04Z 2019-12-15T16:56:04Z Warum nicht Error & Exception Überprüfung in Validatoren <p>moin,</p> <blockquote> <blockquote> <p>ja aber <strong>php.ini</strong> schaltet das per Default aus und es gibt da glaube ich Probleme mit <em>DB</em> bezügl. <em>SQL-Injection</em> oder so.</p> </blockquote> </blockquote> <blockquote> <p>Nein, <code><?=</code> steht seit Version 5.4 unabschaltbar zur Verfügung. […]</p> </blockquote> <p>wuste ich nicht. Danke für di Info!!!</p> <blockquote> <p>Der erzeugte HTML-Code ist nur bedingt lesbar, weil ein dem <code>?></code> nachfolgender Zeilenumbruch nicht in der Ausgabe erscheint, aber die Einrückungs-Whitespace-Zeichen.</p> </blockquote> <p>habe ich mir gedacht!!! Bedankt</p> <p>lgmb</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761719#m1761719 MB 2019-12-15T16:49:57Z 2019-12-15T16:49:57Z Warum nicht Error & Exception Überprüfung in Validatoren <p>moin,</p> <blockquote> <blockquote> <p>mir ist es deutlich lieber wenn ich BuiltIn-Funktionen nehme</p> </blockquote> </blockquote> <blockquote> <p>Du musst natürlich so programmieren, wie Du es am besten lesen und verstehen kannst.</p> </blockquote> <p>da hast du natürlich recht. Es läst sich wohl nicht vermeiden aber da wo ich es vermeiden kann, werde ich nichtt drauf zurück greifen, esd sein den es ist im Templates üblich. Mit wachsendem Code wird es auf jeden Fall der Fall sein .</p> <blockquote> <p>Ich werde dir […] vermutlich trotzdem regelmäßig dazu was erzählen wenn Du Codebeispiele bringst. Nimm's mir dann nicht übel </p> </blockquote> <p>Ach iwo. Immer her damit.</p> <p>lgmb</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761942#m1761942 Rolf B 2019-12-19T13:14:12Z 2019-12-19T13:14:12Z OOP Polymorphie <p>Hallo pl,</p> <p>Polymorphie? Wo? Ich sehe keine Klassenvererbung und keine Interfaces. Eins von beiden bräuchtest Du dafür schon.</p> <p>Zum Code:</p> <p>Du solltest deine Properties deklarieren.</p> <p>URLSET, urlset und OPTS sollten private sein.</p> <p>Nicht jede Variable muss ein Property sein. BUFFER sollte statt dessen lokale Variable sein und als Wert von urlset zurückgegeben werden. Das Ding ist temporär.</p> <p>Die Namen einer öffentlichen Schnittstelle sollen so sprechend wie möglich sein. Sprechende Namen sind besser als jede Doku. Also - beispielsweise - toXmlString statt out, addUrl statt add, getUrlSetAsXmlFragment statt urlset und urlList statt BUFFER.</p> <p>Wo findet der Kontextwechsel zu XML für die Zeichen &, ', ", < und > statt? Zumindest das & kann gern mal Teil einer URL sein, bei den vier anderen mag es weniger wichtig sein.</p> <p>Die Parametrierbarbeit von UTF-8 und XML Version ist sinnlos. Sitemaps müssen UTF-8 codiert sein, und einen Sinn in einer XML 1.1 Sitemap sehe ich nicht, da kein Freitext enthalten sein darf und eine URL immer in XML 1.0 darstellbar ist.</p> <p>Dass die Sitemap-Elemente lastmod, changefreq und priority nicht aufscheinen, ist sicherlich der Kürze des Beispiels geschuldet, oder?</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761946#m1761946 pl 2019-12-19T13:59:13Z 2019-12-19T13:59:13Z OOP Polymorphie <blockquote> <p>Dass die Sitemap-Elemente lastmod, changefreq und priority nicht aufscheinen, ist sicherlich der Kürze des Beispiels geschuldet, oder?</p> </blockquote> <p>Nein. Warum das fehlt hab ich doch geschrieben. MFG</p> https://forum.selfhtml.org/self/2019/dec/12/warum-nicht-error-exception-uberprufung-in-validatoren/1761971#m1761971 Rolf B 2019-12-19T17:19:48Z 2019-12-19T17:19:48Z OOP Polymorphie <p>Hallo pl,</p> <p>mag sein. Aber nicht in diesem Thread.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - clusi </div>