php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 09.12.2011, 12:16  
Neuer Benutzer
 
Registriert seit: 09.12.2011
Beiträge: 4
PHP-Kenntnisse:
Fortgeschritten
Lazarus befindet sich auf einem aufstrebenden Ast
Standard Problm mit namespace und $this->var = new $this->classVar

Hallo!

Ich versuche funktionierende Klassen mit namespaces zu erweitern. Bei folgendem Problem komme ich nicht weiter:

Aus einer Klasse heraus werden weitere Klassen entsprechend übergebener Parameter geladen. Das Ganze sieht dann so aus:

PHP-Code:
    public function  __construct($wert0,$wert1,$wert2)
    {
        
$this->SetWert2($wert2);
        if(include_once(
$this->wert2.".class.php"))
        {
// Hier die Zeile, die die Probleme macht:
        
if(!$this->DbClass = new $this->Wert2($wert0,$wert1)) 
Wenn ich den inhalt von $this->Wert2 statt der Variablen an dieser Stelle Eintrage, funktioniert alles. Lasse ich mit vor der Zeile $this->Wert2 per print ausgeben, bekomme ich den erwarteten Inhalt der Variablen angezeigt.

Wen nich aber die Zeile mit $this->Wert2 ausführe bekomme ich die Fehlermeldung: "Fatal error: Class 'Wert2' not found in ..."

Ich habe schon geraume Zeit gegoogelt, aber keinen Hinweis gefunden - oder gefundene nicht erkannt.

Es wäre toll, wenn mir hier weitergeholfen würde.

Geändert von Lazarus (09.12.2011 um 13:04 Uhr).
Lazarus ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 09.12.2011, 12:37  
Erfahrener Benutzer
 
Registriert seit: 21.12.2009
Beiträge: 415
PHP-Kenntnisse:
Fortgeschritten
G.Schuster ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Es wäre hilfreich zu wissen, was genau in $this->Wert2 drinsteht und wie genau der Code inkl. Namespaces aussieht.
Für die Formattierung wären auch [php]-BBCodes recht nützlich.
__________________
actra.development - Schwabstr. 2 - 70825 Münchingen
www.actra.de/velopment/ - eMail: php.de@actra.de
Zend Certified Engineer for PHP5
G.Schuster ist offline   Mit Zitat antworten
Alt 09.12.2011, 13:21  
Neuer Benutzer
 
Registriert seit: 09.12.2011
Beiträge: 4
PHP-Kenntnisse:
Fortgeschritten
Lazarus befindet sich auf einem aufstrebenden Ast
Standard

Hallo G. Schuster,

in Wert2 steht der Name einer weiteren Klasse ('Foo' oder 'Bar').

Und hier der Code:
PHP-Code:
<?php
namespace cbtdkm
;
class 
Foobar
{
    private 
$arrListe = array("Foo","Bar");
    private 
$Class ='';
    private 
$Engine ='';

    public function  
__construct($wert0,$wert1,$wert2,$wert3)
    {
        
$this->SetEngine($wert2);
        if(include_once(
$this->Engine.".class.php"))
        {
// Hier die Zeile, die die Probleme macht:
            
if(!$this->Class = new $this->Engine($wert0,$wert1,$wert3))
            {
                print(
"Fehler!");
            }
        }
    }
    private function 
SetEngine($value)
    {
        
$value=ucfirst(strtolower($value));
        if(
in_array($value,$this->arrListe))
        {
            
$this->Engine $value;
        }
    }
?>

Geändert von Lazarus (09.12.2011 um 13:44 Uhr).
Lazarus ist offline   Mit Zitat antworten
Alt 09.12.2011, 13:28  
Erfahrener Benutzer
 
Registriert seit: 21.12.2009
Beiträge: 415
PHP-Kenntnisse:
Fortgeschritten
G.Schuster ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Dann solltest du den Namespace für Foo und Bar angeben.
Wenn es der Globale ist: \Foo bzw. \Bar, andernfalls eben \<namespace>\Foo bzw. \<namespace>\Bar

BTW, if(!$foo = new <...>()) ist unnütz, entweder der Constructor schmeißt eine Exception oder du hast ein Objekt, FALSE gibt es da nicht.
__________________
actra.development - Schwabstr. 2 - 70825 Münchingen
www.actra.de/velopment/ - eMail: php.de@actra.de
Zend Certified Engineer for PHP5

Geändert von G.Schuster (09.12.2011 um 13:39 Uhr).
G.Schuster ist offline   Mit Zitat antworten
Alt 09.12.2011, 13:44  
Neuer Benutzer
 
Registriert seit: 09.12.2011
Beiträge: 4
PHP-Kenntnisse:
Fortgeschritten
Lazarus befindet sich auf einem aufstrebenden Ast
Standard

Die Klassen Foobar.class.php, Foo.class.php und Bar.class.php liegen alle im selben Namespace cbt\dkm.

So wie ich ich die Doku für die namepcases verstanden habe, und wie es beim include_once auch funktioniert, wird das auch atomatisch so aufgelöst. Wo sollte ich also den namespace noch angeben?
Lazarus ist offline   Mit Zitat antworten
Alt 09.12.2011, 13:46  
Erfahrener Benutzer
 
Registriert seit: 21.12.2009
Beiträge: 415
PHP-Kenntnisse:
Fortgeschritten
G.Schuster ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von Lazarus Beitrag anzeigen
Namespace cbt\dkm
!=
Zitat:
PHP-Code:
namespace cbtdkm
Ausprobieren würde ich mal
PHP-Code:
$class '\\cbt\dkm\\'.$this->Engine;
$this->Class = new $class($wert0,$wert1,$wert3); 
__________________
actra.development - Schwabstr. 2 - 70825 Münchingen
www.actra.de/velopment/ - eMail: php.de@actra.de
Zend Certified Engineer for PHP5
G.Schuster ist offline   Mit Zitat antworten
Alt 09.12.2011, 13:49  
Neuer Benutzer
 
Registriert seit: 09.12.2011
Beiträge: 4
PHP-Kenntnisse:
Fortgeschritten
Lazarus befindet sich auf einem aufstrebenden Ast
Standard

Der '\' wird von der Foren-Software gefressen. Die lassen wohl keine escapes zu. Im Original ist der drin.
Lazarus ist offline   Mit Zitat antworten
Antwort


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


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:45 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