Wie erhalte ich den Pfad einer abgeleiteten Klasse von einer geerbten Methode?
Lesezeit: 2 Minuten
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());
}
}
?>
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__.
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();
}
}
?>
12840200cookie-checkWie erhalte ich den Pfad einer abgeleiteten Klasse von einer geerbten Methode?yes