Wie erhalte ich den Pfad einer abgeleiteten Klasse von einer geerbten Methode?

Lesezeit: 2 Minuten

Benutzer-Avatar
Jacco

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

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

Gibt es irgendwelche elegant Art und Weise, dies zu tun?

Ich könnte etwas in der Art tun $this->getDir(__FILE__); aber das würde bedeuten, dass ich mich ziemlich oft wiederholen müsste. Ich suche nach einer Methode, die die gesamte Logik nach Möglichkeit in die übergeordnete Klasse legt.

Aktualisieren:

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

Benutzer-Avatar
Palantir

Verwenden ReflectionClass::getFileName Damit erhalten Sie den Dirnamen der Klasse Child definiert ist.

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

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

Benutzer-Avatar
Artefakt

Ja. Aufbauend auf Palantirs Antwort:

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

Vergiss nicht, seit 5.5 kannst du das verwenden class Schlüsselwort für die Auflösung des Klassennamenswas viel schneller wäre als ein Anruf get_class($this). Die akzeptierte Lösung würde wie folgt aussehen:

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

  • Vielen Dank! Wenn Sie Namespaces verwenden, stellen Sie sicher, dass Sie diese ändern new ReflectionClass(...) mit new \ReflectionClass(...).

    – Guido Walter Pettinari

    21. September 2021 um 16:35 Uhr

Wenn Sie verwenden Komponist zum automatischen Laden können Sie das Verzeichnis ohne Reflexion 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);

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


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

Bitte beachten Sie, dass Sie, wenn Sie das Verzeichnis benötigen, direkt verwenden __DIR__.

Benutzer-Avatar
Adrian

Sie können das Verzeichnis auch als Konstruktor arg übergeben. Nicht super elegant, aber man muss wenigstens nicht mit Reflektion oder Composer 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(); 
      }
   }
?>

1284020cookie-checkWie erhalte ich den Pfad einer abgeleiteten Klasse von einer geerbten Methode?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy