Pregunta

Estoy buscando el equivalente get_called_class() para __FILE__ ... Tal vez algo así como get_included_file()?

Tengo un conjunto de clases que le gustaría saber qué directorio existen en algo como esto:.

<?php

class A {

    protected $baseDir;

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

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

?>

Y en algún otro archivo, en alguna otra carpeta ...

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

?>

Ahora, yo podría hacer algo gueto, como la adición de $this->baseDir = dirname(__FILE__) a todos y cada clase se extiende, pero que parece un poco ... gueto. Después de todo, estamos hablando de PHP 5.3, ¿verdad? ¿No se supone que es el futuro?

¿Hay otra manera de obtener la ruta al archivo donde se declaró una clase?

¿Fue útil?

Solución

¿y si no se utiliza, pero __FILE__ una variable independiente y establece la variable a __FILE__ en cada clase

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

todavía tiene que redeclare la propiedad en cada clase, pero no el método

Otros consejos

¿Ha intentado asignar como un miembro estático de la clase?

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

(no probados, y la estática, además de la herencia de clases llega a ser muy divertido ...)

debug_backtrace () . Es probable que no quiere, sin embargo.

Probado:

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

no funciona.

Parece que la constante se ha registrado cuando la clase se carga que no es "tarde".

No estoy seguro de que era posible antes, pero lo que era mejor para mí hoy está utilizando la reflexión:

    $basePath = new \ReflectionObject($this);
    $dir = dirname($basePath->getFileName());
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top