Domanda

Sto cercando di ottenere il percorso assoluto di una classe PHP che eredita da una superclasse. Sembra che dovrebbe essere semplice. Credo che il codice qui sotto lo spiega nel modo più succinto possibile:

// myapp/classes/foo/bar/AbstractFoo.php
class AbstractFoo {

    public function getAbsolutePathname() {
        // this always returns the pathname of AbstractFoo.php
        return __FILE__;
    }

}


// myapp/classes/Foo.php
class Foo extends AbstractFoo {

    public function test() {
        // this returns the pathname of AbstractFoo.php, when what I
        // want is the pathname of Foo.php - WITHOUT having to override
        // getAbsolutePathname()
        return $this->getAbsolutePathname();
    }

}

Il motivo per cui non voglio ignorare getAbsolutePathname() è che ci stanno per essere un sacco di classi che estendono AbstractFoo, in potenzialmente molti luoghi diversi sul filesystem (Foo è in realtà un modulo) e sembra che una violazione della SECCO.

È stato utile?

Soluzione

Bene, si potrebbe usare riflessione :

public function getAbsolutePathname() {
    $reflector = new ReflectionObject($this);
    return $reflector->getFilename();
}

Non sono sicuro se che restituirà il percorso completo, o solo il nome del file, ma non vedo altri metodi importanti, in modo da fare un tentativo ...

Altri suggerimenti

Per quanto ne so, non v'è alcuna soluzione pulita per questo. La magia costanti __FILE__ e __DIR__ vengono interpretati durante l'analisi, e non sono dinamici.

Quello che tendo a fare è

class AbstractFoo {

    protected $path = null;

    public function getAbsolutePathname() {

        if ($this->path == null) 
              die ("You forgot to define a path in ".get_class($this)); 

        return $this->path;
    }

}


class Foo extends AbstractFoo {

  protected $path = __DIR__;

}

Si potrebbe incidere qualcosa con debug_backtrace, ma che ancora richiede di sovrascrivere esplicitamente la funzione di capogruppo in ciascuna classe di sub.

E 'molto più facile per definire la funzione come return __FILE__; in ogni classe sub. __FILE__ sarà sempre essere sostituito con il nome del file in cui si trova, non c'è modo per fargli fare altrimenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top