web-dev-qa-db-ja.com

継承されたメソッドから派生クラスのパスを取得するにはどうすればよいですか?

継承されたメソッドから現在のクラスのパスを取得する方法は?

私は以下を持っています:

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

_ReflectionClass::getFileName_ を使用すると、クラスChildが定義されているディレクトリ名を取得できます。

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

get_class() を使用してオブジェクトのクラス名を取得できます:)

70
Palantir

はい。パランティアの答えに基づく:

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

5.5以降では クラス名の解決にclassキーワードを使用 できることを忘れないでください。これはget_class($this)を呼び出すよりもはるかに高速です。承認されたソリューションは次のようになります。

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

オートロードに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);
9
ya.teck

ディレクトリをコンストラクタの引数として渡すこともできます。とてもエレガントではありませんが、少なくとも、反射や作曲家を操作する必要はありません。

親:

<?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(); 
      }
   }
?>
0
Adrian
<?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__を直接使用してください。

0
Remy Mellet