2010-04-27 4 views
4

Je cherche le get_called_class() équivalent pour __FILE__ ... Peut-être quelque chose comme get_included_file()?Oubliez la liaison statique tardive, j'ai besoin de retard statique __FILE__

J'ai un ensemble de classes qui aimeraient savoir ce répertoire qu'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 pourrais faire quelque chose de ghetto, comme ajouter $this->baseDir = dirname(__FILE__) à chaque extension de classe, mais cela semble un peu ... ghetto. Après tout, nous parlons de PHP 5.3, n'est-ce pas? N'est-ce pas censé être le futur?

Existe-t-il un autre moyen d'obtenir le chemin d'accès au fichier où une classe a été déclarée?

+0

Je pense que la seule façon est le « ghetto », mais pourquoi fais-tu cela, peut-être il y a un autre approche du problème? – Josiah

+0

@Josiah Ceci est pour la couche vue d'une application. Chaque objet de vue (généralement) consiste en une classe de vue et un fichier de modèle de vue. Dans l'exemple ci-dessus A, B et C sont des classes d'affichage. Chacun aurait, dans son répertoire parent, un fichier de modèle correspondant. Ce serait génial de définir ce répertoire une fois, cependant, au lieu de chaque fois ... – bobthecow

Répondre

1

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

+0

Ouais, j'avais peur que cela se résume à une réponse comme celle-ci. Notez que si vous pouvez requérir PHP 5.3, vous pouvez stocker l'équivalent de dirname (\ _ \ _ FILE \ _ \ _) en déclarant ceci dans chaque classe d'extension: protected $ dirName = __DIR__; – bobthecow

3

Avez-vous essayé de l'affecter 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 ...)

0

Testés:

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

ne fonctionne pas.

Il semble que la constante soit enregistrée lors du chargement de la classe qui n'est pas "en retard".

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

$basePath = new \ReflectionObject($this); 
    $dir = dirname($basePath->getFileName()); 
Questions connexes