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! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
  #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: 359
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: 359
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.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Globaler Scope <-> Funktionsscope!
Siehe Manual!
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: 359
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: 359
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: 359
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: 359
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: 359
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 offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
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: 359
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 offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
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

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 13:38 Uhr.