wahsaga: [PHP4] Vordefinierte Klasse Directory erweitern

hi,

ich wollte mir gerne die vordefinierte Klasse Directory erweitern. (PHP 4.4.0)

Einfaches Beispiel:

  
<?php  
class myDir extends Directory {  
    function show() {  
        echo $this->path."<br>\n";  
        echo $this->handle."<br>\n";  
        echo $this->read()."<br>\n";  
        $this->close();  
    }  
}  
?>

Wenn ich mir davon nun aber eine neue Instanz erzeuge [1], und versuche die show()-Methode aufzurufen, bekomme ich die folgenden Notices/Warnings:

Notice: Undefined property: path in ... on line 4
Notice: Undefined property: handle in ... on line 5
Warning: read(): Unable to find my handle property in ... on line 6
Warning: close(): Unable to find my handle property in ... on line 7

Ich hätte eigentlich erwartet, dass die Deklaration meiner Klasse myDir mittels extends wie beim Erweitern einer "eigenen" Klasse auch die Eigenschaften und Methoden von Directory erbt - dem scheint aber wohl nicht so zu sein.

Am Anfang meiner eigenen Klasse
var $path, $handle;
einzufügen, bringt natürlich auch nichts - die Notices bzgl. der undefined properties verschwinden zwar, aber:

Warning: read(): supplied argument is not a valid Directory resource in ... on line 5
Warning: close(): supplied argument is not a valid Directory resource in ... on line 6

path und handle bekommen so beim Erzeugen der Objektinstanz auch keine Werte zugewiesen.

Mache ich etwas falsch - oder lässt sich die vordefinierte Klasse Directory so einfach nicht benutzen?

Klar, ich könnte mir noch einen Konstruktor dazubasteln:

function myDir($path) {  
    $x = dir($path);  
    $this->path = $x->path;  
    $this->handle = $x->handle;  
    unset($x);  
}

Damit würde es funktionieren ... aber das erscheint mir doch arg unsauber bis blödsinnig: Wenn ich im Konstruktor von myDir nochmal dir aufrufe - dann hätte ich es mir gleich sparen können, myDir von dir abzuleiten, und hätte es gleich prozedural programmieren können.

gruß,
wahsaga

[1] natürlich unter Angabe eines Pfad-Strings als Parameter.

--
/voodoo.css:
#GeorgeWBush { position:absolute; bottom:-6ft; }
  1. Guten Morgen,

    Mache ich etwas falsch - oder lässt sich die vordefinierte Klasse Directory so einfach nicht benutzen?

    wenn ich das richtig sehen (bin nicht der C-Held) dann hat man schlichtweg vergessen, vor der Prüfung, ob die Eigenschaften "handle" und "path" vorhanden sind, diese mit einer internalen Funktion wie bei dem PHP-Objekt dir anzulegen, beziehungsweise der angegebene Konstruktorparameter wird nicht durchgereicht und es setzt eine bist-Du-ein-Objekt-Prüfung ein. Also Kurz: Nein.

    Gruß aus Berlin!
    eddi

    --
    Wer Rechtschreibfehler findet, darf sie behalten.
  2. echo $begrüßung;

    ich wollte mir gerne die vordefinierte Klasse Directory erweitern. (PHP 4.4.0)
    Wenn ich mir davon nun aber eine neue Instanz erzeuge [1], und versuche die show()-Methode aufzurufen, bekomme ich die folgenden Notices/Warnings:

    Es wundert mich etwas, von dir diese Fehlermeldungen zu sehen zu bekommen, statt einer print_r- oder var_dump-Ausgabe der betroffenen Variablen, aber gut ... :-)

    Ich hätte eigentlich erwartet, dass die Deklaration meiner Klasse myDir mittels extends wie beim Erweitern einer "eigenen" Klasse auch die Eigenschaften und Methoden von Directory erbt - dem scheint aber wohl nicht so zu sein.

    Doch doch, sie erbt. Es werden aber nur Klassen-Variablen geerbt. Variablen, die erst zur Laufzeit hinzukommen, also Objektvariablen, werden nicht vererbt.

    print_r(get_class_vars('Directory'));

    Array
      (
      )

    Wie Sie sehen, sehen Sie nichts. Die Klasse Directory besitzt keine Klassenvariablen.

    print_r(get_class_methods('Directory'));

    Array
      (
        [0] => close
        [1] => rewind
        [2] => read
      )

    Nun gut, wenigstens sind die Methoden vorhanden.

    Mache ich etwas falsch - oder lässt sich die vordefinierte Klasse Directory so einfach nicht benutzen?

    Wenn ich den C-Quelltext (ext/standard/dir.c) richtig interpretiere, läuft das Ganze so ab: dir() ist nur eine Funktion, die ein Objekt der Klasse Directory zurückgibt. Dazu wird zunächst opendir() aufgerufen, dem das übergebene Argument directory durchgereicht wird. Dann wird eine Instanz von Directory angelegt, welche um die Objektvariablen path (=directory) und handle (=Rückgabe von opendir()) erweitert wird.

    Klar, ich könnte mir noch einen Konstruktor dazubasteln:

    Mein Vorschlag: Erstelle dir die MyDir-Klasse aber erbe nicht von Directory. Im Konstruktor verwendest du opendir(), um das Handle zu ermitteln. Und die drei Methoden close, rewind und read kannst du dir als (Fast-)Einzeiler mit closedir(), rewinddir(), readdir() nachbauen.

    echo "$verabschiedung $name";