it-swarm.com.de

Wie erhält man den Pfad einer abgeleiteten Klasse von einer geerbten Methode?

Wie erhalte ich den Pfad der aktuellen Klasse von einer geerbten Methode?

Ich habe folgendes:

<?php // file: /parentDir/class.php
   class Parent  {
      protected function getDir() {
         return dirname(__FILE__);
      }
   }
?>

und

<?php // file: /childDir/class.php
   class Child extends Parent {
      public function __construct() {
         echo $this->getDir(); 
      }
   }
   $tmp = new Child(); // output: '/parentDir'
?>

Die Konstante __FILE__ verweist unabhängig von der Vererbung immer auf die Quelldatei der Datei, in der sie sich befindet.
Ich möchte den Namen des Pfades für die abgeleitete Klasse erhalten.

Gibt es eine eleganteMöglichkeit, dies zu tun?

Ich könnte etwas in der Art von $this->getDir(__FILE__); tun, aber das würde bedeuten, dass ich mich ziemlich oft wiederholen muss. Ich suche nach einer Methode, die die ganze Logik in die übergeordnete Klasse setzt, wenn möglich.

Update:
Akzeptierte Lösung (von Palantir ):

<?php // file: /parentDir/class.php
   class Parent  {
      protected function getDir() {
         $reflector = new ReflectionClass(get_class($this));
         return dirname($reflector->getFileName());
      }
   }
?>
38
Jacco

Wenn Sie ReflectionClass::getFileName verwenden, erhalten Sie den Verzeichnisnamen, für den die Klasse Child definiert ist.

$reflector = new ReflectionClass("Child");
$fn = $reflector->getFileName();
return dirname($fn);

Sie können den Klassennamen eines Objekts mit get_class() :) erhalten.

64
Palantir

Ja. Aufbauend auf Palantirs Antwort:

   class Parent  {
      protected function getDir() {
         $rc = new ReflectionClass(get_class($this));
         return dirname($rc->getFileName());
      }
   }
27
Artefacto

Vergessen Sie nicht, dass Sie seit 5.5 class für die Klassennamensauflösung verwenden können. Dies wäre viel schneller als der Aufruf von get_class($this). Die akzeptierte Lösung würde folgendermaßen aussehen:

protected function getDir() {
    return dirname((new ReflectionClass(static::class))->getFileName());
}
11
Ian Bytchek

Wenn Sie Composer für das automatische Laden verwenden, können Sie das Verzeichnis ohne Reflektion abrufen.

$autoloader = require 'project_root/vendor/autoload.php';
// Use get_called_class() for PHP 5.3 and 5.4
$file = $autoloader->findFile(static::class);
$directory = dirname($file);
8
ya.teck

Sie können das Verzeichnis auch als Konstruktorargument übergeben. Nicht besonders elegant, aber zumindest müssen Sie nicht mit Reflection oder Komponist arbeiten.

Elternteil:

<?php // file: /parentDir/class.php
   class Parent  {
      private $directory;

      public function __construct($directory) {
          $this->directory = $directory;
      }

      protected function getDir() {
         return $this->directory;
      }
   }
?>

Kind:

<?php // file: /childDir/class.php
   class Child extends Parent {
      public function __construct() {
        parent::__construct(realpath(__DIR__));
        echo $this->getDir(); 
      }
   }
?>
0
Adrian