php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 10.02.2007, 16:01  
Benutzer
 
Registriert seit: 03.08.2006
Beiträge: 49
Riks
Standard Call to a member function on a non-object

Hallo!

Gibt ja schon viele themen über dieses Thema aber bisher hat mich noch keins weitergeholfen. Mal kurz die situation.

Ich habe eine globale klasse die alle wichtigen unter klassen beinhaltet

PHP-Code:
class GlobalClass {
    protected static 
$database;
    protected static 
$template;

    public function 
__construct() {
        
$this->loadDatabase();
        
$this->loadTemplateEngine();
    }

    public static function 
getDatabase() {
        return 
self::$database;
    }

    public static function 
getTemplate() {
        return 
self::$template;
    }

    protected function 
loadDatabase() {
        
self::$database = new Database();
    }

    protected function 
loadTemplateEngine() {
        
self::$template = new TemplateEngine();
    }

so in einer anderen Klasse ruf gehts so:

PHP-Code:
class ClientList {
     public function 
__construct() {
          
GlobalClass::getDatabase()->send_query("SELECT * FROM clients");
          
GlobalClass::getTemplate()->fetch('client_list.tpl');   
     }

während send_query problemlos ausgeführt wird, gibt er bei Template Call to a member function fetch() on a non-object aus. Bevor ich hier den Code von der Database klasse und Template klasse post (die von der definition genau gleich sind, also send_query und fetch sind beides public function ....(); ), weiß jemand woran der fehler allgemein liegen könnte?

Riks
Riks ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 10.02.2007, 16:08  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

"GlobalClass::getTemplate()" gibt kein Objekt zurück.
Zergling-new ist offline  
Alt 10.02.2007, 16:20  
Benutzer
 
Registriert seit: 03.08.2006
Beiträge: 49
Riks
Standard

meinst du damit das new TemplateEngine(); nicht funktioniert? weil die kommplete methode so lautet:

PHP-Code:
    protected function loadTemplateEngine() {
        
self::$template = new TemplateEngine();
        
self::$template->set_prefilter(array('lang','constant'));
    } 
und set_prefilter funktioniert ohne probleme. sry, wenn ich dich falsch verstanden hab
Riks ist offline  
Alt 10.02.2007, 16:49  
Benutzer
 
Registriert seit: 03.08.2006
Beiträge: 49
Riks
Standard

oh man, das ist mir jetzt extrem peinlich, aber das problem hat sich geklärt, hattest natürlich recht zergling. class ClientList wurde vor loadTemplateEngine geladen . Tut mir leid, aber ohne deine anmerkung wär ich wohl nich drauf gekommen.
Riks ist offline  
Alt 10.02.2007, 16:58  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Übrigens entspricht dein Design nicht ganz dem OO-Gedanken.
Es ist zwar praktisch, von einer Global-Klasse zu erben, aber eine Datenbankverbindung ist ja keine Oberklasse von zB Template. Dass die Template-Klasse (oder welche auch immer) eine DB-Verbindung benötigt, ist kein Argument.

Übergib deinen Klassen lieber eine DB-Instanz als Refernz an den Konstruktor und arbeite darüber. Dann bleiben deine Klassen auch vielseitig verwendbar.

So sind deine Klassen ja ausschließlich funktionsfähig, wenn sie in einer so komischen GlobalClass-Umgebung laufen.
Zergling-new ist offline  
Alt 10.02.2007, 17:03  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

> Übergib deinen Klassen lieber eine DB-Instanz als Refernz an den Konstruktor
> und arbeite darüber. Dann bleiben deine Klassen auch vielseitig verwendbar.
Oder instanziiere innerhalb des Konstruktors deiner Klasse die DB-Klasse (=DB-Abstraktions-Schicht). Sinnvollerweise macht man das mit dem Singleton-Pattern, weil du damit nur die Referenz auf deine DB-Klassen-Instanz bekommst und ggf. bereits initialisierte Werte dieser weiter nutzen kannst.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 10.02.2007, 17:06  
Benutzer
 
Registriert seit: 03.08.2006
Beiträge: 49
Riks
Standard

Mh, ich hab deswegen alle wichtigen klassen in einer großen klasse zusammen gefasst um sie gemeinsam zu starten und damit den überblick zu behalten. Die GlobalClass Klasse benutze ich für jede größere Seite, womit ich sicherstell, das ich mir nicht immer neu darüber gedanken muss (auch wenn das jetzt hier ein beispiel dafür ist, das das ganze noch nicht ausgereift ist).
Ist das denn Performancemäßig von Nachteil?
Riks ist offline  
Alt 10.02.2007, 17:08  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Nö, ist halt nur OO zweckentfremdet.
Zergling-new ist offline  
Alt 10.02.2007, 17:11  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Riks,

das ist für die Performance als auch für das Design schlecht. Der PHP-Parser muss jedesmal _alles_parsen, auch das, was du evtl. nicht brauchst. Zweitens ist das kein OO-Stil, alles in einen Sack zu stecken. Klingt für mich wie eine doAll()-Funktion. Drittens machst du deine Funktionen damit nicht wiederverwendbar oder gar generisch, weil sie immer im Kontext deiner Applikation laufen.

Besser bist du bedient, wenn du einzelne Funktionen sauber in _einzelne_ Klassen kapselst und diese in unterschiedliche Ordner (=Namespaces) packst. Damit hast du eine wesentlich höhere Übersichtlichkeit. Ich beispielsweise habe Core-Klassen in einem "core"-Ordner unterteilt. Hier findest du Namespaces wie "pagecontroller", "configurartion", "database", ... in denen die jeweiligen Klassen liegen. Wenn ich in einem Controller diese Funktionalitäten nutzen möchte, so importiere ich mir diese einfach per import()-Funktion.

Wie gesagt: Skizziere mir deinen Anwendungsfall und ich sag dir wie du es designen solltest.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 10.02.2007, 17:37  
Benutzer
 
Registriert seit: 03.08.2006
Beiträge: 49
Riks
Standard

Ich hab bereits alle Klassen in eigene Dateien und diese befinden sich auch in passenden Ordnern. in der GlobalClass werden folgende Klassen geladen:
Database, Cache, Template Engine, NaviChain, Session, Language
und diese werden vorher mit

require_once(GLOBAL_DIR.'lib/core/Database.class.php');
...

geladen

und jede dieser klassen benötige ich auf jeden meiner einzelseiten. Ich will nicht unbelehrbar wirken, aber ich versteh trotzdem nicht was dagegen spricht.
Riks ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Call to a member function ... on a non-object funnx PHP Tipps 2008 6 29.07.2008 18:08
Fatal error: Call to a member function on a non-object tweek PHP Tipps 2008 13 25.06.2008 12:56
Fatal error: Call to a member function on a non-object atom-dragon PHP Tipps 2007 20 02.12.2007 22:22
Fatal error: Call to undefined function mail() PHP Tipps 2005-2 16 04.07.2005 13:24
Problem Call to a member function on a non-object PHP Tipps 2005 5 24.05.2005 19:14
Call to a member function on a non-object PHP Tipps 2005 12 24.05.2005 04:06
Fatal error: Call to a member function on a non-object PHP Tipps 2005 7 13.04.2005 07:24
update auf php 5.0.4 robo47 Server, Hosting und Workstations 6 10.04.2005 19:00
Fatal error: Call to a member function on a non-object PHP Tipps 2005 15 04.02.2005 13:02
Fatal error: Call to undefined function: imagecreatefromjpeg DannyD PHP-Fortgeschrittene 10 05.12.2004 21:59
Call to a member function on a non-object --> WARUM ? PHP Tipps 2004-2 4 25.11.2004 20:16
call to undefined function mail() <- funktionierte bis ge Promaetheus PHP Tipps 2004 9 07.10.2004 11:39
[Erledigt] Call to undefined function highlight() PHP Tipps 2004 1 07.09.2004 09:31
[Erledigt] Call to undefined function mysql_connect() Datenbanken 4 24.08.2004 22:04
[Erledigt] Fatal error: Call to undefined function:... PHP Tipps 2004 8 27.06.2004 12:56

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
call to a member function fetchrow() on a non-object, fatal error: call to a member function load() on a non-object in, call to a member function load() on a non-object, call to a member function gettemplate() on a non-object, fatal error: call to a member function fetchrow() on a non-object in, call to a member function gettemplate() on a non-object in, call to a member function fetchrow() on a non-object in, call to a member function load() on a non-object in, call to a member function on a non-object, fatal error: call to a member function gettemplate() on a non-object in, fatal error: call to a member function load() on a non-object, call to a member function fetch_row() on a non-object, fatal error: call to a member function fetch_row() on a non-object, fatal error: call to a member function fetchrow() on a non-object, fatal error: call to a member function loadbyoption() on a non-object in, fatal error: call to a member function fetch() on a non-object, joomla call to a member function load() on a non-object, php fatal error: call to a member function gettemplate() on a non-object, fatal error: call to a member function fetch() on a non-object in, fatal error: call to a member function gettemplate() on a non-object

Alle Zeitangaben in WEZ +1. Es ist jetzt 12:09 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.