Frage

Ich versuche, den absoluten Pfadnamen einer PHP -Klasse zu erhalten, die von einer Superklasse erbt. Es scheint einfach zu sein. Ich denke, der folgende Code erklärt ihn so kurz wie möglich:

// myapp/classes/foo/bar/AbstractFoo.php
class AbstractFoo {

    public function getAbsolutePathname() {
        // this always returns the pathname of AbstractFoo.php
        return __FILE__;
    }

}


// myapp/classes/Foo.php
class Foo extends AbstractFoo {

    public function test() {
        // this returns the pathname of AbstractFoo.php, when what I
        // want is the pathname of Foo.php - WITHOUT having to override
        // getAbsolutePathname()
        return $this->getAbsolutePathname();
    }

}

Der Grund, warum ich nicht außer Kraft setzen möchte getAbsolutePathname() ist, dass es viele Klassen geben wird, die AbstractFoo an potenziell an vielen Orten im Dateisystem erweitern (FOO ist eigentlich ein Modul), und es scheint ein Verstoß gegen Trocknen zu sein.

War es hilfreich?

Lösung

Nun, Sie könnten verwenden Betrachtung:

public function getAbsolutePathname() {
    $reflector = new ReflectionObject($this);
    return $reflector->getFilename();
}

Ich bin mir nicht sicher, ob das den vollständigen Pfad oder nur den Dateinamen zurückgibt, aber ich sehe keine anderen relevanten Methoden. Probieren Sie es aus ...

Andere Tipps

Soweit ich weiß, gibt es dafür keine saubere Problemumgehung. Die magischen Konstanten __FILE__ und __DIR__ werden während der Parsen interpretiert und sind nicht dynamisch.

Was ich tue, ist

class AbstractFoo {

    protected $path = null;

    public function getAbsolutePathname() {

        if ($this->path == null) 
              die ("You forgot to define a path in ".get_class($this)); 

        return $this->path;
    }

}


class Foo extends AbstractFoo {

  protected $path = __DIR__;

}

Sie könnten etwas hacken debug_backtrace, Dies erfordert jedoch immer noch, dass Sie die übergeordnete Funktion in jeder Unterklasse explizit außer Kraft setzen.

Es ist viel einfacher, die Funktion als zu definieren return __FILE__; in jeder Unterklasse. __FILE__ Wird immer durch den Dateinamen ersetzt, in dem er gefunden wird, gibt es keine Möglichkeit, es anders zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top