2011-03-05 16 views
15

उदाहरण के लिए,क्या एक पीएचपी फ़ाइल शामिल हो सकती है यह जानती है कि इसे कहां से शामिल किया गया था?

यह index.php

<? 
require_once('header.php'); 
?> 

header.php पता कर सकते हैं यह index.php द्वारा शामिल किया गया था है?

--EDIT--

मैं एक समाधान मिला:

function backtrace_filename_includes($name){ 
    $backtrace_array=debug_backtrace(); 
    if (strpos($backtrace_array[1]['file'],$name)==false){ 
     return false; 
    }else{ 
     return true; 
    } 
} 

header.php

<? 
if (backtrace_filename_includes('index.php')) echo "index.php"; 
?> 
+1

यदि आपको इस फ़ंक्शन की आवश्यकता है तो आपके पास शायद कुछ डिज़ाइन समस्याएं होंगी। मुझे यकीन है कि आपके कोड को व्यवस्थित करने के साथ इस फ़ंक्शन की आवश्यकता नहीं है। – vbence

+0

अच्छा समाधान, मेरे लिए सही काम करता है। – Black

+0

vbence को किसी और के गन्दा और भूलभुलैया कोड को स्पष्ट रूप से संशोधित नहीं करना पड़ा .. यह कुछ दिन होगा: डी समाधान के लिए बहुत बहुत धन्यवाद !! – Kaddath

उत्तर

9

$_SERVER['PHP_SELF'] में शामिल होंगे जबकि वर्तमान में क्रियान्वित स्क्रिप्ट, एक ऐसी फ़ाइल से निर्धारित करने का कोई तरीका नहीं है जिसमें विशिष्ट स्क्रिप्ट शामिल है।

इसका मतलब यह है कि अगर a.phpb.php, जो c.php भी शामिल है, में शामिल हैं c.php जानते हुए भी कि b.php Includer था का कोई रास्ता नहीं होगा। सबसे अच्छा आप प्राप्त कर सकते हैं कि a.php वर्तमान में निष्पादित स्क्रिप्ट है।


संपादित करें: हाँ, मेरे ऊपर जवाब तकनीकी रूप से गलत है - आप debug_backtrace उपयोग कर सकते हैं फोन करने वाले को खोजने के लिए, यहां तक ​​कि कार्यों के बिना, अप पीएचपी 5.4, जो इस कार्यक्षमता को हटा जब तक।

a.php:

<?php 
echo 'A'; 
include 'b.php'; 

b.php:

<?php 
echo 'B'; 
include 'c.php'; 

c.php:

<?php 
echo 'C'; 
print_r(debug_backtrace()); 

आउटपुट:

ABCArray 
(
    [0] => Array 
     (
      [file] => /tmp/b.php 
      [line] => 3 
      [function] => include 
     ) 

    [1] => Array 
     (
      [file] => /tmp/a.php 
      [line] => 3 
      [args] => Array 
       (
        [0] => /tmp/b.php 
       ) 

      [function] => include 
     ) 

) 

तो यह काम करता है, तो आप शायद इसका उपयोग नहीं करना चाहिए। debug_backtrace अत्यधिक उपयोग किए जाने पर एक ध्यान देने योग्य प्रदर्शन ड्रैग हो सकता है।

+1

यह वह जवाब है जो मैं चाहता था। आपका बहुत बहुत धन्यवाद। – webnat0

+3

तकनीकी रूप से एक स्क्रिप्ट यह पता लगा सकती है कि इसे debug_backtrace() का उपयोग करके शामिल किया गया है, लेकिन यह सलाह नहीं दी जाती है;) –

+0

एचएम, क्या वास्तव में फ़ंक्शन कॉल के बाहर काम करता है, हालांकि? कुछ क्षणों में जांच लेंगे ... – Charles

0
वेब सर्वर वातावरण में

सबसे आसान तरीका: $_SERVER['SCRIPT_FILENAME'] मूल फ़ाइल दिखाएगा कि कहा जाता है।

यूनिवर्सल तरीका - debug_backtrace() आपको निष्पादन के सभी पिछले चरणों को दिखाएगा, जिसमें कार्यों की आवश्यकता/शामिल करने के लिए कॉल शामिल होंगे।

3

$_SERVER['PHP_SELF'] अभी भी मूल रूप से पहुँचा दायर करने के लिए ले जाना चाहिए, या आप से पहले की आवश्यकता होती है एक चर सेट कर सकते हैं, जैसे:

$section = 'home'; 
require_once('header.php'); 

...

if ($section == 'home') { 
    ... 
} 
2
debug_print_backtrace(); 

चेक पीएचपी दस्तावेज

3

पीएचपी कि पश्व-अनुरेखन में आप के लिए सहित करता है फ़ाइल ट्रैक करता है।

/** 
* get filename that included this file 
* 
* @return string filename 
*/ 
function include_by() { 
    $bt = debug_backtrace(0); 
    while ($b = array_shift($bt)) { 
     if (in_array($b['function'], array('require', 'require_once', 'include', 'include_once'), 1)) { 
      return $b['file']; 
     } 
    } 
    throw new BadFunctionCallException('Not an include.'); 
} 

उपयोग::

main.php:

<?php 
include('sub.php'); 

sub.php:

एक छोटे सहायक समारोह के साथ आप फ़ाइल नाम है कि पिछले शामिल आदेश था प्राप्त कर सकते हैं
<?php 
echo basename(include_by()); # main.php 

बैकट्रैक के साथ-साथ संबंधित उपयोग देखें: Caller function in PHP 5?

+0

धन्यवाद! :) यह घोषणा करने में सक्षम था कि घोषणा कहां थी। +1 प्रतिनिधि – Killrawr

4

get_included_files() उन फ़ाइलों को शामिल किया गया है, जिसमें वे शामिल हैं, जिसमें मेरे मामले में मुझे आवश्यक सबकुछ दिया गया है।

विशेष रूप से, अगर आपको लगता है कि शामिल किया गया है एक फ़ाइल के भीतर get_included_files() कहते हैं, उस फ़ाइल को उसकी अपनी फ़ाइल पथ ढेर get_included_files() द्वारा दिया पर सबसे हाल ही प्रविष्टि, एक कि शामिल यह है कि ऊपर है, आदि

हो जाएगा

चेतावनी यह है कि फाइलें केवल एक बार सूचीबद्ध होती हैं, इसलिए यदि एक ही फ़ाइल को एक से अधिक बार शामिल किया गया है, तो केवल पहला शामिल स्टैक में दिखाई देगा। मेरे उद्देश्यों के लिए जो कोई मुद्दा नहीं था, लेकिन इसका निश्चित रूप से मतलब है कि यह सभी मामलों में काम नहीं करेगा।

विशिष्ट उदाहरण: फ़ाइल 'test1.php' की कल्पना करें 'test_include.php'। ब्राउज़र में test1.php लोड करने के बाद 'test_include.php' के परिप्रेक्ष्य से get_included_files() का परिणाम निम्नानुसार है (दिया गया है, जैसा कि आप देख सकते हैं कि मुझे एक auto_prepend फ़ाइल मिली है, जो बदले में एक ऑटोलोडर लोड करती है) ।

array(4) { 
    [0]=> 
    string(21) "/www/auto_prepend.php" 
    [1]=> 
    string(19) "/www/autoloader.php" 
    [2]=> 
    string(14) "/www/test1.php" 
    [3]=> 
    string(21) "/www/test_include.php" 
} 

तो test_include.php केवल यह पता लगाने की है जो इसे शामिल एक छोटे से array_pop'ing करना होता है।

+0

ग्रेट पहला जवाब। :) –

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

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