| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

01-04-2003, 02:14
|
|
krabo
Newbie
|
|
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 10
|
|
OO: Verstrikte Vererbung
Hallo!
Ich arbeite mit einem XML basierten CMS, welches objektorientiertes PHP verwendet. Man stelle sich vor die Klasse "kontakt" wird aufgerufen, wobei kontakt eine Subclass von der Klasse Extension ist. Die Klasse Extension stellt einige andere Klassen zur Verfügung, wie z.B. db, functions usw. welche gleichzeitig Subclasses von Extension sind. Leider kommen in einer bestimmten Konstellation meine anderen Objekte in der Klasse Functions nicht an.
Es wird kontaktformular aufgerufen, Extension erstellt das Objekt db und functions:
PHP-Code:
include_once $this->scriptroot.'/db.php';
$this->db = new db($settings->SqlHost,$settings->SqlUser,$settings->SqlPassword,$settings->SqlDb);
include_once $this->scriptroot.'/functions.php';
$this->functions = new Functions($this->includeroot);
das Objekt kontaktformular greift auf eine Funktion der functions zu ($this->functions->verify() ), und in dieser Funktion wird aber auf die Klasse db zugegriffen und das funktioniert nicht.
In der functions steht in einer Funktion folgendes,
PHP-Code:
$row=$this->db->fetch_array($result)
und das gibt den Fehler "Fatal error: Call to a member function on a non-object in "
Ich verstehe leider nicht, wieso das nicht klappt. Kann mir das jemand erklären, oder ist es für euch auch unerklärlich?
|

01-04-2003, 07:24
|
|
mrhappiness
PHP Guru
|
|
Registriert seit: Oct 2002
Beiträge: 14.890
|
|
du erzeugst in der klasse kontakt eine variable, die ein db Objekt beinhaltet
du erzeugst in der klasse konakt eine variable, die ein functions Objekt beinhaltet
wenn du in der klasse functions $this verwendest, bezieht sich das auf die instanz der klasse functions und nicht auf die instanz der klassen, deren variable ein functions objekt ist
Code:
kontakt
/ \
| |
functions db
|
|
db?
du willst auf das rote db Objekt zugreifen, dass du aber nicht erzeugt hast
__________________
Ich denke, also bin ich. - Einige sind trotzdem...
|

01-04-2003, 12:23
|
|
Troublegum
PHP Senior
|
|
Registriert seit: Dec 2001
Beiträge: 1.302
|
|
probiers mal mit folgendem:
PHP-Code:
$row=parent::db::fetch_array($result);
__________________
"Los, lass uns loslegen! Hm ? Quatschen können wir hinterher immer noch!"
"Aber Bommel, wir können jetzt nicht bumsen. Wir müssen doch erst den Kindern - ... "
"Ja ja ja. Du willst immer nur das Eine. Buchstabenzeigen, Buchstabenzeigen - meine Gefühle sind dir wohl scheißegal."
© Harald Schmidt
|

01-04-2003, 12:47
|
|
krabo
Newbie
|
|
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 10
|
|
@mrhappiness
Wie kann ich denn auf das andere db zugreifen?
Code:
kontakt
/ \
| |
functions *db*
@Troublegum
PHP-Code:
return parent::db::query("SELECT *FROM table");
geht leider nicht(return parent::einfacheFunktion() geht aber). Fehler:
Parse error: parse error, unexpected T_PAAMAYIM_NEKUDOTAYIM
Habe gelesen man müsste call_user_func() verwenden, wenn dieser Fehler kommt:
PHP-Code:
call_user_func(array($class, 'function'), $param1)
Aber wie muss ich das verwenden, wenn ich das mit parent mache
PHP-Code:
call_user_func(array(parent::db, 'query'), "SELECT subject FROM contactsubjects")
geht nicht.
thx
|

01-04-2003, 12:50
|
|
mrhappiness
PHP Guru
|
|
Registriert seit: Oct 2002
Beiträge: 14.890
|
|
das parent bezieht sich doch nur auf die basisklasse und da du die klasse functions nich von kontak abgelitet hast seh ich da schwarz
du könntest höchstens ne refrenz an die functions übergeben
PHP-Code:
$this->functions = new Functions($this->includeroot,&$this->db);
oder ne kopie
PHP-Code:
$this->functions = new Functions($this->includeroot,$this->db);
__________________
Ich denke, also bin ich. - Einige sind trotzdem...
|

01-04-2003, 13:41
|
|
krabo
Newbie
|
|
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 10
|
|
Danke! So gehts.
Extension.php:
PHP-Code:
$this->functions = new Functions(&$this->db);
Functions.php:
PHP-Code:
function Functions($extensions) {
$this->extension = &$extensions;
}
$result = $this->extension->db->query("SELECT * FROM table");
Ich wundere mich trotzdem wieso man nicht direkt auf db zugreifen kann. Ist das nicht ein struktureller Mangel in der OO Unterstützung von PHP? Wie sieht es denn in anderen Sprachen damit aus?
|

01-04-2003, 13:58
|
|
mrhappiness
PHP Guru
|
|
Registriert seit: Oct 2002
Beiträge: 14.890
|
|
is kein mangel, du siehst halt nur das, was du vorher (mehr oder weniger) statisch deklarierst.
was du bräuchtest wäre ein owner::db und sowas gibts afaik nirgendwo
__________________
Ich denke, also bin ich. - Einige sind trotzdem...
|

01-04-2003, 14:54
|
|
krabo
Newbie
|
|
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 10
|
|
Okay. Jetzt hab ich das Problem mit der mehrfachen Verwendung der Klasse.
1. Fall:
Aus einer übergeordneten Klasse "page", wird die functions aufgerufen und dann soll die Funktion getCode ausgeführt werden. Standardmäßig soll dazu der Konstruktur von der Oberklasse Extension benutzt werden(normal hat functions keinen eigenen).
new Functions(..)
getCode(..)
2. Fall
So wie am Anfang des threads beschrieben: Ein anderes Objekt wird wie im 1. Fall erstellt, welches über den vererbten Konstruktor Zugriff auf die functions bekommen soll.
Ich hatte der functions einen eigenen Konstruktor spendiert, damit ich die Funktionen von Extension nutzen kann. Wenn jetzt der 1. Fall auftritt, nimmt mein System nicht den Konstruktor von Extension sondern auch den eigenen. Dadurch fehlen natürlich z.B. die db Anbindung.
1. Lösungsansatz
Könnte man vom Aufruf abhängig machen, wann welcher Konstruktor benutzt wird?
2. Lösungsansatz
Kann ich innerhalb des eigenen Konstruktors, den von Extension aufrufen um $this zu überschreiben?
|

01-04-2003, 15:01
|
|
mrhappiness
PHP Guru
|
|
Registriert seit: Oct 2002
Beiträge: 14.890
|
|
warum solltest du nicht den konstruktor der basisklasse indeinem konstruktor einfach aufrufen können?
musst halt nur schauen, ob du den basiskonstruktor vor oder nach dem für deine klasse speziellen zeug aufrufst
__________________
Ich denke, also bin ich. - Einige sind trotzdem...
|

01-04-2003, 15:02
|
|
krabo
Newbie
|
|
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 10
|
|
Ich hab jetzt ne Lösung(*selbststolzsei*):
Ich habe die Teile des Extension Konstruktors, welche ich benötige in eine eigene Funktion ausgelagert, welche den Rückgabewert $this hat. Dann steht in functions folgendes:
PHP-Code:
function Functions($extensions) {
#Referenz auf alle Funktionen von Extension
$this->extension = &$extensions;
}
function getCode($paramList) {
#Konstruktor Workaround
$this->extension = parent::construct();
#gewünschte Funktion aufrufen
return $this->$paramList['function']($paramList);
}
Ich hoffe, es hat sich gelohnt auf OO umzusteigen, bis jetzt schwanke ich zwischen Begeisterung(wegen der realitätsnähe) und Zweifel(komplexe Struktur).
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|