• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

OOP: undefined variable?

Moin. Ich stehe grade wirklich vor einem Rätsel. Offenbar mag meine Klasse keine Variable definieren.

PHP:
<?php

error_reporting(E_ALL | E_STRICT);

class NPC {

         public $NpcFile;

         public function __construct($ID) {
                 if ( file_exists("./char_".$ID.".ini") ) {
                         $this->NpcFile = "./char".$ID.".ini";
                 }
         }
         public function BuildNPC() {
                 die($NpcFile);
                 /*$NpcData = parse_ini_file($this->NpcFile);
                 print_r($NpcData);*/
         }

}

?>

Nun erhalte ich bei der Benutzung von BuildNPC() aber die Fehlermeldung
Notice: Undefined variable: NpcFile in C:\xampp\htdocs\char\char.class.php on line 46

So und wieso jetzt? $NpcFile ist doch deutlich definiert. Ich stehe da etwas vor nem Rätsel.

Grüße, NetzSchleicher
 
Werbung:
PHP:
 <?php

error_reporting(E_ALL | E_STRICT);

class NPC {

         public $NpcFile;

         public function __construct($ID) {
                 if ( file_exists("./char_".$ID.".ini") ) {
                         $this->NpcFile = "./char".$ID.".ini";
                 }
         }
         public function BuildNPC() {
                 die($this->$NpcFile);
                 /*$NpcData = parse_ini_file($this->NpcFile);
                 print_r($NpcData);*/
         }

}

?>

$this-> vergessen
 
Werbung:
Wir machen das ganze mal etwas sauberer:
PHP:
<?php
/**
 * Error-Reporting sollte in eine Config-Datei ausgelagert werden, die die ganze
 * Applikation steuert. Das hast du sicher bereits so.
 */
error_reporting(E_ALL | E_STRICT);

/**
 * einen Autoloader für Klassen wäre ein gute Idee, dann kannst du
 * new Foo_Bar() schreiben und der Autoloader inkludiert die ent-
 * sprechende Datei. Es ist trotzdem gut, Klassen die wichtig sind
 * explizit über require_once() zu laden. Das erleichtert das spätere
 * Debuggen
 */
require_once(dirname(__FILE__) . '/Exception.php');

/**
 * wir geben allen deinen Klassen einen Pseudo-Namenesraum, damit ich
 * wenn ich als Entwickler deine Klasse parallel mit einer anderen Klasse
 * dieses Names benutzen kann. PHP 5.3 kann inzwischen richtige Namespaces
 * irgendwann wirst du sicher diesbezüglich umstellen
 */
class DeinGameName_NPC
{

         /**
          * wir nennen unseren Variablen so, dass sie es nicht doppelt gemoppelt ist
          * manchmal lässt sich das nicht vermeiden, aber DeinGameName_NPC->NpCFile
          * ist nicht so schön wie DeinGameName_NPC->file
          * vielleicht sollte man die Variable auch "charSkillsFile" nennen, je nach dem was
          * da so drin steht.
          */
         public $file;

         /**
          * Variablen schreibt man in der Regel klein
          */
         public function __construct($id) {
                 /**
                  * Variablen sind immer praktisch für sowas
                  * einfache Anführungszeichen sind schneller, da dort keine Variablen
                  * interpoliert werden. Manchmal sind "" ganz praktisch, für wie z.B.
                  * echo "dein Name: {$name}\n". Ansonsten gibt's für komplizierte
                  * Ersetzungen noch sprintf() bzw. printf()
                  */
                 $charfile = './char_' . $id . '.ini';

                 /**
                  * so sieht die Exeption-Klasse aus:
                  * class DeinGameName_Exception extends Exception {}
                  * es ist besser für seine eigenen Anwendungen eigene Exptions zu werfen
                  * dann weiß ich später, dass es keine PHP-Exception ist, sondern, welche
                  * Komponente meiner Applikation Probleme bereitet. Das geht mitunter
                  * so weit, dass manche DeinGameName_Map_Exception,
                  * DeinGameName_Skills_Exception haben.
                  * Exceptions sind eine andere Form des die(), man kann diese allerdings
                  * fangen (try...catch()) und entsprechend auf Fehler reagieren. Ausnahmen
                  * sind zwar zunächst drastisch, aber es sind ja nur Ausnahmen vom
                  * Programmablauf und sollten daher auch nur in Ausnahme auftreten.
                  * Manche werfen (throw) sogar für jede Kleinigkeit eine Exception und reag-
                  * ieren entsprechend darauf.
                  */
                 if (!file_exists($charfile)) {
                     throw new DeinGameName_Exception('char file doesn\'t exists');
                 }

                 if (!is_readable($charfile)) {
                     throw new DeinGameName_Exception('char file isn\'t readable');
                 }

                 $this->file = $charfile;
         }

         /**
          * Funktionen schreibt man lieber in lowerKamelCase, während man Klassen, Name-
          * Spaces in UpperCamelCase schreibt. Beispiel Klasse:
          * My_Foo_CreateDOMDocument und eine Funktion daraus wäre:
          * loadString()
          */
         public function build() {
         }

}

/**
 * das ?> lassen wir weg, dass uns kein Space oder Umbruch die Ausgabe versaut.
 */
 
public function BuildNPC() {
die(
HIERHIERHIER!!!!$NpcFile);
/*$NpcData = parse_ini_file($this->NpcFile);
print_r($NpcData);*/
}

ich hatte es noch eingefügt
 
Zurück
Oben