क्या PHP में फ़ाइल या कॉलिंग कोड के सापेक्ष पथ शामिल हैं?


111

मुझे PHP रिश्तेदार के बारे में नियमों को समझने में परेशानी हो रही है। अगर मैं फ़ाइल A.PHP- को चलाता हूं और फ़ाइल A.PHP में फ़ाइल B.PHP शामिल है जिसमें फ़ाइल C.PHP शामिल है, तो C.PHP के सापेक्ष पथ B.PHP के स्थान या A के स्थान के संबंध में होना चाहिए। .php? यही है, क्या इससे कोई फर्क नहीं पड़ता है कि इसमें कौन सी फाइल शामिल है, जिसे कहा जाता है, या केवल वर्तमान कार्य निर्देशिका क्या है- और वर्तमान कार्य निर्देशिका क्या निर्धारित करती है?


मेरी राय में स्वीकृत उत्तर से अधिक सटीक: stackoverflow.com/a/23902890/1636522
पत्ती

जवाबों:


132

यह मुख्य स्क्रिप्ट के सापेक्ष है, इस मामले में A.php। याद रखें कि include()वर्तमान में चल रही स्क्रिप्ट में सिर्फ कोड सम्मिलित करता है।

यही है, क्या इससे कोई फर्क नहीं पड़ता कि किस फाइल में शामिल है जिसे कहा जाता है

नहीं।

यदि आप इसे बनाना चाहते हैं , और B.php के सापेक्ष शामिल करें, तो __FILE__निरंतर (या __DIR__PHP 5.2 IIRC के बाद से) का उपयोग करें जो हमेशा शाब्दिक वर्तमान फ़ाइल को इंगित करेगा कि कोड की लाइन में स्थित है।

include(dirname(__FILE__)."/C.PHP");

@ पक्का- ज़बरदस्त- बस मैं क्या चाह रहा था। अधिक जानकारी के लिए, stackoverflow.com/questions/2184810/…
Yarin

7
आप __DIR__उस सटीक उद्देश्य के लिए भी उपयोग कर सकते हैं ।
निक बेडफोर्ड

1
यह उत्तर कुछ हद तक ओवरकिल है: NO NEED include(dirname(__FILE__)."/C.PHP");, क्योंकि include("C.PHP");पर्याप्त है (हां! C.PHP B.PHP के समान निर्देशिका में हो सकता है) यह तभी विफल हो सकता है जब आपके प्रोजेक्ट में दो C.PHP फाइलें हों।
जॉनी वोंग

इसे और अधिक स्पष्ट करने के लिए: यह B.php और A.php दोनों के सापेक्ष है यदि बिना "./" या "../" शामिल पथ में उपसर्ग के। नीचे मेरा जवाब देखें।
जॉनी वोंग

21

@Pekka मुझे वहां मिला, लेकिन मैंने जो सीखा, उसे साझा करना चाहता हूं:

getcwd() उस निर्देशिका को लौटाता है जहाँ आपने जिस फ़ाइल को निष्पादित करना शुरू किया है वह रहती है।

dirname(__FILE__) वर्तमान में निष्पादित कोड वाली फ़ाइल की निर्देशिका लौटाता है।

इन दो कार्यों का उपयोग करके, आप हमेशा अपनी आवश्यकता के सापेक्ष एक सम्मिलित पथ का निर्माण कर सकते हैं।

उदाहरण के लिए, यदि b.php और c.php किसी निर्देशिका को साझा करते हैं, तो b.php में c.php को शामिल किया जा सकता है:

include(dirname(__FILE__).'/c.php');

कोई बात नहीं जहां b.php से बुलाया गया था।

वास्तव में, यह सापेक्ष पथों को स्थापित करने का पसंदीदा तरीका है, क्योंकि अतिरिक्त कोड PHP को लक्ष्य फ़ाइल का पता लगाने के प्रयास में शामिल_पथ के माध्यम से पुनरावृति होने से मुक्त करता है।

सूत्रों का कहना है:

Getcwd () और dirname (__ FILE__) के बीच अंतर? मुझे कौन सा उपयोग करना चाहिए?

आपको dirname (__ FILE__) का उपयोग क्यों करना चाहिए


मैं कुछ जोड़ना चाहूंगा, मेरे पास csb.php नामक एक फ़ाइल थी, जिसमें एक फ़ोल्डर से एक फ़ंक्शन फ़ाइल शामिल थी, और फ़ंक्शन फ़ाइल में फ़ंक्शन फ़ाइल के रूप में एक ही फ़ोल्डर से t.php नामक फ़ाइल शामिल थी, जब मैंने एक सहित कोशिश की थी फ़ोल्डर t.php से csb.php नाम की फाइल थी, यह उसी csb.php सहित शुरू हुई, जिसे फ़ंक्शन फ़ाइल कहा जाता है, लेकिन जब मैंने दूसरी csb.php को csbe.php में बदल दिया तो यह तुरंत काम करना शुरू कर दिया। तो, ऐसा लगता है कि यह पहले फ़ोल्डर को प्राथमिकता देता है, फिर दूसरे में फ़ोल्डर शामिल है!
मिगुएल विएरा

18
  1. यदि शामिल पथ के साथ शुरू नहीं होता है ./या ../, जैसे:

    include 'C.php'; // precedence: include_path (which include '.' at first),
                     // then path of current `.php` file (i.e. `B.php`), then `.`.
  2. यदि शामिल पथ के साथ शुरू होता है ./या ../, जैसे:

    include './C.php';  // relative to '.'
    
    include '../C.php'; // also relative to '.'

.या ..इसके बाद के संस्करण के सापेक्ष है getcwd(), प्रवेश के रास्ते पर जो चूक .phpफ़ाइल (यानी A.php)।

PHP 5.4.3 (बिल्ड दिनांक: 8 मई 2012 00:47:34) पर परीक्षण किया गया।

(यह भी ध्यान दें कि chdir()इसका आउटपुट बदल सकता है getcwd()।)


निष्कर्ष निकालने के लिए, A.php का रास्ता पहले C.php के लिए खोजा जाता है, फिर B.php का रास्ता खोजा जाता है यदि कोई उपसर्ग '/।' या '../' शामिल नहीं है। (डिफ़ॉल्ट PHP की सेटिंग मान लें)
जॉनी वोंग

chdir(__DIR__)समस्या को ठीक करने के लिए उपयोग करने के लिए मुझे इसमें शामिल करने के लिए धन्यवाद ।
हार्टलेसन

[...] getcwd(), जो प्रविष्टि .php फ़ाइल के पथ को डिफॉल्ट करता है [...] - जरूरी नहीं कि सच हो। यदि मैं कमांड लाइन पर PHP चलाता हूं getcwd(), तो शेल की वर्तमान कार्यशील निर्देशिका को संदर्भित करता है, भले ही .phpमैं किस फ़ाइल का आह्वान करता हूं। मैं कल्पना कर सकता हूं, हालांकि, अगर PHP एक वेब सर्वर वातावरण में चलाया जाता है जो पर्यावरण वर्तमान कार्यशील निर्देशिका को प्रविष्टि .phpफ़ाइल में प्रारंभ करता है । होमब्रॉ के माध्यम से स्थापित PHP 7.2.2 के साथ macOS पर परीक्षण किया गया।
हर्ज़ब्यूब

17

पक्के का स्वीकृत उत्तर अधूरा है और सामान्य संदर्भ में भ्रामक है। यदि फ़ाइल को एक रिश्तेदार पथ के रूप में प्रदान किया जाता है, तो तथाकथित भाषा निर्माण includeनिम्नलिखित तरीके से इसे खोजेगा।

सबसे पहले, यह पर्यावरण चर के मार्गों से गुजरेगा include_path, जिसे इसके साथ सेट किया जा सकता है ini_set। यदि यह विफल रहता है, तो यह कॉलिंग स्क्रिप्ट की अपनी निर्देशिका dirname(__FILE__)( __DIR__php> = 5.3 के साथ) में खोज करेगा। यदि यह भी विफल हो जाता है, तो ही यह कार्यशील निर्देशिका में खोज करेगा! यह सिर्फ यह बताता है कि, डिफ़ॉल्ट रूप से, पर्यावरण चर के include_pathसाथ शुरू होता है ., जो वर्तमान कार्यशील निर्देशिका है। यही कारण है कि यह वर्तमान कार्यशील निर्देशिका में पहले खोज करता है। Http://php.net/manual/en/function.include.php देखें ।

फ़ाइल दिए गए फ़ाइल पथ के आधार पर शामिल किए गए हैं या, यदि कोई नहीं दिया गया है, तो इसमें शामिल_path निर्दिष्ट है। यदि फ़ाइल शामिल_पाठ में नहीं मिली है, तो अंतिम रूप से कॉलिंग स्क्रिप्ट की अपनी निर्देशिका और वर्तमान कार्यशील निर्देशिका को विफल होने से पहले जाँच करेगा।

तो, प्रश्न के पहले भाग का सही उत्तर यह है कि यह बात करता है कि इसमें शामिल कॉलिंग स्क्रिप्ट कहाँ स्थित है। प्रश्न के अंतिम भाग का उत्तर यह है कि एक वेब सर्वर के संदर्भ में प्रारंभिक कार्यशील निर्देशिका, स्क्रिप्ट की निर्देशिका है, वह स्क्रिप्ट जिसमें PHP द्वारा नियंत्रित किए जाने के दौरान अन्य सभी शामिल हैं। कमांड लाइन के संदर्भ में, प्रारंभिक कार्यशील निर्देशिका वह है जो तब होती है जब php को प्रॉम्प्ट पर लागू किया जाता है, जरूरी नहीं कि वह निर्देशिका जहां स्क्रिप्ट कहा जाता है। वर्तमान कार्यशील निर्देशिका, तथापि, पीएचपी समारोह के साथ चलाने के समय में बदला जा सकता है chdirHttp://php.net/manual/en/function.chdir.php देखें ।

इस अनुच्छेद को अन्य उत्तरों पर टिप्पणी करने के लिए जोड़ा जाता है। कुछ ने उल्लेख किया है कि भरोसा include_pathकरना कम मज़बूत है और इस तरह से ./pathया जैसे पूर्ण पथ का उपयोग करना बेहतर होता है __DIR__ . /path। कुछ लोग यह कहते हुए चले गए कि कार्यशील निर्देशिका पर निर्भर रहना .स्वयं सुरक्षित नहीं है, क्योंकि इसे बदला जा सकता है। हालांकि, कुछ समय, आपको पर्यावरण मूल्यों पर भरोसा करने की आवश्यकता है। उदाहरण के लिए, आप include_pathखाली सेट करना चाह सकते हैं , ताकि कॉलिंग स्क्रिप्ट की निर्देशिका पहली जगह हो जो वह खोज करेगी, वर्तमान कार्य निर्देशिका से पहले भी। कोड पहले से ही बाहरी स्रोतों से नियमित रूप से लिखा और अपडेट किया जा सकता है और आप __DIR__कोड के अपडेट होने पर हर बार उपसर्ग को फिर से स्थापित नहीं करना चाहते ।


"यदि यह विफल रहता है, तो यह कॉलिंग स्क्रिप्ट की अपनी निर्देशिका dirname(__FILE__) (__DIR__)php> = 5.3 के साथ खोज करेगा ।" क्या आप सुनिश्चित हैं? यह कहाँ प्रलेखित है? मुझे आशा है कि आप गलत हैं, और PHP करता नहीं का उपयोग __FILE__और __DIR__के लिए इस उद्देश्य, कि के रूप में तुरंत से "भाई" स्क्रिप्ट सहित टूट जाएगा सांकेतिक रूप से लिंक वाले! : -o (जो, सौभाग्य से, मेरे 7.1 सेटअप पर यहाँ ठीक काम करता है।)
एसजेड।

6

संक्षिप्त उत्तर: यह सम्मिलित स्क्रिप्ट के सापेक्ष है।

TFM इसे सही तरीके से समझाता है:

यदि फ़ाइल शामिल_पाठ में नहीं मिली है, तो कॉलिंग स्क्रिप्ट की निर्देशिका और वर्तमान कार्यशील निर्देशिका में जाँच करेगा

तो, अगर /app/main.php कहता है include("./inc.php")कि /app/inc.php मिलेगा ।

./ सख्ती से आवश्यक नहीं है लेकिन include_path पर किसी भी निर्भरता को हटा।

यदि कोई व्यक्ति इसे बदलता है तो मैं वर्तमान कार्यशील निर्देशिका में फ़ाइलें शामिल करने पर निर्भर नहीं होता chdir()


इसलिए यदि आप स्ट्रिंग को शुरू करते हैं ./, तो क्या यह कॉलिंग स्क्रिप्ट की डायरेक्टरी को पहले या वर्तमान वर्किंग डायरेक्टरी को चेक करता है?
पचेरियर

2
@Denis Howe नहीं, आप पहले से ही वर्तमान वर्किंग डायरेक्टरी पर निर्भर करते हैं यदि आपका शामिल पथ के साथ शुरू होता है ./। यानी chdir ("/ app / other") include("./inc.php")विफल हो जाएगा । इस प्रकार, include("inc.php")इस मामले में सुरक्षित होने के लिए उपयोग करें।
जॉनी वोंग

@ स्पेसर अगर स्ट्रिंग के साथ शुरू होता है। / या ../, यह केवल वर्तमान कार्य निर्देशिका की जाँच करता है। (कॉलिंग स्क्रिप्ट (B.php) की निर्देशिका_पाठ और निर्देशिका दोनों को अनदेखा किया जाता है)। अधिक विस्तार के लिए मेरा जवाब देखें।
जॉनी वोंग

-2
dir
-> a.php
-> c.php

- dir2 
-> b.php

आप aमें शामिल bकरने के लिए की जरूरत हैinclude("../a.php");

आप bमें शामिल cकरने के लिए की जरूरत हैinclude("dir2/b.php");


4
@ ओली- आपको सवाल का जवाब याद आ रहा है- मैं इस बारे में पूछ रहा था कि इसमें शामिल होने के दौरान रिश्तेदार रास्ते कैसे निर्धारित किए जाते हैं।
यिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.