Unterschiede in PHP Varianten

Also wird erst das Statement an den SQL-Server geschickt - der speichert es und anschließend werden nur noch die Werte geschickt, die dann der SQL-Server selbst einsetzt?

Exakt so. Der minimierte Traffic ist ein netter Nebeneffekt aber nicht das eigentliche Ziel. Das hauptsächliche Ziel ist, das der SQL-Planner nur einmal arbeiten muss. Denn der macht nämlich die Hauptarbeit.

Ist es zwingend notwendig, die Typen zu maskieren? Oder kann man theoretisch einfach alle als String definieren?

Das ist natürlich abhängig vom Datentyp, den die jeweilige Spalte repräsentiert. Das interne Maskieren, das PS unterstützt ist darauf ausgelegt, welchen Datentypen man definiert und welche Operanden an die Funktionen übergeben werden.
 
Naja sagen wir, ich hab 3string-Felder und 2int-Felder. Muss ich dann sssii schreiben, oder geht sssss auch?
BLOBs, davon halt ich eh nicht sonderlich viel und double ist mir noch nicht untergekommen. ^^

€: OT: tragische Sache mit Bayern. ^^
 
Probier es aus ;-) Ich muss gestehen, das ich mit MySQLi nicht viel gemacht habe, auch nicht ausprobiert, was passiert, wenn man absichtlich falsche Datentypen beim Binden angibt. Ich hantiere ohnehin mit PDO :)

EDIT: Vermutlich wird der execute() dir um die Ohren gehauen.
 
Naja, und ich muss gestehen, ich hab weder PDO noch MySQLi jemals richtig benutzt. ^^
Ich hab mir die letzte Zeit erstmals Tutorials zu OOP durchgelesen, gleichzeitig auch zu Mysqli und PDO, wobei ich sagen muss, dass ich bei manchem noch nicht durchsteige.
Bei OOP verwendet man manchmal self, manchmal this... Ziemlich wirr das Ganze, aber ich denke, wenn man mehr damit arbeitet, lernt man es relativ schnell... Die einzige OOP-Geschichte, die ich je benutzt habe, war bei C#, wenn man das vergleichen kann/darf/soll...

So noch die "nicht nüchternen" Bekannten heimfahren, dann ab in die Falle.
 
$this verwendet man, wenn man eine Instanz hat. self verwendet man, wenn man static arbeitet. Beispiel:

PHP:
class Singleton
{
  private static $_instance;

  private $_text;

  private function __construct()
  {
    // Hier sind wir in einer Instanz von Singleton - also nicht statisch
    $this->_text = 'Hallo Welt';
  }

  public static function getInstance()
  {
    if( null == self::$_instance ) // $this würde einen Fehler werfen
    {
      self::$_instance = new self;
    }

    return self::$_instance;
  }

  public function getText()
  {
    // Hier sind wir wieder in der Instanz
    return $this->_text;
  }

  public function __clone() {} // Kopien nicht zulassen
}

$instanz = Singleton::getInstance();
var_dump($instanz);

echo $instanz->getText();

// Singletons haben die Eigenschaft nur eine einzige Instanz zu zulassen:

$instanz = Singleton::getInstance();
var_dump($instanz);

echo $instanz->getText();

Was ist hier passiert?

1. Singleton ist ein Design-Pattern (Entwurfsmuster) das genau eine einzige Instanz der Klasse, die das Singleton implementiert, zulässt. Das sieht man anhand von 3 Kriterien:
- Der Konstruktor ist immer privat - das verhindert "new Singleton"
- Es gibt eine statische Methode, um eine Instanz zurück zu geben, die entweder bereits existiert oder neu angelegt wird; Die Singleton-Klasse speichert ihre eigene Instanz intern widerum in einer statischen Variable.
- Kopieren von Instanzen ist nicht möglich

2. Bei statischem Zugriff auf Member-Variablen innerhalb der Klasse verwendet man self.

3. Bei nicht-statischem also instanz-behaftetem Zugriff auf Member-Variablen verwendet man $this.
 
So ganz gerafft hab ichs immer noch nicht. Muss man die Klasse dann nicht erst erzeugen?
PHP:
$class = new Singleton();
Wird der Konstruktor immer ausgeführt? Auch wenn man keine Klasse (bzw. das Objekt) erzeugt?
Was um Himmels Willen ist eine Instanz, in diesem Zusammenhang?

In den Tutorials, die ich gelesen habe, kam weder das Wort Instanz vor, noch wurden statische und nicht-statische Funktionen in einem Beispiel zsm. verwendet.
 
@saftmeister
Du solltest aber auch nicht vergessen, das dieses Pattern eigentlich die Pest ist, eine regelrechte Modeerscheinung, da haben sich wohl mal einige Programmierer die Mühe gemacht und das komplette Ding zerpflückt und eine "Globale Sichtbarkeit" der Klasse festgestellt, welches eigentlich total unerwünscht war (ich selber finde dieses Pattern nicht schlecht), habe allerdings inzwischen meine Factory mit Import und brauche eigentlich keine Singleton mehr :)
 
Wird der Konstruktor immer ausgeführt? Auch wenn man keine Klasse (bzw. das Objekt) erzeugt?
Was um Himmels Willen ist eine Instanz, in diesem Zusammenhang?

In den Tutorials, die ich gelesen habe, kam weder das Wort Instanz vor, noch wurden statische und nicht-statische Funktionen in einem Beispiel zsm. verwendet.

(!) Du kannst keine Klassen erzeugen, du kannst höchstens Objekte aus Klassen erzeugen (bitte die Begrifflichkeiten auseinander halten - das ist wichtig) (!)

1. Die Klasse ist der Bauplan für ein Objekt. Mit dem Schlüsselwort "new" erzeugst du ein neues Objekt aus dieser angegebenen Klasse. Beim Erzeugen des Objekts wird der Konstruktor aufgerufen (falls vorhanden); Es sei denn, der Konstruktor ist privat deklariert. Privat gekennzeichnete Mitglieder einer Klasse sind nur innerhalb der Klasse verfügbar und können nicht von "außen" zugegriffen werden.

Beispiel für den Zugriff innerhalb der Klasse ist, wenn die Methode einer Klasse auf eine Mitgliedsvariable oder eine weitere Methode derselben Klasse zugreifen will. Man sagt auch, der Zugriff ist privat (private).

Zugriff von außen ist bspw. wenn aus einem Bereich außerhalb der Klasse auf eine Eigenschaft oder Methode zugegriffen werden soll. Man spricht auch von einem öffentlichen (public) Zugriff.

Es gibt noch den protected-Zugriff, aber das lassen wir erstmal beiseite. Kann man später drüber fabulieren.

Damit ich also auf die Variable oder Methode einer Klasse von außerhalb derselben Klasse zugreifen kann, muss diese Variable oder Methode öffentlich also public sein. Ist das nicht der Fall, wird der Parser es mit einem fatal error quitieren.

Was jedoch funktioniert, ist, innerhalb der Klasse auf öffentliche Mitgliedsvariablen oder Methoden zuzugreifen.


2. Instanz

Eine Instanz hast du immer dann, wenn du mit "new" eine solche erzeugst. Prinzipiell ist jedes Objekt eine Instanz.

Klären wir das mal anhand von meinem Lieblingsbeispiel: Autos (ich weiß, klingt doof - trifft es aber)

- Du hast den Bauplan für ein Auto, nennen wir es mal Porsche 911 - das wäre die Klasse
- Du machst daraus ein neues Auto, also ein konkretes Objekt, was man anfassen, benutzen, sonst was machen kann (über Methoden) - das wäre Instanz 1
- Dein Kumpel macht aus dem Bauplan, den du ihm freundlicherweise gegeben hat, noch ein Auto; mit diesem Objekt kann man das gleiche machen, wie mit deinem - das wäre Instanz 2

Damit man ein neues Auto aus dem Bauplan erzeugen kann, braucht man einen Konstruktor. Dabei handelt es sich einfach um eine Methode, die einen bestimmten speziellen Namen "__construct" hat.

3. Vererbung

Es gibt für alle Objekte einen Standard-Konstruktor (der leer ist und keine Funktionalität beinhaltet). Deshalb ist es nicht schlimm, wenn du einen Bauplan hast, in dem kein eigener Konstruktor drin ist - es wird einfach der Standard-Konstruktor verwendet. Man kann jedoch den Standard-Konstruktor verändern, in dem man ihn überschreibt - das geht übrigens mit allen Methoden. Überschreiben ist einfach. Man schreibt einfach eine neue Methode, die genauso heißt wie die, die man überschreiben will. Damit wird der Standard-Konstruktor hinfällig und auch nicht mehr ausgeführt.

Was das mit Vererbung zu tun hat? Prinzipiell ist jede Klasse, die du selbst schreibst, eine Vererbung der Klasse "stdClass", die es in PHP bereits gibt. Wenn man schon mal mit anderen OOP-Sprachen zu tun hatte (Java, C#, etc.) kennt man das Prinzip vielleicht, dort heißt das Dingens einfach nur "Object".


Und wenn die Tutorials zu OOP nicht mal elementare Begriffe wie "Instanz" oder statischen und instanz-behafteten Zugriff erklären und die Sachen einfach verwenden, ohne zu beschreiben, was genau damit gemacht wird, sind die Tutorials keine solchen. ;-)

Du solltest auf jeden Fall erstmal den Unterschied zwischen Klasse und Objekt verstehen. Klasse = Bauplan, Objekt (Instanz) = Ergebnis der <Konstruktion> aus einem Bauplan. Wie in der realen Welt.

Objekt-orientiertes Programmieren beginnt im Kopf - nicht am Computer. ;-) Unser menschliches Gehirn ist bereits objekt-orientiert - es müsste uns eigentlich sehr leicht fallen, das Prinzip der OOP zu verstehen.


Du solltest aber auch nicht vergessen, das dieses Pattern eigentlich die Pest ist, eine regelrechte Modeerscheinung, da haben sich wohl mal einige Programmierer die Mühe gemacht und das komplette Ding zerpflückt und eine "Globale Sichtbarkeit" der Klasse festgestellt, welches eigentlich total unerwünscht war (ich selber finde dieses Pattern nicht schlecht), habe allerdings inzwischen meine Factory mit Import und brauche eigentlich keine Singleton mehr :)

[ ] Du hast den Sinn und Zweck sowie den Unterschied zwischen Factory- und Singleton-Pattern verstanden.

Wenn man das beides direkt miteinander vergleichen könnte, bräuchte man eines von beiden nicht. Beide Entwurfsmuster haben ihre Daseinsberechtigung - vom jeweiligen Anwendungsfall aus gesehen. Singleton ist genau das, Factory macht genau das.

Singleton = immer nur eine Instanz von sich selbst
Factory = eine neue Instanz von irgendwas (evtl. ist sogar erst zur Laufzeit klar, was die Factory für ein Objekt zurückgeben wird)

Du würfelst hier wild mit Begriffen umher, die du selbst anscheinend noch nicht verstanden hast und verwirrst damit die Leute nur. Sei doch bitte etwas behutsamer - vor allem mit den Anfängern, die im Gegensatz zu dir noch wirklich am Anfang stehen.
 
Zuletzt bearbeitet:
Sorry für den Doppel, aber hier ist notwendig. Ich habe deine erste Frage noch nicht beantwortet:

So ganz gerafft hab ichs immer noch nicht. Muss man die Klasse dann nicht erst erzeugen?
PHP:
$class = new Singleton();

Schau dir mal im Code-Beispiel die Methode "getInstance" genau an. Ich schreib sie hier noch mal hin:

PHP:
  public static function getInstance()
  {
    if( null == self::$_instance ) // $this würde einen Fehler werfen
    {
      self::$_instance = new self;
    }
 
    return self::$_instance;
  }

Zuerst wird geprüft, ob die statische Member-Variable $_instance bereits belegt ist. Wenn dem nicht so ist, sie also null ist (Standard-Fall), wird "new self" aufgerufen, was im Prinzip nichts anderes als "neues Selbst" also neue Instanz von sich selbst (eigene Klasse) ist. Natürlich könnt man auch "new Singleton" schreiben, so hat es aber den Vorteil, das man die Klasse einfach umbenennen kann und sie genau das gleiche tut, eine Instanz von sich selbst erzeugen.

Die neue Instanz von sich selbst wird der statischen Mitgliedsvariablen $_instance zugewiesen. Damit ist diese nicht mehr null und beim nächsten Aufruf von "getInstance()" wird der if-Code-Block nicht mehr ausgeführt.

Zuletzt gibt die getInstance()-Methode einfach das Objekt - also die Instanz zurück, die in $_instance drin steht.
 
Naja sagen wir, ich hab 3string-Felder und 2int-Felder. Muss ich dann sssii schreiben, oder geht sssss auch?
BLOBs, davon halt ich eh nicht sonderlich viel und double ist mir noch nicht untergekommen. ^^

€: OT: tragische Sache mit Bayern. ^^

Du musst Integer auch als solches eintragen, in deinem Fall würde sssss zu einem Fehler führen!

Abgesehen davon find ich es klasse das dieses Thema scheinbar für mehrere neuland ist und eine so sachliche Diskussion daraus entstanden ist wo sich jeder was einbringt und auch jeder Fragen zu hat.

Freut mich Richtig ;)
 

Neue Beiträge

Zurück