2010-06-10 83 views
36

如何從繼承的方法獲取當前類的路徑?如何從繼承的方法獲取派生類的路徑?

我有以下幾點:

<?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):

​​

回答

26

獲取對象的類名是。建立在Palantir的答案:

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

是的,這是Palantir的答案的邏輯結論。 – Jacco 2010-06-10 13:06:44

10

不要忘了,因爲5.5可以,這將是比調用get_class($this)快了很多。接受的解決方案是這樣的:

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

如果您正在使用作曲爲自動加載,你可以檢索目錄,而不反射。

$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); 
+0

伴侶,我已經花了大約4小時今天搜索一種方法來做到這一點,而不使用反射!謝謝! – 2016-08-17 19:31:11

+0

sweet geesuz !!! – 2016-09-12 03:31:29