kostenloser Webspace werbefrei: lima-city


PHP Klassen Problem

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    d**********r

    Hi,

    Ich habe folgendes Problem, welches ich schon seit Stunden versuche zu beseitigen:

    Ich habe die Klasse MAIN in der Datei main.class.php
    und die Klasse USER in user.class.php, wobei USER die child-class von MAIN ist.
    Methoden werden vererbt. Bei den Attributen gibt es allerdings Probleme: Sie werden zwar vererbt, allerdings ohne Inhalt.
    MAIN-Klasse (Anfang) :

    <?php
    class MAIN extends MYSQL {
    	public static $dateTime = array();
    	public static $dbConfig;
    	
    	function controlMain() {
    		$this->loadConfigFromMySQLDatabase();
    		$this->setDefines();
    		$this->makeCurrentDateAndTimeStrings();
    	}
    	
    	public function loadConfigFromMySQLDatabase() {
    		$this->dbConfig = parent::mysqlQuery('SELECT * FROM config', 'mysqlFetchArray');
    		if (empty($this->dbConfig)) {
    			header('LOCATION:../error.php?error=no_db_config');
    		}
    	}
    	
    
    ?>

    USER-Klasse (anfang):
    <?php
    class USER extends MAIN {
    	public static $countVisiter = false, $userCountryOfOrigin, $userLanguage2, $userReferer, $userResolution, $userPixelDepth;
    	public static $userPlugins, $userAgent, $userOS, $userBrowser, $userBrowserVersion, $userRobot, $userRobotVersion, $userSiteNow;
    	public static $userSiteNowName, $userIP, $userHost, $userID, $userGroupID, $userGroupName, $userLogInName, $userPassword, $autoLoginID, $autoLoginTime;
    	public static $userLastLoginTime, $userFirstName, $userFamilyName, $userStreet, $userHouseNumber, $userCity, $userZIP, $userCountry;
    	public static $userState, $userBirthdayDay, $userBirthdayMonth, $userBirthdayYear, $userLanguage = 'de', $userAvatar, $userSignature;	
    	public static $userStandardDateFormat, $userStandardTimeFormat;
    	
    		function controlUser() {
    			print_r(parent::$dbConfig);
    			$this->checkLastVisit();
    			$this->collectUserInforamtion();
    			$this->checkUserStatus();
    			$this->makeCurrentDateAndTimeStrings();
    		}
    
    ?>

    Die Zeile print_r(parent::$dbConfig); in USER liefert beispielsweise keine Ergebnisse, w?hrend ein Methodenaufruf Ergebnisse liefert. An was liegt das?
    Danke
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Mhh, ich habe zwar nicht so genau verstanden, wo dein Problem liegt, aber vllt hilft folgendes :
    Die Klasse musst du initialisieren, damit du Attribute benutzten kannst.
    Also
    $class = class ();
    $class -> attribut = $class -> function ();


    MfG Lucas
  4. Autor dieses Themas

    d**********r

    Nochmals:
    Die Klasse USER erbt die Atribute und Methoden (sofern public) von der Klasse MAIN. Das Problem bestht nun darin, dass ich in der Klasse USER Methoden der Elternklasse MAIN aufrufen kann, die dann auch funktionieren, Attribute allerdings nicht! Das hei?t, das Attribut wird zwar deklariert, da PHP in der Klasse USER keinen Fehler ausgibt, es hat allerdings auch keinen Inhalt.
  5. Autor dieses Themas

    d**********r



    Mhh, ich habe zwar nicht so genau verstanden, wo dein Problem liegt, aber vllt hilft folgendes :
    Die Klasse musst du initialisieren, damit du Attribute benutzten kannst.
    Also
    $class = class ();
    $class -> attribut = $class -> function ();


    MfG Lucas


    Mag sein, aber bei statischen Attributen ist das nicht notwendig.

    @danielkuhner:
    Beim Aufruf der statischen Attribute aus der Elternklasse muss "parent::" nicht mit angegeben werden.

    Probiere es mal mit "print_r(USER::$dbConfig)".


    ?dit:
    Ack... Hm. Das Attribut wird ja in einer Methode der abgeleiteten Klasse ben?tigt... Ist das Attribut denn ?berhaupt initialisiert, hat es einen Wert?!

    GrEetz, Olliander

    Beitrag ge?ndert am 27.08.2006 16:54 von olliander


    Olliander war schneller...
    @Olliander: Ne MAIN::... bringt ebenflass nichts. Das komische ist halt, dass das Attribut vererbt wird, nur st?ndig ohne Inhalt.
  6. o*******r


    Nochmals:
    Die Klasse USER erbt die Atribute und Methoden (sofern public) von der Klasse MAIN. Das Problem bestht nun darin, dass ich in der Klasse USER Methoden der Elternklasse MAIN aufrufen kann, die dann auch funktionieren, Attribute allerdings nicht! Das hei?t, das Attribut wird zwar deklariert, da PHP in der Klasse USER keinen Fehler ausgibt, es hat allerdings auch keinen Inhalt.


    Ja, ich habe mich eben verlesen. Arg verlesen...

    Ich habe mal testweise eine ?hnliche Situation konstruiert...

    class test {
    public static $test = 'Test';
    }
    
    class test2 extends test  {
      function ausgabe()  {
      print_r(parent::$test);
      }
    }
    
    $test2 = new test2();
    $test2->ausgabe();


    Bei mir funktioniert das Ganze.
    Ordnest Du den Attributen eigentlich Werte zu?

    GrEetz, Olliander

    Beitrag ge?ndert am 27.08.2006 17:08 von olliander
  7. Autor dieses Themas

    d**********r

    Ja Werte werden zugeordnet. Wenn ich in der Klass MAIN mittles $this->dbConfig das Array ausgeben lasse, wird es auch ausgegeben. Das wirklich komische ist nur, dass die Konfigurationsdaten nicht vererbt werden (nebenbei: die von $dateTime auch nicht). Baue ich allerdings ein kleines Testscript (so ?hnlich wie deines Olliander) funktionierts)
  8. Ich glaube, dass es ein logisches Problem ist.
    Die Klasse USER erbt alles von der Klasse MAIN, dass heisst aber nicht, dass sich die Werte der Atrribute von USER ?ndern, wenn du die Werte der Attribute von MAIN ?nderst(w?hrend der Laufzeit des Scriptes).

    Also mein Vorschlag, kopier deine Klasse und schmeiss alles raus, was nicht notwendig ist und poste dann nochmal den Code, denn ich habe keine Lust 60 Zeilen Code durchzugehen und nachzuvollziehen(siehe Avatar *gg).



    [...]
    Mag sein, aber bei statischen Attributen ist das nicht notwendig.
    [...]

    Dann m?ssen die Attribute aber bereits im Kopfteil initialisiert werden. Des weiteren kann man deren Werte nicht ver?ndern.

    Beitrag ge?ndert am 27.08.2006 17:20 von lucas9991
  9. o*******r


    Ja Werte werden zugeordnet. Wenn ich in der Klass MAIN mittles $this->dbConfig das Array ausgeben lasse, wird es auch ausgegeben. Das wirklich komische ist nur, dass die Konfigurationsdaten nicht vererbt werden (nebenbei: die von $dateTime auch nicht). Baue ich allerdings ein kleines Testscript (so ?hnlich wie deines Olliander) funktionierts)


    Eben habe ich nochmal Deine Codeschnipsel ?berflogen, und da fiel es mir wie Schuppen von den Augen... ^^

    Ein statisches Attribut besitzt keinen Objektkontext.

    public static $dbConfig;
    
    [...]
    
    $this->dbConfig = parent::mysqlQuery('SELECT * FROM config', 'mysqlFetchArray');


    Das kann also faktisch nicht funktionieren, der $this->Zeiger ist wirkungslos. Wie lucas9991 schon anmerkte... Statische Attribute sind ja sch?n und gut, aber sie haben einen bestimmten Zweck. F?r das, was Du erreichen willst, reichen normale Attribute v?llig aus. :wink:

    GrEetz, Olliander

    Beitrag ge?ndert am 27.08.2006 17:23 von olliander
  10. Autor dieses Themas

    d**********r

    Oh... verdammt stimmt^^ Da sitzt man stundenlang da und sucht nach dem Fehler... Danke
    Allerdings verstehe ich dann doch nicht, weshalb man die Attribute innerhalb der klass MAIN mit $this aufrufen kann (inkl. Inhalt)
    Gru?
    Daniel

    Beitrag ge?ndert am 27.08.2006 17:25 von danielkuhner
  11. o*******r


    Oh... verdammt stimmt^^ Da sitzt man stundenlang da und sucht nach dem Fehler... Danke
    Allerdings verstehe ich dann doch nicht, weshalb man die Attribute innerhalb der klass MAIN mit $this aufrufen kann (inkl. Inhalt)
    Gru?
    Daniel

    Beitrag ge?ndert am 27.08.2006 17:25 von danielkuhner


    Kann man das? W?re mir neu...

    class test {
    public static $test = 'Test';
    
      function static_print()  {
      print_r($this->test);
      }
    }
    
    class test2 extends test  {
      function ausgabe()  {
      print_r(parent::$test);
      }
    }
    
    $test = new test();
    $test->static_print();
    
    $test2 = new test2();
    $test2->ausgabe();


    $test->static_print() gibt nichts aus...

    GrEetz, Olliander
  12. Autor dieses Themas

    d**********r

    Ach ja was solls, die Hauptsache ist, dass es jetzt geht^^
  13. e********l

    Wenn du auf Statische INhalte innerhalb deiner Klasse zugreifen willst, musst du das ?ber $self machen. $this ist wie schon gesagt nur innerhalb des Klassenkontext g?ltig.

    Allerdings ist das Design einer rein Statischen Klass alles andere als OOP geeignet. Statische Elemente entsprechen nicht der OOP Ideologie und sollten nur f?r wirklich wichtige Dinge die sich NIE ?ndern sollen benutzt werden. Zb. ein Sigleton oder eine Factory. Beides ist aber in PHP wegen seiner einmaligen Ausf?hrung ?u?erst fragw?rdig.

    Meiner Meinung nach eignet sich das PHP Class/OOP Model objektiv gesehen lediglich f?r Datenobjekte die man sp?ter serialisiert.

    Beitrag ge?ndert am 28.08.2006 11:10 von evil-devil
  14. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!