tag:forum.selfhtml.org,2005:/self Ist PDOStatement::setFetchMode Overloading? – SELFHTML-Forum 2019-04-26T21:31:14Z https://forum.selfhtml.org/self/2019/apr/26/ist-pdostatement-setfetchmode-overloading/1747419#m1747419 MB 2019-04-25T23:24:57Z 2019-04-25T23:24:57Z Ist PDOStatement::setFetchMode Overloading? <p>moin,</p> <p>ich will mir meine <em>Database</em>-Klasse erneuern und habe dazu eine neues <em>Property</em> <code>PDO::FETCH_CLASS</code> neben <code>PDO::FETCH_OBJ</code> in meiner gebauten Methode verwendet.</p> <p>ich bin etwas stutzig geworden weil man ja in <em>PHP</em> kein <em>Overloading</em> betreiben sondern nur Parameter Defaults verwenden darf wie z.B. <code>function foobar( $param1 = 'tok', $param2 = 'qux' ) {}</code> Ich kann ja beliebig viele Parameter mit Wert <code>null</code> angeben und die Funktion aufrufen, das funzt. Anders die Methode <code>PDOStatement::setFetchMode</code> .</p> <pre><code class="block language-php"><span class="token keyword">public</span> <span class="token class-name static-context">PDOStatement</span><span class="token operator">::</span><span class="token function">setFetchMode</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$mode</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span> </code></pre> <pre><code class="block language-php"><span class="token keyword">public</span> <span class="token class-name static-context">PDOStatement</span><span class="token operator">::</span><span class="token function">setFetchMode</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$PDO</span><span class="token operator">::</span><span class="token constant">FETCH_COLUMN</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$colno</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span> </code></pre> <pre><code class="block language-php"><span class="token keyword">public</span> <span class="token class-name static-context">PDOStatement</span><span class="token operator">::</span><span class="token function">setFetchMode</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$PDO</span><span class="token operator">::</span><span class="token constant">FETCH_CLASS</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$classname</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">array</span> <span class="token variable">$ctorargs</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span> </code></pre> <pre><code class="block language-php"><span class="token keyword">public</span> <span class="token class-name static-context">PDOStatement</span><span class="token operator">::</span><span class="token function">setFetchMode</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$PDO</span><span class="token operator">::</span><span class="token constant">FETCH_INTO</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">object</span> <span class="token variable">$object</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span> </code></pre> <p>Hier einen Auszug <a href="https://www.php.net/manual/de/pdostatement.setfetchmode.php" rel="nofollow noopener noreferrer">pdostatement.setfetchmode.php</a> aus <strong>php.net</strong></p> <p>könnten da <em>Try-Catch</em>-Blöcke, welches die Parameter behandelt, in dieser <code>setFetchMode</code> enthalten sein? Dann ergibt es für mich einen Sinn sonst bin ich überfragt.</p> <p>Ich möchte saubere Codes schreiben können für eine Wiederverwendung.</p> <pre><code class="block language-php"><span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token variable">$statement</span> <span class="token operator">=</span> <span class="token keyword static-context">self</span><span class="token operator">::</span><span class="token variable">$_handler</span><span class="token operator">-></span><span class="token function">prepare</span><span class="token punctuation">(</span> <span class="token variable">$query</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$statement</span><span class="token operator">-></span><span class="token function">setFetchMode</span><span class="token punctuation">(</span> <span class="token comment">/* wie gefetcht */</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$statement</span><span class="token operator">-></span><span class="token function">execute</span><span class="token punctuation">(</span> <span class="token variable">$params</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$cargo</span><span class="token punctuation">(</span> <span class="token variable">$statement</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span><span class="token punctuation">(</span> <span class="token class-name type-declaration">PDOException</span> <span class="token variable">$ex</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">PDOException</span><span class="token punctuation">(</span> <span class="token variable">$ex</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Wenn ich jetzt <code>$statement->setFetchMode( $mode, null, null );</code> mit <code>PDO::FETCH_ASSOC</code> schreibe meckert er. Wenn ich den Parameter Wert <code>null</code> weglasse funzt es.</p> <pre><code class="block">Warning: PDOStatement::setFetchMode(): SQLSTATE[HY000]: General error: fetch mode doesn't allow any extra arguments [...] </code></pre> <p>ich bin einwenig überfordert</p> <p>lgmb</p> https://forum.selfhtml.org/self/2019/apr/26/ist-pdostatement-setfetchmode-overloading/1747423#m1747423 dedlfix 2019-04-26T06:01:10Z 2019-04-26T06:01:10Z Ist PDOStatement::setFetchMode Overloading? <p>Tach!</p> <blockquote> <p>ich bin etwas stutzig geworden weil man ja in <em>PHP</em> kein <em>Overloading</em> betreiben sondern nur Parameter Defaults verwenden darf</p> </blockquote> <p>Das ist eher eine Frage des Könnens. Man kann es einfach nicht, weil Methoden eindeutig benannt sein und einzig müssen. Man kann andererseits in der Deklaration einer Funktion sämtliche Parameterangaben weglassen und lediglich über <a href="https://www.php.net/manual/en/ref.funchand.php" rel="nofollow noopener noreferrer">Function handling Functions</a> auf die zur Laufzeit tatsächlich übergebenen Parameterwerte zugreifen.</p> <blockquote> <pre><code class="block language-php"><span class="token keyword">public</span> <span class="token class-name static-context">PDOStatement</span><span class="token operator">::</span><span class="token function">setFetchMode</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$mode</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span> </code></pre> <pre><code class="block language-php"><span class="token keyword">public</span> <span class="token class-name static-context">PDOStatement</span><span class="token operator">::</span><span class="token function">setFetchMode</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$PDO</span><span class="token operator">::</span><span class="token constant">FETCH_COLUMN</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">int</span> <span class="token variable">$colno</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span> </code></pre> <pre><code class="block language-php"><span class="token keyword">public</span> <span class="token class-name static-context">PDOStatement</span><span class="token operator">::</span><span class="token function">setFetchMode</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$PDO</span><span class="token operator">::</span><span class="token constant">FETCH_CLASS</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">string</span> <span class="token variable">$classname</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">array</span> <span class="token variable">$ctorargs</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span> </code></pre> <pre><code class="block language-php"><span class="token keyword">public</span> <span class="token class-name static-context">PDOStatement</span><span class="token operator">::</span><span class="token function">setFetchMode</span> <span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$PDO</span><span class="token operator">::</span><span class="token constant">FETCH_INTO</span> <span class="token punctuation">,</span> <span class="token keyword type-hint">object</span> <span class="token variable">$object</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span> </code></pre> <p>Hier einen Auszug <a href="https://www.php.net/manual/de/pdostatement.setfetchmode.php" rel="nofollow noopener noreferrer">pdostatement.setfetchmode.php</a> aus <strong>php.net</strong></p> <p>könnten da <em>Try-Catch</em>-Blöcke, welches die Parameter behandelt, in dieser <code>setFetchMode</code> enthalten sein?</p> </blockquote> <p>Unwahrscheinlich. PHP ist ja nicht selbst in PHP geschrieben, und muss sich deshalb nicht zwingend an seine eigenen Syntaxregeln halten. So ist es möglich, dass Sprachkonstrukte existieren, die wie Funktionen aussehen, aber sich nicht wie andere PHP-Funktionen verhalten. Nur so können sie ihre Aufgabe erfüllen, ohne an den üblichen Mechanismen von PHP zu scheitern. Die Rede ist von isset() und empty(). Beide bekommen beim Aufrufen nicht lediglich den Wert des vorab aufgelösten Ausdrucks übergeben, sondern sie können auf den Variablennamen selbst zugreifen, um nach ihm in der internen Variablenverwaltung suchen zu können. Auf diese Weise können Fehlermeldungen beim Zugreifen auf nicht existierende Variablen vermieden werden. Andererseits (bei empty() vor PHP 5.5) können auch spezielle Meldungen generiert werden, wenn andere Ausdrücke statt nur Variablen übergeben werden. Diese Ausdrücke würden sonst vom übliche Mechanismus in ihren Wert aufgelöst werden, bevor sie empty() zu Gesicht bekommen könnte.</p> <p>In deinem Fall ist es wohl eher so, dass das PHP-Handbuch sozusagen Phyntasie-Syntax zeigt. Das tut es bereits seit langem, wenn es die Tyen der erwarteten Parameter anzeigt, noch lange bevor solche Type Hints für PHP-Scripts selbst verfügbar waren. Auch nicht existierende <a href="https://www.php.net/manual/en/language.pseudo-types.php" rel="nofollow noopener noreferrer">Pseudotypen</a> findet man in diesen Funktionsbeschreibungen.</p> <p>Konkret wird es wohl eher so sein, dass der interne C-Code für diese Funktion lediglich bis zu drei generische Parameter (also ohne konkrete Typvorgabe) entgegennimmt und dann selbst entscheidet, wie sie ausgewertet werden.</p> <blockquote> <p>Ich möchte saubere Codes schreiben können für eine Wiederverwendung.</p> </blockquote> <p>Ja, was konkret hindert dich daran, die Funktion auf die eine oder (exklusives Oder) andere Weise aufzurufen, je nachdem, welchen Mode du einstellen möchtest?</p> <blockquote> <p>Wenn ich jetzt <code>$statement->setFetchMode( $mode, null, null );</code> mit <code>PDO::FETCH_ASSOC</code> schreibe meckert er. Wenn ich den Parameter Wert <code>null</code> weglasse funzt es.</p> </blockquote> <p>Wen du verschiedene Fetch-Modes verwenden möchtest, diese aber über lediglich eine Funktion/Methode einstellen lassen möchtest, muss du letztlich genauso flexibel arbeiten und bis zu 4 Funktionsaufrufe darin unterbringen, und zu einem von ihnen je nach Mode verzweigen.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2019/apr/26/ist-pdostatement-setfetchmode-overloading/1747424#m1747424 Felix Riesterer https://felix-riesterer.de 2019-04-26T06:03:21Z 2019-04-26T06:03:21Z Ist PDOStatement::setFetchMode Overloading? <p>Lieber MB,</p> <blockquote> <p>ich will mir meine <em>Database</em>-Klasse erneuern</p> </blockquote> <p><a href="https://www.php.net/manual/de/book.pdo.php#64950" rel="nofollow noopener noreferrer">warum nicht so?</a></p> <pre><code class="block language-php"><span class="token keyword">class</span> <span class="token class-name-definition class-name">MyPDO</span> <span class="token punctuation">{</span> <span class="token keyword">protected</span> <span class="token variable">$pdo</span><span class="token punctuation">;</span> <span class="token comment">// \PDO object</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$dsn</span><span class="token punctuation">,</span> <span class="token variable">$user</span><span class="token operator">=</span><span class="token constant">NULL</span><span class="token punctuation">,</span> <span class="token variable">$pass</span><span class="token operator">=</span><span class="token constant">NULL</span><span class="token punctuation">,</span> <span class="token variable">$driver_options</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 variable">$this</span><span class="token operator">-></span><span class="token property">pdo</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PDO</span><span class="token punctuation">(</span><span class="token variable">$dsn</span><span class="token punctuation">,</span> <span class="token variable">$user</span><span class="token punctuation">,</span> <span class="token variable">$pass</span><span class="token punctuation">,</span> <span class="token variable">$driver_options</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// ...</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <p>So kannst Du alle Deine PDO-Objekte (auch PDOStatement etc.) nach Belieben erweitern.</p> <p>Liebe Grüße,</p> <p>Felix Riesterer.</p> https://forum.selfhtml.org/self/2019/apr/26/ist-pdostatement-setfetchmode-overloading/1747494#m1747494 pl https://rolfrost.de/words.html 2019-04-26T17:58:19Z 2019-04-26T17:58:19Z Ist PDOStatement::setFetchMode Overloading? <blockquote> <p>ich bin etwas stutzig geworden weil man ja in PHP kein Overloading betreiben</p> </blockquote> <p>Was in PHP (noch) nicht geht ist Overloading von Operatoren, Methoden jedoch kannst Du selbstverständlich überlagern in Deinen eigenen Klassenerweiterungen. So ist ein StatementHandler eine Instanz der Klasse PDOStatement und solange Du diese Klasse erweitern kannst ist es auch möglich deren Methoden zu überschreiben. MFG</p> https://forum.selfhtml.org/self/2019/apr/26/ist-pdostatement-setfetchmode-overloading/1747501#m1747501 MB 2019-04-26T21:31:14Z 2019-04-26T21:31:14Z Ist PDOStatement::setFetchMode Overloading? <p>moin,</p> <p>ich hab in der Methode <code>self::transmission( callable $cargo, string $query, array $params = [] )</code> zusätzlich ein weitere Methode geschrieben <code>self::getFetchMode( PDOStatement $statement ) : PDOStatement</code> die vom <strong>private</strong> <strong>array</strong> <em>Property</em> <code>self::$fetchMode</code> in den <strong>public</strong> Methoden <code>self::fetchXXX() : bool</code> ihren <em>FETCH_MODE</em> bekommt. Danke aber viel mals das ihrt mich dahin gebracht habt. Code könnt ihr gern in einer <em>PN</em> von mir haben.</p> <p>lgmb</p> https://forum.selfhtml.org/self/2019/apr/26/ist-pdostatement-setfetchmode-overloading/1747498#m1747498 MB 2019-04-26T20:48:39Z 2019-04-26T20:48:39Z Ist PDOStatement::setFetchMode Overloading? <p>moin,</p> <blockquote> <blockquote> <p>ich will mir meine <em>Database</em>-Klasse erneuern</p> </blockquote> <p><a href="https://www.php.net/manual/de/book.pdo.php#64950" rel="nofollow noopener noreferrer">warum nicht so?</a></p> <p>[...]</p> <p>So kannst Du alle Deine PDO-Objekte (auch PDOStatement etc.) nach Belieben erweitern.</p> </blockquote> <p>hab ich ja konstruiert mit einer <em>DatabaseModel</em> Klasse die <code>Driver</code>, <code>Host</code>, <code>Charset</code>, <code>User</code>, <code>Password</code> und <code>Options</code> beinhaltet und per <em>Constructor Injection</em> diese Werte als Objekt an die eigentliche <em>Database</em> mit statischen Methoden übergibt. Mir gehts um anschaulicher, wiederverwendbarer Code was mich vor ein Problem stellt wie ich diese Fetchts verwenden kann. Über ein internes Closure komme ich an die Daten ran.</p> <pre><code class="block language-php"><span class="token keyword">Interface</span> <span class="token class-name-definition class-name">DatabaseInterface</span> <span class="token punctuation">{</span> <span class="token comment">/** * @param type $category * @param type $constant */</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">setAttributes</span><span class="token punctuation">(</span> <span class="token keyword type-hint">int</span> <span class="token variable">$category</span><span class="token punctuation">,</span> <span class="token variable">$constant</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">void</span><span class="token punctuation">;</span> <span class="token comment">/** * @param string $query * @param array $params */</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">get</span><span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$query</span><span class="token punctuation">,</span> <span class="token keyword type-hint">array</span> <span class="token variable">$params</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">/** * @param string $query * @param array $params */</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">all</span><span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$query</span><span class="token punctuation">,</span> <span class="token keyword type-hint">array</span> <span class="token variable">$params</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">array</span><span class="token punctuation">;</span> <span class="token comment">/** * @param string $query * @param array $params */</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">send</span><span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$query</span><span class="token punctuation">,</span> <span class="token keyword type-hint">array</span> <span class="token variable">$params</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token keyword return-type">bool</span><span class="token punctuation">;</span> <span class="token comment">/** * */</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">fetchNum</span><span class="token punctuation">(</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 comment">/** * */</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">fetchAssoc</span><span class="token punctuation">(</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 comment">/** * */</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">fetchObject</span><span class="token punctuation">(</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 comment">/** * */</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">fetchClass</span><span class="token punctuation">(</span> <span class="token keyword type-hint">string</span> <span class="token variable">$class_name</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 punctuation">}</span> </code></pre> <p>lgmb</p> https://forum.selfhtml.org/self/2019/apr/26/ist-pdostatement-setfetchmode-overloading/1747499#m1747499 MB 2019-04-26T20:54:39Z 2019-04-26T20:54:39Z Ist PDOStatement::setFetchMode Overloading? <p>moin,</p> <blockquote> <blockquote> <p>ich bin etwas stutzig geworden weil man ja in PHP kein Overloading betreiben</p> </blockquote> <p>Was in PHP (noch) nicht geht ist Overloading von Operatoren, Methoden [...]</p> </blockquote> <p>Das ist mir bewusst. Ich war auf anderen Wege dieses Problem anzupacken, und da habe ich diese möglichkeit des Überschreibens aus den augen verloren. Danke das du mich dran erinnerst ;-). Vielleicht wird es über das Überschreiben das Problerm lösen. Bedankt</p> <p>lgmb</p>