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




php भाषा (9)

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

script.php

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

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

साबुन / soap.php

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

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


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

<?php

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

?>

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


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

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


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

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

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

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


मुझे लगता है कि आपके 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";

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


यह काम करना चाहिए

$root = realpath($_SERVER["DOCUMENT_ROOT"]);

include "$root/inc/include1.php";

संपादित करें: aussieviking द्वारा जोड़ा imporvement


मैंने इसे बहुत अच्छी तरह से काम करने के लिए पाया!

function findRoot() { 
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

उपयोग:

<?php

function findRoot() {
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1)));
}

include(findRoot() . 'Post.php');
$posts = getPosts(findRoot() . 'posts_content');

include(findRoot() . 'includes/head.php');

for ($i=(sizeof($posts)-1); 0 <= $i; $i--) {
    $posts[$i]->displayArticle();
}

include(findRoot() . 'includes/footer.php');

?>

आप अपने प्रोजेक्ट की मूल निर्देशिका के पथ के साथ निरंतर परिभाषित कर सकते हैं, और उसके बाद पथ की शुरुआत में डाल सकते हैं।


आप सापेक्ष पथ का उपयोग कर सकते हैं। __FILE__ आज़माएं। यह एक PHP निरंतर है जो हमेशा उस स्क्रिप्ट के पथ / फ़ाइल नाम को वापस देता है। इसलिए, soap.php , आप यह कर सकते हैं:

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

फ़ाइल का पूरा पथ और फ़ाइल नाम। यदि किसी अंदर शामिल होता है, तो शामिल फ़ाइल का नाम वापस कर दिया जाता है। चूंकि PHP 4.0.2, __FILE__ हमेशा __FILE__ साथ एक पूर्ण पथ होता है जबकि पुराने संस्करणों में इसमें कुछ परिस्थितियों में सापेक्ष पथ होता है। (source)

एक और समाधान आपके httpd.conf या एक .htaccess फ़ाइल में पथ शामिल करना होगा।







php