PHP allgemein - Funktionen in Klassen

Das Forum soll der Ablage von Lösungen für immer wieder auftauchende Problemstellungen dienen. // This forum contains solutions to problems that frequently occur.
Antworten
Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

PHP allgemein - Funktionen in Klassen

Beitrag von dave » 04.03.2011, 19:44:32

Hallöchen zusammen

Ich habe da mal eine allgemeine PHP-Frage. Ich muss dazu sagen: Mit Klassen hatte ich bisher nicht viel am Hut, habe alles mit Funktionen erledigt. Diese Funktionen habe ich dann an hand ihres Funktionsnamen direkt aufgerufen.

In den Klassen ist mir aber aufgefallen, dass oftmals die einzelnen Funktionen, die es darin gibt, gar nicht direkt aufgerufen werden. In der Automatisierungstechnik (mein Fachgebiet) spricht man dann von indirekter Addressierung, was das nachvollziehen des Codes/der Anwendung schwierig macht ;). Mich wundert, wie dann das APF mit all seinen Klassen und den im Prinzip nicht aufgerufenene Funktionen läuft ;).

Einzig, was ich immer sehe ist static, public, final und so weiter. Was sind das für spezielle Angaben? Und wie kann es sein, dass ohen Funktionsaufruf das APF läuft ;).

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: PHP allgemein - Funktionen in Klassen

Beitrag von Screeze » 04.03.2011, 19:58:29

funktionen MÜSSEN nicht aufgerufen werden, sondern können es, ist ja nichts anderes als bei prozeduraler Programmierung, da musst du auch definierte Funktionen nicht verwenden.

Einzig, was ich immer sehe ist static, public, final und so weiter. Was sind das für spezielle Angaben?
Diese definieren zum einen die Sichtbarkeit der Funktion/variable, zum anderen die Art des aufrufs oder auch ähnliches, kurze übersicht:

private: Die funktion/variable kann nur innerhalb der Klasse selber aufgerufen/verändert werden. Eine klasse die von dieser klasse erbt, kann die Funktion/Variable nicht überschreiben.

protected:genau wie private, nur dass hier auch Klassen, die von dieser Klasse erben, die Funktion mit einer eigenen Funktion überschreiben können.

public: Die Funktion/variable kann auch von Ausserhalb der Klasse aufgerufen werden. Erbende Klassen können die Funktion überschreiben.

final: Von dieser Klasse darf keine andere Klasse erben.

static: Von dieser Klasse muss kein Objekt erzeugt werden, um die mit static deklarierte Funktion zu verwenden.

Beispiele und nähere Erläuterungen sowie viel weiteres zu OOP gibts hier:
http://de2.php.net/manual/de/language.oop5.php

speziell zu deinen Fragen:
http://de2.php.net/manual/de/oop5.intro.php
http://de2.php.net/manual/de/language.o ... bility.php
http://de2.php.net/manual/de/language.oop5.static.php

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: PHP allgemein - Funktionen in Klassen

Beitrag von dave » 04.03.2011, 20:34:41

Wow, das ist aber viel Stoff ;).

Ich arbeite mich da mal langsam nach und nach durch. Danke auch für die grobe Übersicht, das passt schonmal.

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: PHP allgemein - Funktionen in Klassen

Beitrag von dave » 06.03.2011, 13:48:48

Joho,

habe mal angefangen, meinen PHPMailerManager zu schreiben. Sieht für meine Verhältnisse auch schon gaaar nicht so schlecht aus ;).

Nun habe ich mal eine Frage:
Um den ConfigurationManager zu nutzen, muss meine Klasse ja vom base_controller (APFObject) erben. Dies tut sie im Moment aber nicht. Wie kann ich das nun ermöglichen, dass ich den ConfigurationManager nutzen kann. Kann ich auch eine zweite Klasse einbinden, die dann vom base_controller (APFObject) erbt und somit den ConfigurationManager nutzen, um eine Konfiguration zu laden und diese dann in meiner erste Klasse einbinden?

Bin auf dem Gebiet Klassen und so weiter noch nicht so fit, arbeite mich aber langsam rein.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: PHP allgemein - Funktionen in Klassen

Beitrag von dr.e. » 06.03.2011, 15:17:50

Hi dave,
Um den ConfigurationManager zu nutzen, muss meine Klasse ja vom base_controller (APFObject) erben.

Allgemein gilt, dass Document-Controller von der Klasse base_controller erben müssen. Das ist zugleich Konvention und Notwendigkeit, da die Klasse base_controller Eigenschaften von Document übernimmt, die ein Document-Controller für seiner Arbeit benötigt. Gleichermaßen hilft er dir aber auch bei Standard-Aufgaben (Suchen eines Formulars aus dem DOM, Suchen eines Templates aus dem DOM, ...).
Dies tut sie im Moment aber nicht. Wie kann ich das nun ermöglichen, dass ich den ConfigurationManager nutzen kann.

Seit 1.13 ist der ConfigurationManager eine statische, von überall aufrufbare Komponente. Schau mal in APFObject::getConfiguration(), da findest du folgendes:

Code: Alles auswählen

return ConfigurationManager::loadConfiguration(
   $namespace,
   $this->getContext(),
   $this->getLanguage(),
   Registry::retrieve('apf::core', 'Environment'),
   $name); 
Selbiges kannst du in deinem Code auch aufrufen. Die Methode aus der APFObject-Klasse macht das aufrufen nur angenehmer, wei du dich nicht um Context und Sprache kümmern musst.
Kann ich auch eine zweite Klasse einbinden, die dann vom base_controller (APFObject) erbt und somit den ConfigurationManager nutzen, um eine Konfiguration zu laden und diese dann in meiner erste Klasse einbinden?
Auch das kannst du, aber i.d.R. würde ich deine Klassen immer direkt oder indirekt von APFObject erben lassen - zumindest für Controller und Services, dann kannst du von den Erzeugungs-Mechanismen profitieren (siehe ServiceManager).
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: PHP allgemein - Funktionen in Klassen

Beitrag von dave » 06.03.2011, 17:22:55

Ich habe mich jetzt mal ein wenig an dem ServiceManager versucht.

In meiner Klasse phpMailerManager möchte ich dies verwenden. Die Klasse erbt vom APFObject:

Code: Alles auswählen

class phpMailerManager extends APFObject
Ich habe eine Funktion int($initParam), in welcher ich meine neue Klasse PHPMailer einbinden möchte:

Code: Alles auswählen

$myService = &$this->__getServiceObject('extensions::phpmailer::biz','PHPMailer'); 
Jedoch bekomme ich nun einer Fehler, dass meine gerade erstellte Klasse PHPMailer nicht vom APFObject erbt :?:
[ServiceManager->getServiceObject()] The precisely now created object (PHPMailer) inherits not from superclass APFObject! So the context cannot be set correctly!
Wo ist hier mein grundlegender Denkfehler?


Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: PHP allgemein - Funktionen in Klassen

Beitrag von dr.e. » 06.03.2011, 17:51:38

+
Ich habe eine Funktion int($initParam), in welcher ich meine neue Klasse PHPMailer einbinden möchte:
Sofern vom ServiceManager die init()-Methode aufgerufen werden soll, muss es __getAndInitServiceObject() (Parameter sie API-DOku) lauten.
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: PHP allgemein - Funktionen in Klassen

Beitrag von dave » 06.03.2011, 22:30:58

Mmmhhhh, irgendwie will das bei mir nicht so richtig klappen. Ich lass das einfach erstmal für ein paar Tage liegen und versuch mich mal an etwas einfacherem: Meine RandomString Klasse ;) Vllt. wird dann der Rest auch einfach etwas klarer ...


Nochmal eine allgemeine Frage:

Wenn ich eine Klasse "IchBinToll" erstelle, und dort eine Funktion "IchBinToll" schreibe, welche genau den selbsen Namen wie die Klasse trägt, wird diese dann immer sofort ausgeführt?
Wie funktioniert das ansonsten beim SessionManager?

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: PHP allgemein - Funktionen in Klassen

Beitrag von Screeze » 06.03.2011, 22:56:14

jep das ist der sogenannte Constructor. Allerdings die alte schreibweise, weshalb das APF nach und nach auf die magische methode __construct() umgestellt wird.

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: PHP allgemein - Funktionen in Klassen

Beitrag von dave » 06.03.2011, 23:07:12

Ah, sehr schön. Damit hätten wir auch gleich den Begriff "Konstrukt" geklärt. Warum das aber auch in der Beschreibung so nie heraus zu lesen ist ... muss denn immer alles so schwierig und verkompliziert sein? :lol:

Achso: Der Destruktor ist genau das Gegenteil?
Die Destruktormethode wird aufgerufen, sobald alle Referenzen auf ein bestimmtes Objekt entfernt werden oder wenn das Objekt explizit zerstört wird, oder in beliebiger Reihenfolge am Ende des Skripts.
Wie kann ich denn dieses Objekt explizit zerstören, um mal den Destruktor auszulösen?

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: PHP allgemein - Funktionen in Klassen

Beitrag von dr.e. » 06.03.2011, 23:14:02

Ein Objekt wird - sofern nicht als SessionSingleton erzeugt oder in einem anderen persistenten Store gespeichert - immer am Ende des Requests automatisch zerstört. Sofern du noch eine explizite Logik bei der Zerstörung wünschst, kannst du die __destruct()-Methode implementieren. Allerdings ist die Reihenfolge der Destruktion nicht deterministisch. Meiner Erfahrung nach sind Destruktoren auch nahezu unbenötigt. Zumindest ist mir noch kein Fall untergekommen, den ich damit lösen hätte können. Der Logger schreibt seine Inhalte innerhalb einer shutdown-Funktion auf die Platte, weil Destruktoren nicht zu jeder Zeit am wirklichen Ende der Request-Verarbeitung aufgerufen werden, sondern irgendwann in dieser Phase.
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: PHP allgemein - Funktionen in Klassen

Beitrag von dave » 06.03.2011, 23:19:10

Ah, Ok, na dann können wir das ja wieder vergessen ^^.

Also das Erstellen des zufälligen Strings mit einer neuen Klasse funktioniert schonmal wunderbar.

Mit dem Konstruktor-Wissen kann ich mich evtl. auch nochmal an mein PHPMailer-Problem wagen ... hab da schon wieder ne Idee, aber meine Zeit ist heute Abend schon wieder zu Ende ...

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste