tutorial - php भाषा




कैसे PHP फ़ाइलों को शामिल करने के लिए एक पूर्ण पथ की आवश्यकता होती है? (8)

मेरे पास निम्नलिखित की तरह एक निर्देशिका संरचना है;

script.php

इंक / include1.php
इंक / include2.php

वस्तुओं / object1.php
वस्तुओं / object2.php

साबुन / soap.php

अब, मैं उन ऑब्जेक्ट्स का उपयोग script.php और /soap/soap.php दोनों में कर रहा /soap/soap.php , मैं उन्हें स्थानांतरित कर सकता हूं, लेकिन मुझे एक विशेष कारण के लिए निर्देशिका संरचना जैसी चाहिए। जब script.php को शामिल किया जा रहा है, तो पथ शामिल है inc/include.php और inc/include.php निष्पादित करते समय /soap/soap.php यह है ../inc , निरपेक्ष पथ काम, /mnt/webdev/[project name]/inc/include1.php... लेकिन यह एक बदसूरत समाधान है अगर मैं कभी निर्देशिका को एक अलग स्थान पर ले जाना चाहता हूं।

तो क्या रिश्तेदार रास्तों का उपयोग करने का एक तरीका है, या प्रोग्राम करने का एक तरीका है "/mnt/webdev/[project name]/" ?


@Flubba, क्या यह मुझे मेरी निर्देशिका में फ़ोल्डर को शामिल करने की अनुमति देता है? फ्लैट में डायरेक्टरीज़ मुझे बुरे सपने देते हैं। के रूप में पूरे ऑब्जेक्ट निर्देशिका inc निर्देशिका में होना चाहिए।

अरे हाँ, बिल्कुल। तो उदाहरण के लिए, हम सबफ़ोल्डर्स की एक परत का उपयोग करते हैं, आम तौर पर:

require_once('library/string.class.php')

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

उदाहरण के लिए यदि आप एमवीसी कर रहे हैं, तो आप अपने एप्लिकेशन डायरेक्टॉय में पथ को शामिल करेंगे और फिर फ़ॉर्म में चीजों को देखें

'model/user.class'
'controllers/front.php'

जो कुछ भी।

लेकिन आम तौर पर बोलना, यह आपको अपने PHP में वास्तव में कम रास्तों के साथ काम करने देता है जो कहीं से भी काम करेगा और यह सब उस realpath दस्तावेज़ रूट malarkey की तुलना में पढ़ना बहुत आसान है।

उन स्क्रिप्ट-आधारित विकल्पों का लाभ जो दूसरों ने सुझाए हैं, वे कहीं भी काम करते हैं, यहां तक ​​कि साझा बक्से पर भी; शामिल पथ को सेट करने के लिए थोड़ा अधिक विचार और प्रयास की आवश्यकता होती है, लेकिन जैसा कि मैंने उल्लेख किया है कि आप __autoload का उपयोग करना शुरू कर सकते हैं जो कि सबसे अच्छा है।


आप अपनी परियोजना के रूट डायरेक्टरी के मार्ग के साथ एक स्थिरांक को परिभाषित कर सकते हैं, और फिर पथ की शुरुआत में रख सकते हैं।


इसे संभालने का एक और तरीका जो किसी भी जरूरत को दूर करता है, वह है autoload फीचर का उपयोग करना। सब कुछ शामिल है आपकी स्क्रिप्ट की जरूरत है "जस्ट इन केस" प्रदर्शन को बाधित कर सकता है। यदि आपकी सम्‍मिलित सभी कक्षाएँ या इंटरफ़ेस परिभाषाएँ हैं, और आप केवल जरूरत पड़ने पर उन्हें लोड करना चाहते हैं, तो आप उपयुक्त वर्ग फ़ाइल को खोजने के लिए अपने कोड के साथ __autoload() फ़ंक्शन को ओवरलोड कर सकते हैं और इसे केवल तभी लोड कर सकते हैं जब इसे कॉल किया जाता है। यहाँ मैनुअल से उदाहरण है:

function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 

जब तक आप अपने शामिल_अप चर के अनुसार सेट करते हैं, तब तक आपको फिर से एक क्लास फ़ाइल शामिल करने की आवश्यकता नहीं होती है।


केविन से संबंधित एक अन्य विकल्प, __FILE__ का उपयोग करता है, लेकिन इसके बजाय php फ़ाइल नाम को इसके भीतर से प्रतिस्थापित करें:

<?php

$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__);
require_once($docRoot . '/lib/include.php');

?>

मैं थोड़ी देर के लिए इस का उपयोग कर रहा हूँ। एकमात्र समस्या कभी-कभी आपके पास $_SERVER['SCRIPT_NAME'] , लेकिन कभी-कभी एक और चर भी होता है।


मुझे लगता है कि सबसे अच्छा तरीका है अपने PHP शामिल पथ में अपने शामिल है। आपके सेटअप के आधार पर ऐसा करने के विभिन्न तरीके हैं।

तो आप बस का उल्लेख कर सकते हैं

require_once 'inc1.php';

किसी भी फ़ाइल के अंदर से यह परवाह किए बिना कि यह आपके शामिल है या आपकी वेब एक्सेस फ़ाइलों में, या नेस्टेड उपनिर्देशिकाओं के किसी भी स्तर पर है।

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

जैसे

site directory
    html (web root)
        your web-accessible files
    includes
        your include files

इसके अलावा, वर्ग फ़ाइलों की आलसी लोडिंग के लिए __autoload देखें

http://www.google.com/search?q=setting+php+include+path

http://www.google.com/search?q=__autoload


यदि आप अपने एप्लिकेशन की अधिकांश फ़ाइलों में विशिष्ट पथ शामिल करने जा रहे हैं, तो अपने रूट फ़ोल्डर में एक वैश्विक चर बनाएं।

define("APPLICATION_PATH", realpath(dirname(__FILE__) . '/../app'));
or 
define("APPLICATION_PATH", realpath(DIR(__FILE__) . '/../app'));

अब इस ग्लोबल वैरिएबल " APPLICATION_PATH " का इस्तेमाल रियलपैथ () हर बार नई फाइल को शामिल करने के बजाय सभी फाइलों को शामिल करने के लिए किया जा सकता है।

पूर्व:

include(APPLICATION_PATH ."/config/config.ini";

आशा करता हूँ की ये काम करेगा ;-)


http://au.php.net/reserved.variables पर एक नज़र डालें

मुझे लगता है कि आप जिस चर की तलाश कर रहे हैं वह है: $_SERVER["DOCUMENT_ROOT"]


require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php");

मैं कोड की इस लाइन का उपयोग करता हूं। यह साइट के पेड़ के "शीर्ष" पर वापस जाता है, फिर वांछित फ़ाइल पर जाता है।

उदाहरण के लिए, मान लें कि मेरे पास यह फ़ाइल ट्री है:

domain.com/aaa/index.php
domain.com/bbb/ccc/ddd/index.php
domain.com/_resources/functions.php

मैं फ़ंक्शन को शामिल कर सकता हूँ। जहाँ भी मैं हूँ, फाइल कॉपी करके चिपकाएँ

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php");

यदि आपको कई बार इस कोड का उपयोग करने की आवश्यकता होती है, तो आप एक ऐसा फ़ंक्शन बना सकते हैं, जो str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1)) भाग देता है। फिर इस फ़ंक्शन को पहले फ़ाइल में सम्मिलित करें जिसमें आप शामिल हैं। मेरे पास एक "initialize.php" फाइल है जिसमें मैं प्रत्येक php पृष्ठ के शीर्ष पर शामिल हूं और जिसमें यह फ़ंक्शन है। अगली बार जब मुझे फ़ाइलें शामिल करनी हैं, तो मैं वास्तव में फ़ंक्शन ( path_back नाम) का उपयोग करता path_back :

require(path_back()."/_resources/another_php_file.php");






php