2010-06-10 43 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 से):

<?php // file: /parentDir/class.php 
    class Parent { 
     protected function getDir() { 
     $reflector = new ReflectionClass(get_class($this)); 
     return dirname($reflector->getFileName()); 
     } 
    } 
?> 

उत्तर

58

इस के साथ ReflectionClass::getFileName का उपयोग करके आप dirname वर्ग Child पर परिभाषित किया गया है मिल जाएगा।

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

आप get_class() :)

26

साथ एक वस्तु की श्रेणी का नाम प्राप्त कर सकते हैं हाँ। Palantir के जवाब पर बिल्डिंग:

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

हाँ, यह पलंतिर के उत्तर के साथ तार्किक निष्कर्ष है। – Jacco

10

मत भूलना, 5.5 आप कर सकते हैं के बाद से है, जो एक बहुत get_class($this) बुला तुलना में तेजी से हो जाएगा। स्वीकार किए जाते हैं समाधान इस प्रकार दिखाई देगा:

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

आप Autoloading आप प्रतिबिंब के बिना निर्देशिका प्राप्त कर सकते हैं के लिए संगीतकार उपयोग कर रहे हैं।

$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 घंटे बिताए हैं प्रतिबिंब का उपयोग किए बिना ऐसा करने का तरीका खोजना !! धन्यवाद! –

+0

मीठे geesuz !!! –

संबंधित मुद्दे