كيفية تضمين ملفات PHP التي تتطلب مسار مطلق ؟

StackOverflow https://stackoverflow.com/questions/4369

  •  08-06-2019
  •  | 
  •  

سؤال

لدي بنية الدليل مثل ما يلي ؛

script.php

inc/include1.php
المؤتمر الوطني العراقي/include2.php

objects/object1.php
الكائنات/object2.php

soap/soap.php

الآن يمكنني استخدام تلك الكائنات في كل script.php و /soap/soap.php, أنا يمكن أن تتحرك لهم ، ولكن أريد بنية الدليل مثل ذلك لسبب محدد.عند تنفيذ script.php تضمين المسار inc/include.php و عند تنفيذ /soap/soap.php انها ../inc, المطلق مسارات العمل ، /mnt/webdev/[project name]/inc/include1.php... لكنه قبيح الحل إذا كنت تريد من أي وقت مضى إلى التحرك الدليل إلى موقع مختلف.

لذا هل هناك طريقة لاستخدام المسارات النسبية ، أو طريقة برمجيا توليد "/mnt/webdev/[project name]/"?

هل كانت مفيدة؟

المحلول

هذا يجب أن تعمل

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

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

تحرير: وأضاف imporvement من قبل aussieviking

نصائح أخرى

يمكنك استخدام المسارات النسبية.محاولة __FILE__.هذا هو PHP المستمر الذي دائما إرجاع المسار/اسم الملف النصي في.لذلك ، soap.php, هل يمكن أن تفعل:

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

المسار الكامل واسم الملف.إذا استخدمت داخل تشمل ، اسم الملف المضمن هو عاد.منذ PHP 4.0.2, __FILE__ دائما يحتوي على مسار مطلق مع روابط الرمزية حلها بينما في السن الإصدارات الواردة مسار نسبي تحت بعض الظروف. (المصدر)

آخر حل تعيين تشمل المسار في httpd.conf أو .ملف htaccess.

إلقاء نظرة على 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 المتغيرات لذلك أنت لا تحتاج إلى إدراج فئة الملف مرة أخرى.

خيار آخر ، تتعلق كيفن ، __FILE__, لكن بدلا من استبدال ملف php اسم من داخلها:

<?php

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

?>

لقد تم استخدام هذا لفترة من الوقت.المشكلة الوحيدة هي في بعض الأحيان لم يكن لديك $_SERVER['SCRIPT_NAME'], ولكن في بعض الأحيان هناك متغير آخر مماثل.

لقد وجدت هذا للعمل بشكل جيد جدا!

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');

?>

أعتقد أن أفضل طريقة هي وضع الخاص بك يتضمن في 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

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

يمكنني استخدام هذا الخط من التعليمات البرمجية.أنه يعود إلى "أعلى" من موقع شجرة ، ثم يذهب إلى الملف المطلوب.

على سبيل المثال, دعونا نقول لدي هذا الملف شجرة:

domain.com/aaa/index.php
المجال.com/bbb/ccc/ddd/index.php
المجال.com/_resources/functions.php

أنا يمكن أن تشمل 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):

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

@Flubba, هل تسمح لي المجلدات داخل تشمل الدليل ؟ شقة تشمل الدلائل تعطي لي الكوابيس.كما كل الكائنات الدليل يجب أن يكون في شركة الدليل.

أوه نعم, بالطبع.هكذا على سبيل المثال, يمكننا استخدام طبقة واحدة من المجلدات الفرعية, عموما:

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

عليك أن تكون حذرا مع الاعتماد على تضمين المسار كثيرا في حركة المرور العالية المواقع ، لأن php يجب أن مطاردة من خلال الدليل الحالي ثم كل الدلائل على أن تشمل المسار بغية معرفة ما إذا كان الملف الخاص بك هو هناك و هذا يمكن أن يبطئ الأمور حتى لو كنت الحصول على إبرامها.

هكذا على سبيل المثال إذا كنت تفعل MVC, كنت وضعت على الطريق إلى التطبيق الخاص بك directoy في تضمين مسار ثم تحديد تشير إلى أشياء في شكل

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

أو أيا كان.

ولكن بصفة عامة ، هو فقط يتيح لك العمل مع قصيرة حقا مسارات في PHP الخاص بك من شأنها أن تعمل من أي مكان و هذا أسهل في القراءة من كل ذلك realpath جذر المستند مالاركيي.

الاستفادة من هذه السيناريو القائم على البدائل واقترح آخرون هو أنها تعمل في أي مكان حتى على مشترك صناديق.وضع تشمل المسار يتطلب أكثر قليلا من الفكر والجهد ولكن كما ذكرت يتيح لك البدء باستخدام __autoload الذي أروع.

إذا كنت تنوي تضمين مسار معين في معظم الملفات في التطبيق الخاص بك, إنشاء متغير عمومي إلى المجلد الجذر الخاص بك.

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

الآن هذا المتغير العالمي "APPLICATION_PATH"يمكن استخدامها لتشمل جميع الملفات بدلا من استدعاء realpath() في كل مرة تقوم بتضمين ملف جديد.

مثلا:

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

آمل أن يساعد ;-)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top