Question

Je cherche l'équivalent get_called_class() pour __FILE__ ... Peut-être quelque chose comme get_included_file()?

J'ai un ensemble de classes qui voudrait savoir quel répertoire ils existent dans quelque chose comme ceci:.

<?php

class A {

    protected $baseDir;

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

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

?>

Et dans un autre fichier, dans un autre dossier ...

<?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.

?>

Maintenant, je pouvais faire quelque chose de ghetto, comme l'ajout $this->baseDir = dirname(__FILE__) à chaque classe d'extension, mais qui semble un peu ... ghetto. Après tout, nous parlons PHP 5.3, non? Ne serait-ce censé être l'avenir?

Y at-il une autre façon d'obtenir le chemin d'accès au fichier où une classe a été déclarée?

Était-ce utile?

La solution

si vous n'utilisez pas __FILE__ mais une variable séparée et définissez la variable à __FILE__ dans chaque classe

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();

vous avez encore à redéclarer la propriété dans chaque classe, mais pas la méthode

Autres conseils

Avez-vous essayé l'assigner en tant que membre statique de la classe?

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

(et non testés, ainsi que l'héritage de statics classe devient très amusant ...)

Vous pouvez utiliser debug_backtrace () . Vous ne voulez probablement pas, cependant.

Testé:

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

ne fonctionne pas.

On dirait que la constante est enregistrée lorsque la classe est chargée qui ne sont pas « en retard ».

Je ne sais pas qu'il était possible avant, mais ce qui était le mieux pour moi utilise la réflexion aujourd'hui:

    $basePath = new \ReflectionObject($this);
    $dir = dirname($basePath->getFileName());
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top