Probleme mit Arrays in Verbindung mit Klassen

Bansi

Mitglied
Guten "Abend",

ich wage mich gerade mit Klassen in PHP einzuarbeiten, aber irgendwie verzweifel ich gerade.

Folgendes Problem,

Ich habe eine main Klasse die heißt NastrandirBot
desweiteren eine Klasse Roll, diese Klasse vererbe ich mit NastrandirBot

Hauptklasse:
PHP:
class NastrandirBot
{
    var $commands;

    function __construct ()
    {
        $this -> commands = array();
    }

    function RegisterCommand($cmdName, $cmdHandler)
    {
        $this -> commands[$cmdName] = $cmdHandler;
        
        echo "\n RegisterCommand: " .$cmdName. " - " .$this -> commands[$cmdName]. "\n"; 
    }
}

Roll Klasse:

PHP:
class Roll Extends NastrandirBot
{
    function __construct ()
    {        
        $this -> RegisterCommand("!roll",   "Roll");
        $this -> RegisterCommand("!rnd",    "Roll");
        
    }
}

wenn ich var_dumb($this -> commands) in der Funktion "RegisterCommand" ausführe, wird mir der komplette Arrayinhalt aufgelistet.
Sobald ich var_dump in einer anderen Funktion benutze um mir den Arrayinhalt anzeigen zulassen ist sie leer.

Mich würde interessieren was ich falsch mache, ich hoffe ihr könnt mir da weiter helfen.

Lg Sebastian
 
Zuletzt bearbeitet:
So müsste es gehen:
PHP:
class Roll Extends NastrandirBot 
 { 
  function __construct()
   {         
    parent::RegisterCommand("!roll", "Roll"); 
    parent::RegisterCommand("!rnd",  "Roll"); 
    
    var_dump(parent::command);
   } 
 }
Die Erklärung folgt von jemanden anderen oder von mir, wenn ich dann wieder wach bin.
 
Zuletzt bearbeitet:
Hö?
Die Klasse erbt und nicht initialisierte Variablen werden einfach gesetzt. Hast du vielleicht PHP4, dass den Konstruktor anders aufgebaut hat?

PHP:
class NastrandirBot
{
    var $commands;

    function __construct ()
    {
        $this -> commands = array();
    }

    function RegisterCommand($cmdName, $cmdHandler)
    {
        $this -> commands[$cmdName] = $cmdHandler;
        
        echo "\n RegisterCommand: " .$cmdName. " - " .$this -> commands[$cmdName]. "\n"; 
    }
} 

class Roll Extends NastrandirBot
{
    function __construct ()
    {
        $this -> RegisterCommand("!roll",   "Roll");
        $this -> RegisterCommand("!rnd",    "Roll");
        
    }
    
    function foo()
    {
    	var_dump($this->commands);
    }
}

$foo = new Roll();
$foo->foo();

Das geht, so wie du es geschrieben hast.
 
Um es noch ein wenig sauberer zu machen...

PHP:
class NastrandirBot
{
    var $commands;

    function __construct ()
    {
        $this -> commands = array();
    }

    function RegisterCommand($cmdName, $cmdHandler)
    {
        $this -> commands[$cmdName] = $cmdHandler;
        
        echo "\n RegisterCommand: " .$cmdName. " - " .$this -> commands[$cmdName]. "\n"; 
    }
} 

class Roll Extends NastrandirBot
{
    function __construct ()
    {
        parent::__construct();
        $this -> RegisterCommand("!roll",   "Roll");
        $this -> RegisterCommand("!rnd",    "Roll");
        
    }
    
    function foo()
    {
        var_dump($this->commands);
    }
}

$foo = new Roll();
Denn sonst wird der Array nicht initialisiert.

Ansonsten benutzt du einen Mix aus PHP4 (var und Methodendeklaration ohne Sichtbarkeitsdefintionen) und PHP5 (__construct()) und ich empfehle dir eine einheitliche Version anzueignen (also PHP5).
 
Hallo,
erst einmal danke für die Antworten.

Das klingt vlt. ein wenig "blöd" aber ich kenn die ganzen Unterschieden zwischen
PHP4 / 5 nicht richtig. Mein Ziel ist schon auf PHP 5 basis zu programmieren.

Wie sollte es in PHP 5 aussehen?

Und nochmal zu meinem Problem, auf die Array konnt ich schon voher zugreifen
ohne "parent::" aber nur in der Klasse Roll selbst und in der Funktion RegisterCommand() die in der Klasse NastrandirBot steht und aufgerufen wird.

Angenommen ich habe eine Funktion foo() in der Klasse NastrandirBot, so gibt mir var_dump() immer ein leeres Array zurück mit und ohne parent:: aber nicht wie gesagt in der Funktion RegisterCommand() obwohl sie in der selben Klasse stehen.

Die Instanz hatte ich schon voher festgelegt für die Klasse Roll
PHP:
$roll = new Roll();
hatte ich nur leider vergessen mit reinzuschreiben.

Vielen Dank

Grüße Sebastian
 
Zu PHP5:

Schau dich mal nach Stichworten wie, private, protected, public um.

Das dürfte dich auf den richtigen Weg bringen.


Auch die magischen Methoden (findest unter dem Namen) dürften für dich interessant sein.
z.B. __get(), __set(), __destruct(), ......
 
Ich Danke euch nochmal, hab mir die Links durchgelesen und hab die grundlagen soweit verstanden, auch wenns sicher noch an manchen Stellen harpert ;).

Ich hab das mit der Vererbung falsch verstanden, mein Problem habe ich mit einer Referenz zur parent Klasse gelöst.

Grüße Sebastian

-- Thema erledigt ---
 
Zurück