Objekte und objektorientiertes Programmieren

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Chrissi007
Mitglied
Beiträge: 114
Registriert: 08.02.2003 12:43
Kontaktdaten:

Objekte und objektorientiertes Programmieren

Beitrag von Chrissi007 »

Hi Leute,

ich bin gerade dabei in die objektorientierte Programmierung von mysqli einzusteigen. Mein Klassenaufbau sieht so aus:

Code: Alles auswählen

class mysqldb extends mysqli {
...
}

$mysqldb = new mysqldb ($host, $user, $pass, $db);
Ich habe diesbezüglich eine Frage:

Wenn ich ...

Code: Alles auswählen

$result = $mysqldb->query("SELECT ...");
... verwende, kann ich komfortabel auf das $result direkt zugreifen, z.B. so:

Code: Alles auswählen

$row = $result->fetch_array();
Ich muss dem fetch_array() dabei kein Argument übergeben, sondern ich hänge den Aufruf per -> einfach hinter das Objekt (?) :) Ich wollte jetzt eine Methode getAll() kreieren, die genauso funktioniert und mir alle Datensätze der SQL-Abfrage in Array-Form liefert. Ein Aufruf sollte so aussehen:

Code: Alles auswählen

$result = $mysqldb->query("SELECT ...");
$data = $result->getAll();
Aber hier, an dieser Stelle hakts irgendwie bei mir? Ich weiß nicht, wie ich die Methode getAll zu definieren habe, damit ich die "argumentlos" (also genauso wie das fetch_array()) an das $result (Objekt?) anhängen kann. Mein bisheriger Ansatz sieht so aus:

Code: Alles auswählen

public function getAll ($result)
{
    while ($row = $result->fetch_array())
    {
        $data[] = $row;
    }
    return $data;
}
Allerdings übergebe ich in diesem Fall das Argument $result, was den oben genannten Aufruf eigentlich unmöglich machen würde. Wisst ihr was ich meine? Eigentlich möchte ich genau dieses $result-Argument in Klammern weglassen und die Funktion so kreieren, dass ich sie einfach per -> an mein Objekt (?) anhängen kann. Ich meine, ich hab mal gesehen, dass man ein &-Zeichen vor das Argument beim Definieren der Klasse setzen kann. Ist das in diesem Fall das, was ich suche?
Gruß, Chrissi :D
Benutzeravatar
cYbercOsmOnauT
Ehemaliges Teammitglied
Beiträge: 3820
Registriert: 18.02.2004 23:02
Wohnort: Göttingen
Kontaktdaten:

Re: Objekte und objektorientiertes Programmieren

Beitrag von cYbercOsmOnauT »

Du bringst da einiges durcheinander. Deine Methode getAll kann keine Methode des Result-Objekts sein, da Deine Klasse ein Child der mysqli-Klasse ist. Ohne es getestet zu haben, würde ich folgenden Weg vorschlagen:

Code: Alles auswählen

class mysqldb extends mysqli {
private $result;

public function query($query) {
 $this->result = parent::query($query);
 return $this->result;
}

public function getAll ()
{
    while ($row = $this->result->fetch_array())
    {
        $data[] = $row;
    }
    return $data;
}

...
}

$mysqldb = new mysqldb ($host, $user, $pass, $db); 
Wie gesagt reine Gedankenspielerei. Hoffe es hilft Dir weiter.

Grüße,
Tekin
• prof. phpbb-Installation, Reparatur, Rettung nach Hackattacken, sowie PHP/JS Programmierung aller Art
Zend Certified Engineer, Linux Administrator und die Sicherheit von 34 Jahren Programmiererfahrung
• Interesse? Kontakt unter t.birduezen@web-coding.eu
Chrissi007
Mitglied
Beiträge: 114
Registriert: 08.02.2003 12:43
Kontaktdaten:

Re: Objekte und objektorientiertes Programmieren

Beitrag von Chrissi007 »

Hi,

vielen Dank für deine Idee. Ich werd's gleich testen!

Dennoch: Besteht beim objektorientierten Programmieren nicht die Möglichkeit, dass ich eine Methode in der Kindsklasse bastle, die "Zugriff" (mir fiel kein besseres Wort ein) auf die Methoden bzw. Objekte der Eltern-Klasse hat (in diesem Fall mysqli)?

Ich meine, ich hab mal diese Magic-Methods entdeckt wie z.B. __call(). Allerdings verstehe ich noch nicht so recht, wie man das anwendet und ob das hier in diesem Zusammenhang überhaupt weiterhelfen würde?

Achso und zu guter letzt:

Code: Alles auswählen

private $result;
was genau bewirkt das "private"? :)

Vielen Dank noch mal!
Gruß, Chrissi :D
Benutzeravatar
cYbercOsmOnauT
Ehemaliges Teammitglied
Beiträge: 3820
Registriert: 18.02.2004 23:02
Wohnort: Göttingen
Kontaktdaten:

Re: Objekte und objektorientiertes Programmieren

Beitrag von cYbercOsmOnauT »

Phew... Deine Fragen sind m.E. eher im Bereich Grundlagenwissen. Ich würde Dir anraten, bevor Du anfängst OO zu programmieren, ein gutes Buch über OOP in PHP zu lesen. Antworten bekommst Du natürlich trotzdem.
Chrissi007 hat geschrieben:Dennoch: Besteht beim objektorientierten Programmieren nicht die Möglichkeit, dass ich eine Methode in der Kindsklasse bastle, die "Zugriff" (mir fiel kein besseres Wort ein) auf die Methoden bzw. Objekte der Eltern-Klasse hat (in diesem Fall mysqli)?
Ja natürlich. Entweder als Rückgabewert (geschieht hier) oder aber als protected Variable auf die die Kinder zugreifen können. Ersteres wird von der mysqli Klasse angeboten und das können wir nicht einfach "umbiegen", sondern müssen mit sog. Überladungen arbeiten. Auf der Docpage von fetch_array() steht ganz klar mysqli_result::fetch_array und nicht mysqli.
Chrissi007 hat geschrieben:Ich meine, ich hab mal diese Magic-Methods entdeckt wie z.B. __call(). Allerdings verstehe ich noch nicht so recht, wie man das anwendet und ob das hier in diesem Zusammenhang überhaupt weiterhelfen würde?
__call() tritt in Kraft wenn man eine Methode aufruft die entweder nicht existiert, oder aber man keine Zugriffsrechte darauf hat (z.B. Aufruf einer private Methode von Aussen). Ist somit in Deinem Kontext nicht nötig.
Chrissi007 hat geschrieben:was genau bewirkt das "private"? :)
Thema Sichtbarkeit. Kurz und knapp beschrieben:
public - Jeder darf darauf zugreifen und es verändern
protected - Nur die Klasse selber oder seine Kindsklassen dürfen darauf zugreifen und es verändern
private - Nur die Klasse selber darf darauf zugreifen und es verändern

Somit ist private der stärkste Schutz einer Methode oder Variable. Um Variablen vor ungewollten Veränderungen von aussen zu schützen, setzt man diese meist als private und baut sog. Getter und Setter-Methoden die public sind und die dann schauen, ob der Anfragende diesen Wert überhaupt lesen oder ändern darf.

Gruß,
Tekin
• prof. phpbb-Installation, Reparatur, Rettung nach Hackattacken, sowie PHP/JS Programmierung aller Art
Zend Certified Engineer, Linux Administrator und die Sicherheit von 34 Jahren Programmiererfahrung
• Interesse? Kontakt unter t.birduezen@web-coding.eu
Chrissi007
Mitglied
Beiträge: 114
Registriert: 08.02.2003 12:43
Kontaktdaten:

Re: Objekte und objektorientiertes Programmieren

Beitrag von Chrissi007 »

Super, vielen Dank soweit! :)
Gruß, Chrissi :D
Chrissi007
Mitglied
Beiträge: 114
Registriert: 08.02.2003 12:43
Kontaktdaten:

Re: Objekte und objektorientiertes Programmieren

Beitrag von Chrissi007 »

Hi,

deine Methode funktioniert wunderbar, danke noch mal. Ein Problem hat sich beim Scripten aber gerade noch ergeben:

Testhalber, folgendes Script:

Code: Alles auswählen

// Zwei von einander unabhängige Queries werden ausgeführt. Deren Inhalt soll in $result_a bzw. $result_b gespeichert werden.
$result_a = $mysqldb->query('SELECT blubb');
$result_b = $mysqldb->query('SELECT bla');

// jetzt möchte ich auf die Werte, die $result_a und $result_b tragen, zugreifen. Also:
$data_a = $result_a->getAll();
$data_b = $result_b->getAll();

// aber Hoppla... Nur $data_b ist mit Inhalten gefüllt?
var_dump($data_a);
var_dump($data_b);
Mein Vermutung liegt darin, dass der Aufruf

Code: Alles auswählen

$result_b = $mysqldb->query('SELECT ...');
das Ergebnis von der Zeile zuvor, überschreibt. Siehe die beiden Methoden:

Code: Alles auswählen

public function query ($sql)
    {
        $this->result = parent::query($sql);
        return $this;
    }
Hier wird $this->result ein Wert zugewiesen, und weiter unten wird darauf zugegriffen:

Code: Alles auswählen

public function getAll ()
    {        
        while ($row = $this->result->fetch_array())
        {
            $data[] = $row;
        }
        return $data;
    }
Die Methode getAll() greift also immer auf das zuletzt generierte $this->result zu...
So gesehen könnte ich dann anstelle von

Code: Alles auswählen

$data_b = $result_b->getAll();
auch folgendes Szenario verwenden, mit dem gleichen Outcome:

Code: Alles auswählen

$data_b = $mysqldb->getAll();
Ich steh da gerade irgendwie auf dem Schlauch. Ich kann mir nicht vorstellen, dass das der Sinn der objektorientierten Programmierung ist? :( Was muss ich tun, dass ich die Methode getAll() auf das Objekt anwende, das ich mittels dem Pfeilchen -> vor den Methodenaufruf gestellt habe?
Gruß, Chrissi :D
Benutzeravatar
cYbercOsmOnauT
Ehemaliges Teammitglied
Beiträge: 3820
Registriert: 18.02.2004 23:02
Wohnort: Göttingen
Kontaktdaten:

Re: Objekte und objektorientiertes Programmieren

Beitrag von cYbercOsmOnauT »

2 Lösungsmöglichkeiten...

1.) Wir passen die Methode getAll leicht an

Code: Alles auswählen

public function getAll ($res = false)
{
    $res = ( $res && is_resource($res) ) ? $res : $this->result;

    while ($row = $res->fetch_array())
    {
        $data[] = $row;
    }
    return $data;
}
Nun kannst Du getAll ohne Attribut aufrufen wenn Du den Resultset des letzten Query bekommen willst, oder Du sendest den Result-Resource beim Aufruf mit. Den Resource bekommst Du ja als Returnwert von query.

2.) Wahlweise baust Du eine kleine Setter-Methode für den Result

Code: Alles auswählen

public function setResultResource($res) {
    if (is_resource($res))
    {
        $this->result = $res;
    }
}
Dann kannst Du immer setzen welchen Resultset Du jetzt ansprechen willst.

Kleiner Nachtrag: Ich vergesse immer wieder das phpBB den BSD Einrückungstil nutzt. Ich bin eher Anhänger des 1TBS und springe deswegen oft zu meinem eigentlichen Stil. Seht es mir nach :)
• prof. phpbb-Installation, Reparatur, Rettung nach Hackattacken, sowie PHP/JS Programmierung aller Art
Zend Certified Engineer, Linux Administrator und die Sicherheit von 34 Jahren Programmiererfahrung
• Interesse? Kontakt unter t.birduezen@web-coding.eu
Antworten

Zurück zu „Coding & Technik“