Frage

Ich suche nach dem get_called_class() Äquivalent für __FILE__ ... Vielleicht so etwas wie get_included_file()?

Ich habe eine Reihe von Klassen, die würden gerne wissen, was Verzeichnis sie existieren in etwas wie folgt aus:.

<?php

class A {

    protected $baseDir;

    public function __construct() {
        $this->baseDir = dirname(__FILE__);
    }

    public function getBaseDir() {
        return $this->baseDir;
    }
}

?>

Und in einer anderen Datei in einem anderen Ordner ...

<?php

class B extends A {
    // ...
}

class C extends B {
    // ...
}

$a = new A;
echo $a->getBaseDir();

$b = new B;
echo $b->getBaseDir();

$c = new C;
echo $c->getBaseDir();

// Annnd... all three return the same base directory.

?>

Nun könnte ich etwas Ghetto tun, wie das Hinzufügen von $this->baseDir = dirname(__FILE__) zu jedem und jeder abgeleitete Klasse, aber das scheint ein wenig ... Ghetto. Immerhin reden wir über PHP 5.3, nicht wahr? Ist das nicht soll die Zukunft sein?

Gibt es einen anderen Weg, um den Pfad zur Datei zu gelangen, wo eine Klasse deklariert wurde?

War es hilfreich?

Lösung

Was ist, wenn Sie nicht verwenden __FILE__ aber eine separate Variable und die Variable auf __FILE__ in jeder Klasse

class A {

    protected static $baseDir;
    protected $filename = __FILE__; // put this in every file

    public function __construct() {

    }

    public function getBaseDir() {
        return dirname($this->filename) . '<br>'; // use $filename instead of __FILE__
    }   

}

require('bdir/b.php');
require('cdir/c.php');

class B extends A {
    protected $filename = __FILE__; // put this in every file
}

$a = new A;
echo $a->getBaseDir();

$b = new B;
echo $b->getBaseDir();

$c = new C;
echo $c->getBaseDir();

Sie haben immer noch die Eigenschaft in jeder Klasse zu deklarieren, aber nicht die Methode

Andere Tipps

Haben Sie versucht, es als statisches Element der Klasse zuweisen?

<?php
class Blah extends A {
    protected static $filename = __FILE__;
}

(Ungeprüfte und Statik sowie Klassenvererbung wird sehr lustig ...)

könnten Sie debug_backtrace () . Sie wollen wahrscheinlich nicht zu, though.

Im Test:

    protected static $filename = __FILE__; 
    static::$filename 

funktioniert nicht.

Es sieht aus wie die Konstante registriert, wenn die Klasse geladen wird, das ist nicht „spät“.

Nicht sicher, dass es möglich war, vor, aber was am besten für mich wurde heute mit Reflexion:

    $basePath = new \ReflectionObject($this);
    $dir = dirname($basePath->getFileName());
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top