継承されたメソッドから現在のクラスのパスを取得する方法は?
私は以下を持っています:
_<?php // file: /parentDir/class.php
class Parent {
protected function getDir() {
return dirname(__FILE__);
}
}
?>
_
そして
_<?php // file: /childDir/class.php
class Child extends Parent {
public function __construct() {
echo $this->getDir();
}
}
$tmp = new Child(); // output: '/parentDir'
?>
_
___FILE__
_定数は、継承に関係なく、常にそれが含まれているファイルのソースファイルを指します。
派生クラスのパスの名前を取得したいと思います。
これを行うエレガントな方法はありますか?
$this->getDir(__FILE__);
に沿って何かを行うことはできますが、それはかなり頻繁に繰り返す必要があることを意味します。可能であれば、すべてのロジックを親クラスに配置するメソッドを探しています。
更新:
承認されたソリューション( Palantir による):
_<?php // file: /parentDir/class.php
class Parent {
protected function getDir() {
$reflector = new ReflectionClass(get_class($this));
return dirname($reflector->getFileName());
}
}
?>
_
_ReflectionClass::getFileName
_ を使用すると、クラスChild
が定義されているディレクトリ名を取得できます。
_$reflector = new ReflectionClass("Child");
$fn = $reflector->getFileName();
return dirname($fn);
_
get_class()
を使用してオブジェクトのクラス名を取得できます:)
はい。パランティアの答えに基づく:
class Parent {
protected function getDir() {
$rc = new ReflectionClass(get_class($this));
return dirname($rc->getFileName());
}
}
5.5以降では クラス名の解決にclass
キーワードを使用 できることを忘れないでください。これはget_class($this)
を呼び出すよりもはるかに高速です。承認されたソリューションは次のようになります。
protected function getDir() {
return dirname((new ReflectionClass(static::class))->getFileName());
}
オートロードにComposerを使用している場合、リフレクションなしでディレクトリを取得できます。
$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 {
private $directory;
public function __construct($directory) {
$this->directory = $directory;
}
protected function getDir() {
return $this->directory;
}
}
?>
子:
<?php // file: /childDir/class.php
class Child extends Parent {
public function __construct() {
parent::__construct(realpath(__DIR__));
echo $this->getDir();
}
}
?>
<?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'
?>
ディレクトリを取得する必要がある場合は、__DIR__
を直接使用してください。