- 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 21-01-2008, 12:37
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 290
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Question [OOP] Objekte werden nicht erkannt?

Ich bins mal wieder.

Hab schon ein bisschen das Board und php.net durchforstet, und vielleicht hab ich die Lösung bereits gelesen und habe sie nur nicht verstanden... daher schreib ich doch mal lieber einen Thread ^^

Ich habe für mein Projekt diverse Libraries erstellt, die alle Klassen entahlten, mit denen ich später arbeiten will.
Jetzt bin ich soweit, dass ich endlich die Templates mit einbinden will. Dazu habe ich eine eigene Templateklasse erstellt (mit SMARTY-Erweiterung)
Und da ich ein fauler Programmierer bin :P lade ich die Libraries mit einer statischen Methode Libraries::load(string $libraries).
Damit ich die geladenen Klassen nicht in jedem Skript manuell instanzieren muss, dachte ich mir, es wäre ganz praktisch, das gleich beim Laden zu erledigen.
Daher habe ich die Funktion updateInstances(string $library) erstellt.
Diese sieht so aus:

PHP-Code:
/**
 * Autoinstancing of libraries
 * 
 * Creating instances of standard-libraries and supress errormessages if
 * they are not yet loaded. [Libraries] and [ErrorHandler] do not need to be instanced, all functions
 * are internal or static. [MySQL] must not be instanced, as it is a required class for DataBase and therefore
 * already instanced.
 * Only libraries included in [classObjects.txt] are loaded.
 * 
 * @return void
 */
function updateInstances($library)
{
    switch (
$library) {
        case 
'Templates':
            
$tpl = new Templates;
            break;
        
        case 
'Pages':
            
$page = new Pages;
            break;
    }

Will ich nun jedoch in der index.php z.B. $tpl->load(string $template) ausführe, erhalte ich die Fehlermeldung, dass $tpl kein Objekt sei.

Das versteh ich allerdings nicht so ganz, denn es wird ja eindeutig erstellt. Habe sogar mit diversen Prüfungen den kompletten Verlauf aller require_once() etc. auflisten können:

Code:
Level 2 required library: lib.Libraries.php
Level 3 required library: lib.ErrorHandler.php
Level 2 required library: lib.Config.php
Level 3 optional library: lib.Pages.php
[$library] = Pages
Class [Pages] instanced
Level 3 optional library: lib.Templates.php
[$library] = Templates
Class [Templates] instanced

Fatal error: Call to a member function loadStyle() on a non-object in /draco/page.home.php on line 16
Daher verstehe ich nicht ganz, wieso er mir diese Fehlermeldung bringt
Mit Zitat antworten
  #2 (permalink)  
Alt 21-01-2008, 12:50
Bugbuster
 PHP Junior
Links : Onlinestatus : Bugbuster ist offline
Registriert seit: Mar 2003
Ort: Hamm
Beiträge: 658
Bugbuster ist zur Zeit noch ein unbeschriebenes Blatt
Standard

vorher das Objekt initalisiert?

PHP-Code:
$tpl = new Bla_Klasse(); 
__________________
tutorial: peterkropff.de schattenbaum.de tut.php-quake.net
documentation: php.net mysql.com framework.zend.com

Die Nachtwache!
Mit Zitat antworten
  #3 (permalink)  
Alt 21-01-2008, 13:12
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 290
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard

Na das wird doch in der updateInstances()-Funktion erledigt?
Mit Zitat antworten
  #4 (permalink)  
Alt 21-01-2008, 13:27
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.104
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Globaler Scope <-> Funktionsscope!
Siehe Manual!
__________________
iocstreamscanvas
Mit Zitat antworten
  #5 (permalink)  
Alt 21-01-2008, 13:49
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 290
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard

Verstehe ich das richtig, dass das was ich vorhabe also garnicht möglich ist?

Ich habe mal versucht, global oder $GLOBALS[''] auf die Objekte anzuwenden, hat aber auch zu keinem anderen Ergebnis geführt...
Mit Zitat antworten
  #6 (permalink)  
Alt 21-01-2008, 14:13
Bugbuster
 PHP Junior
Links : Onlinestatus : Bugbuster ist offline
Registriert seit: Mar 2003
Ort: Hamm
Beiträge: 658
Bugbuster ist zur Zeit noch ein unbeschriebenes Blatt
Standard

oh sorry hab ich total übersehen liegt wohl an der nachtschicht, dass ich so früh am morgen noch zu nix zu gebrauchen bin.

wie desaster es schon schrieb. gültigkeitsbereiche von variablen.
__________________
tutorial: peterkropff.de schattenbaum.de tut.php-quake.net
documentation: php.net mysql.com framework.zend.com

Die Nachtwache!
Mit Zitat antworten
  #7 (permalink)  
Alt 21-01-2008, 16:23
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 290
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard

Und kann ich das problem mit

global $tpl;

oder

$GLOBALS['tpl'];

lösen?

Laut der Fehlermeldung eben nicht... aber da musses doch ne Möglichkeit geben
Mit Zitat antworten
  #8 (permalink)  
Alt 21-01-2008, 16:26
krel
 Registrierter Benutzer
Links : Onlinestatus : krel ist offline
Registriert seit: Nov 2006
Ort: Osnabrück
Beiträge: 424
krel ist zur Zeit noch ein unbeschriebenes Blatt
Standard

wenn das doch ein Objekt in deiner Klasse ist und du diese mit
PHP-Code:
var $tpl
deklariert hast kannst doch mittels
PHP-Code:
$this -> tpl = new bla(); 
machen
Mit Zitat antworten
  #9 (permalink)  
Alt 21-01-2008, 17:19
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 290
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard

Jo ich will $tpl->machwas(); aber nicht in der datei benutzen, in der ich $tpl = new Templates; deklariert habe...

Sondern eben in einer anderen, und das geht ja anscheinend wegen dieser zu geringen Gültigkeit...

Also such ich nach ner Möglichkeit, das in der anderen Datei auch zu benutzen^^
Mit Zitat antworten
  #10 (permalink)  
Alt 21-01-2008, 17:22
krel
 Registrierter Benutzer
Links : Onlinestatus : krel ist offline
Registriert seit: Nov 2006
Ort: Osnabrück
Beiträge: 424
krel ist zur Zeit noch ein unbeschriebenes Blatt
Standard

in welcher Datei ist den $tpl zu finden und in welcher findet der aufruf statt und wie sind die beiden Dateien miteinander verknüpft?
Mit Zitat antworten
  #11 (permalink)  
Alt 21-01-2008, 18:38
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 290
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard

Also.

Server startet natürlich mit der /index.php.
Darin wird dann /lib/lib.Config.php eingebunden.
Dort wird /lib/lib.Libaries.php eingebunden. Darin wird auch updateInstances() definiert.

Wieder in der /index.php wird nun /page.home.php eingebunden. Darin soll dann $tpl->loadStyle() ausgeführt werden.
Mit Zitat antworten
  #12 (permalink)  
Alt 22-01-2008, 14:30
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 290
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard

Dabei kommt mir noch eine Idee gekommen. Gibts ne Möglichkeit, einer Klasse automatisch nen Objekt zu geben, sobald sie geladen wird?

Also irgendwas im Sinne von

PHP-Code:
class Klasse
{
 function 
__automatische-instanz-funktion($objektname)
 {
  
$objektname = new Klasse;
 }

Und zwar so, dass $objektname global benutzt werden kann als $objektname->machwas();?

Oder ist das alles Wunschdenken?^^
Mit Zitat antworten
  #13 (permalink)  
Alt 22-01-2008, 14:50
combie
 PHP Expert
Links : Onlinestatus : combie ist gerade online
Registriert seit: May 2006
Beiträge: 2.925
combie befindet sich auf einem aufstrebenden Ast
Standard

Du suchst scheinbar das Singleton oder auch das Registry Design Pattern.
Wikipedia gibt Auskunft!
__________________
Wir werden alle sterben
Mit Zitat antworten
  #14 (permalink)  
Alt 22-01-2008, 14:55
Benutzerbild von ApoY2k ApoY2k
 Registrierter Benutzer
Links : Onlinestatus : ApoY2k ist offline
Registriert seit: Nov 2006
Beiträge: 290
ApoY2k befindet sich auf einem aufstrebenden Ast
ApoY2k eine Nachricht über ICQ schicken ApoY2k eine Nachricht über Skype™ schicken
Standard

Hmmm also bei singleton hab ich das so verstanden, dass ich trotzdem einmal etwas ähnliches wie

$obj = Class::method();

ausführen muss, damit ich dann

$obj->method2();

benutzen kann.

Was ich suche, ist ja eine Möglichkeit, in der Datei wo ich es brauche direkt mit

$obj->method2();

zu starten, ohne in dieser Datei nochmal $obj näher zu definieren. Das soll am besten gleich beim Laden der Klasse passieren...
Mit Zitat antworten
  #15 (permalink)  
Alt 22-01-2008, 15:10
combie
 PHP Expert
Links : Onlinestatus : combie ist gerade online
Registriert seit: May 2006
Beiträge: 2.925
combie befindet sich auf einem aufstrebenden Ast
Standard

Dann mußt du wieder eine Variable im globalen Namensraum setzen!
Das wiederspricht der "Reinen OOP Lehre"!!

Aber was hindert dich eine Regeistry zu nutzen?
PHP-Code:
// irgendwo in der Config.php o.ä.
Registry::add(new klassenname($parameter));



//Später irgendwo öfter im Script:
Registry::dowith('klassenname')->methode_tuwas('daten');

// mit PHP >= 5.3 wird auch folgendes möglich sein 
// ungetestet (weil zu faul)
Registry::klassenname->methode_tuwas('daten');
// wegen der Einführung statischer __get usw. 
__________________
Wir werden alle sterben
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 11:02 Uhr.