brauche Webseite ideal für Vereine und Firmen
- Ad -
php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 

 


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!

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 01-04-2003, 02:14
krabo
 Newbie
Links : Onlinestatus : krabo ist offline
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 10
krabo ist zur Zeit noch ein unbeschriebenes Blatt
Question 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?
Mit Zitat antworten
  #2 (permalink)  
Alt 01-04-2003, 07:24
mrhappiness
 PHP Guru
Links : Onlinestatus : mrhappiness ist offline
Registriert seit: Oct 2002
Beiträge: 14.890
mrhappiness ist zur Zeit noch ein unbeschriebenes Blatt
mrhappiness eine Nachricht über AIM schicken mrhappiness eine Nachricht über Yahoo! schicken
Standard

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...
Mit Zitat antworten
  #3 (permalink)  
Alt 01-04-2003, 12:23
Troublegum
 PHP Senior
Links : Onlinestatus : Troublegum ist offline
Registriert seit: Dec 2001
Beiträge: 1.302
Troublegum ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
  #4 (permalink)  
Alt 01-04-2003, 12:47
krabo
 Newbie
Links : Onlinestatus : krabo ist offline
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 10
krabo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

@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
Mit Zitat antworten
  #5 (permalink)  
Alt 01-04-2003, 12:50
mrhappiness
 PHP Guru
Links : Onlinestatus : mrhappiness ist offline
Registriert seit: Oct 2002
Beiträge: 14.890
mrhappiness ist zur Zeit noch ein unbeschriebenes Blatt
mrhappiness eine Nachricht über AIM schicken mrhappiness eine Nachricht über Yahoo! schicken
Standard

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...
Mit Zitat antworten
  #6 (permalink)  
Alt 01-04-2003, 13:41
krabo
 Newbie
Links : Onlinestatus : krabo ist offline
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 10
krabo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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?
Mit Zitat antworten
  #7 (permalink)  
Alt 01-04-2003, 13:58
mrhappiness
 PHP Guru
Links : Onlinestatus : mrhappiness ist offline
Registriert seit: Oct 2002
Beiträge: 14.890
mrhappiness ist zur Zeit noch ein unbeschriebenes Blatt
mrhappiness eine Nachricht über AIM schicken mrhappiness eine Nachricht über Yahoo! schicken
Standard

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...
Mit Zitat antworten
  #8 (permalink)  
Alt 01-04-2003, 14:54
krabo
 Newbie
Links : Onlinestatus : krabo ist offline
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 10
krabo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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?
Mit Zitat antworten
  #9 (permalink)  
Alt 01-04-2003, 15:01
mrhappiness
 PHP Guru
Links : Onlinestatus : mrhappiness ist offline
Registriert seit: Oct 2002
Beiträge: 14.890
mrhappiness ist zur Zeit noch ein unbeschriebenes Blatt
mrhappiness eine Nachricht über AIM schicken mrhappiness eine Nachricht über Yahoo! schicken
Standard

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...
Mit Zitat antworten
  #10 (permalink)  
Alt 01-04-2003, 15:02
krabo
 Newbie
Links : Onlinestatus : krabo ist offline
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 10
krabo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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).
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

MariaDB 5.5 veröffentlicht
MariaDB 5.5 veröffentlichtDie freie MySQL-Alternative MariaDB wurde in der stabilen Version 5.5.23 veröffentlicht und soll einige Verbesserungen gegenüber Oracles Communityversion von MySQL mitbringen.

16.04.2012 | Berni

Deutsche Yii Framework Community
Deutsche Yii Framework CommunitySeit dem 19.03.2012 gibt es für die Yii PHP Framework Community ein deutsches Zuhause.

20.03.2012 | dhcomputer

 

Aktuelle PHP Scripte

EM 2012 Tipp-Spiel ansehen EM 2012 Tipp-Spiel

Online Tipp-Spiel zur Fussball Europameisterschaft 2012, basierend auf php-Script mit hinterlegter mySql-Datenbank

27.05.2012 tippimnetz | Kategorie: PHP/ Spiele
Advanced Login ansehen Advanced Login

Login-System und Kundenverwaltung, die sich spielend leicht in bestehende Webseiten einbauen lässt und einen enormen Funktionsumfang bietet. Ihre eigene Webseite muss mit Advanced Login nicht umständlich an ein fertiges System angepasst werden.

25.05.2012 Madden | Kategorie: PHP/ Kundenverwaltung
BROM CMS/BelCal 3 ansehen BROM CMS/BelCal 3

Spezielles CMS für Betreiber von Ferienwohnungen. Komplette Seitenerstellung online, Verwaltung mehrerer Objekte, Reservierungssystem mit sofortigem Abgleich im Belegungskalender und vieles mehr bietet dieses Content Management System.

25.05.2012 belcal2 | Kategorie: PHP/ CMS
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 10:32 Uhr.