MB: Kann nicht bei PDO Attributen vorab defiunierte Klassen fetchen

moin,

ich hab versucht in den PDO Attributen das Attribut PDO::ATTR_DEFAULT_FETCH_MODE mit PDO::FETCH_CLASS zu modifizieren. Aber ich weis nichtr wie ich zusätzlich noch die defeniertte Klasse in dieses PDO Attribut hinein verfrachten kann :/.

Ich habs dann so gemacht…

public static function fetchClass( $class ) : void {
  self::$_attributes = [
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_CLASS | $class
  ];
}

…mit kläglichem Ergebnis…

Warning: PDOStatement::fetch(): SQLSTATE[HY000]: General error: No fetch class specified in

lgmb

PS: neben bei gefragt: wie kann man eigentlich Klassen als Typ spezifizieren?

  1. Eine Klasse als Typ, was soll das sein!?

  2. Tach!

    ich hab versucht in den PDO Attributen das Attribut PDO::ATTR_DEFAULT_FETCH_MODE mit PDO::FETCH_CLASS zu modifizieren. Aber ich weis nichtr wie ich zusätzlich noch die defeniertte Klasse in dieses PDO Attribut hinein verfrachten kann :/.

    Ich sehe keinen Sinn darin, eine Default-Klasse für die gesamte Verbindung anzugeben. Das haben sich die PDO-Erfinder wohl auch so gedacht und haben PDOStatement::setFetchMode() eingebaut, denn was man da als Klasse haben möchte, ist ja abhängig vom konkreten Statement.

    Ich habs dann so gemacht…

    public static function fetchClass( $class ) : void {
      self::$_attributes = [
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_CLASS | $class
      ];
    }
    

    …mit kläglichem Ergebnis…

    Was soll auch dabei rauskommen, wenn du einen Integerwert und einen Klassennamen mit einem bitweisen Oder verknüpfst?

    PS: neben bei gefragt: wie kann man eigentlich Klassen als Typ spezifizieren?

    Bitte? Eine Klasse ist ein Typ. Meinst du vielleicht, wie man einen Klassennamen als Parameter übergeben kann? Also da die Funktion einen String haben möchte, wie man aus einer Klasse deren Namen als String bekommt? Das wäre ::class.

    dedlfix.

  3. Hallo MB,

    das sollte doch eigentlich im PDOStatement behandelt werden:

    $user = $stmt->fetchObject("User");
    

    sollte eine Row als User-Objekt bereitstellen.

    Mit PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_CLASS | $class kommst Du definitiv nicht hin, du kannst Zahlen und Strings nicht mit bitweisem Oder kombinieren.

    Wenn Du den Klasennamen nur einmal festlegen willst, kansnt Du dem PDOStatement über setFetchMode(PDO::FETCH_CLASS, "User") mitteilen, dass Du Objekte der Klasse User haben willst, und zum Lesen die fetch-Methode verwenden.

    Rolf

    --
    sumpsi - posui - clusi
  4. Hallo MB,

    wie kann man eigentlich Klassen als Typ spezifizieren

    Sprichst Du hier von type declarations beim Aufruf von Methoden oder Funktionen? Das geht zur Zeit nur mit skalaren Typen, oder generisch als "object". Eine Funktionsdeklaration wie removeUser(User u) ist nicht möglich. PHP kommt nur schrittweise beim Einführen strikter Typisierung voran - da müssen User und Programmierer der Sprache erstmal vom Nutzen überzeugt werden.

    Starke Typisierung bei Funktionsaufrufen bedeutet mehr Aufwand zur Laufzeit, es sei denn, man führt auch starke Typisierung bei Variablen und Objekteigenschaften ein - dann kann es der Compiler prüfen. Das ist aber ein Konzept, das PHP historisch fremd ist. Viele IDEs helfen hier über PHPDoc Kommentare, die Typhinweise enthalten, sie geben dann Warnungen aus.

    Was wohl in PHP 7.4 kommen soll, ist starke Typisierung bei Objekteigenschaften. Du brauchst also noch etwas Geduld, bis das geht.

    Rolf

    --
    sumpsi - posui - clusi
    1. moin,

      Sprichst Du hier von type declarations beim Aufruf von Methoden oder Funktionen?

      Die dumme frage von mir hat sich erübrigt. Sorry an alle. Der Klassen Namen ist ein String.

      Starke Typisierung bei Funktionsaufrufen bedeutet mehr Aufwand zur Laufzeit, es sei denn, man führt auch starke Typisierung bei Variablen und Objekteigenschaften ein

      Ja das wäre echt wünschenswert!!!

      Was wohl in PHP 7.4 kommen soll, ist starke Typisierung bei Objekteigenschaften. Du brauchst also noch etwas Geduld, bis das geht.

      Hamma! Da lohnt sich das warten 😀. dankeschön

      lgmb