Rolf B: Platzhalter in MySQL Funktionen

Beitrag lesen

Hallo dedlfix,

Die einzige Stolperstelle, die ich bei der Verwendung von PDOStatement::fetchObject sehe, ist die in der Dokumentation erwähnte und im ersten Kommentar hervorgehobene Eigenart dieser Methode, zuerst die Eigenschaften zu befüllen und danach den Konstruktor aufzurufen.

Da steht:

Clearly somebody thought they were being clever here - allowing you to access hydrated property-values from the constructor. Unfortunately, this is just not how OOP works - the constructor, by definition, is the first method called upon construction.

Der Terminus „hydrated“ für ein initialisiertes Feld ist mir auch noch nicht begegnet 😂. Aber der Autor übersieht, dass seine Regel nicht verbietet, dass vor Methodenaufrufen Werte an Felder zugewiesen werden können und dürfen.

// C#
public class Foo 
{
   public int Bar = Program.GetBar();

   public Foo() 
   {
      Console.WriteLine($"Hier spricht Der Erbauer: {this.Bar}");
   }
}

class Program
{
   public static int GetBar()
   {
      Console.WriteLine("Hier ist GetBar()");
      return 47;
   }
   static int Main(string[] args)
   {
      var x = new Foo();
   }
}

Ausgabe ist:

Hier ist GetBar()
Hier spricht Der Erbauer: 47

Und in PHP

class Thingy {
   public $baz = 17;
   public function __construct() {
      echo "Your thingy is {$this->baz}\n";
   }
}
new Thingy();

Auch hier ist baz initialisiert bevor der Konstruktor anläuft.

Es ist üblich und erwartbar, dass Feldinitialisierer vor dem Konstruktor laufen. In einer Vererbungshierarchie folgt der C# Ablauf einem up-down Modell: Die Initialisierer werden bottom-up ausgeführt (Subklasse zuerst), die Konstruktoren top-down (Superklasse zuerst). Und sie dürfen sogar mehr tun als nur eine Konstante zuzuweisen. Ein solcher Feldinitialisierer darf nur keine Instanzmethode des erzeugten Objekts nutzen (oder um es in C# Speak zu sagen: CS0236: A field initializer cannot reference the non-static field, method, or property ...)

PHP lässt nur konstante Werte zu, von daher kann man nicht monitoren in welcher Reihenfolge die Initialisierung abläuft - es ist wegen der Beschränkung auf Konstanten aber auch wurscht.

Für den PDO Einsatz ist die Idee tatsächlich clever und mbMn auch sinvoll. Der Konstruktor kann genutzt werden, falls die geladenen Daten noch ergänzt werden sollen.

Diesen Ablauf mit PHP-Sprachmitteln nachzuahmen (d.h. erst Objekt erzeugen, dann ein paar Werte zuweisen und danach erst den Konstruktor laufen lassen) dürfte aber nicht gehen.

Rolf

--
sumpsi - posui - clusi