Question

Je suis en train de faire le chemin absolu d'une classe PHP qui hérite d'une superclasse. Il semble que ce devrait être simple. Je pense que le code ci-dessous explique aussi succinctement que possible:

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

}

La raison pour laquelle je ne veux pas passer outre getAbsolutePathname() est qu'il va y avoir beaucoup de classes qui étendent AbstractFoo, dans potentiellement de nombreux endroits différents sur le système de fichiers (Foo est en fait un module) et il semble comme une violation de DRY.

Était-ce utile?

La solution

Eh bien, vous pouvez utiliser :

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

Je ne sais pas si cela va retourner le chemin complet, ou tout simplement le nom du fichier, mais je ne vois pas d'autres méthodes pertinentes, afin de lui donner un essai ...

Autres conseils

Pour autant que je sache, il n'y a pas de solution propre pour cela. Les constantes magiques __FILE__ et __DIR__ sont interprétées lors de l'analyse, et ne sont pas dynamiques.

Ce que je tends à faire est

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__;

}

Vous pourriez pirater quelque chose avec debug_backtrace, mais qui vous oblige toujours à remplacer explicitement la fonction parent dans chaque sous-classe.

Il est beaucoup plus facile de définir la fonction que return __FILE__; dans chaque sous-classe. __FILE__ sera toujours remplacé par le nom du fichier dans lequel il se trouve, il n'y a aucun moyen de le faire faire autrement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top