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());
}
}
?>
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.
Ja. Aufbauend auf Palantirs Antwort:
class Parent {
protected function getDir() {
$rc = new ReflectionClass(get_class($this));
return dirname($rc->getFileName());
}
}
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());
}
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);
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();
}
}
?>