Domanda

Sto cercando la get_called_class() equivalente per __FILE__ ... Forse qualcosa di simile get_included_file()?

Ho un insieme di classi che vorrebbe sapere che cosa directory esistono in Qualcosa di simile a questo:.

<?php

class A {

    protected $baseDir;

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

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

?>

E in qualche altro file, in qualche altra cartella ...

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

?>

Ora, avrei potuto fare qualcosa del ghetto, come l'aggiunta di $this->baseDir = dirname(__FILE__) ad ogni classe che estende, ma che sembra un po '... ghetto. Dopo tutto, stiamo parlando di PHP 5.3, giusto? Non è questo dovrebbe essere il futuro?

C'è un altro modo per ottenere il percorso del file in cui è stata dichiarata una classe?

È stato utile?

Soluzione

Che cosa succede se non si utilizza __FILE__ ma una variabile indipendente e imposta la variabile a __FILE__ in ogni 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();

si devono ancora ridichiarare la struttura in ogni classe, ma non il metodo

Altri suggerimenti

Hai provato a assegnandole come membro statico della classe?

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

(non testata, e statica più di ereditarietà di classe diventa molto divertente ...)

Si potrebbe usare debug_backtrace () . Probabilmente non si vuole, però.

Provato:

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

non funziona.

Sembra che la costante è registrato quando la classe viene caricata, che non è "in ritardo".

Non sono sicuro che fosse possibile prima, ma ciò che oggi è stato meglio per me sta usando riflessione:

    $basePath = new \ReflectionObject($this);
    $dir = dirname($basePath->getFileName());
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top