โดย longnetpro
อ้าง:
เส้นทางการรวมใน PERL และ PHP เป็นปัญหาที่ยากมาโดยตลอด โดยส่วนใหญ่เกี่ยวข้องกับระบบปฏิบัติการและเว็บเซิร์ฟเวอร์ เป็นไปไม่ได้ที่จะแก้ไขปัญหาเส้นทางนี้อย่างชาญฉลาด เมื่อเปรียบเทียบกับ PERL แล้ว เส้นทางของ PHP นั้นดีกว่ามากและแก้ไขได้ง่ายกว่ามาก เนื่องจากเส้นทางสัมพัทธ์ของ PHP สามารถใช้ได้ทุกโอกาสในโปรแกรม PHP ซึ่งแตกต่างจาก PERL ที่ต้องใช้เส้นทางสัมบูรณ์ในคำสั่งบางคำสั่ง ซึ่งนำไปสู่การปลูกถ่ายมีความซับซ้อนมาก .
จากสิ่งนี้ ฉันจึงได้ออกแบบโซลูชันที่แข็งแกร่งอย่างยิ่งใน PHP ดังที่อธิบายไว้ด้านล่าง
โดยหลักการแล้ว:
ใช้เส้นทางสัมพัทธ์ แต่ใช้เส้นทางสัมพัทธ์ภายในเส้นทางสัมพัทธ์ (ซับซ้อนเล็กน้อย จะอธิบายในรายละเอียดในภายหลัง) ประการแรก สามารถปรับเปลี่ยนได้อย่างง่ายดาย ประการที่สาม มีโครงสร้างที่ชัดเจนและง่ายดาย เพื่อขยาย
ขั้นตอนโดยละเอียด:
ขั้นแรกให้กำหนดไดเร็กทอรีรากของโปรแกรม โปรดทราบว่าอยู่ภายใต้ระบบไฟล์ ไม่ใช่ไดเร็กทอรีเสมือนภายใต้เว็บเซิร์ฟเวอร์ อย่างไรก็ตาม โดยทั่วไปเส้นทางสัมพันธ์ของไดเร็กทอรีย่อยภายใต้ไดเร็กทอรีจะเหมือนกับไดเร็กทอรีย่อยเสมือนภายใต้ URL ของ
2. สร้าง settings.php ในแต่ละไดเร็กทอรีย่อยภายใต้ไดเร็กทอรีรากของโปรแกรมที่กำหนด (จริงๆ แล้วไม่จำเป็นต้องทุกไดเร็กทอรี ขึ้นอยู่กับความต้องการ) และกำหนดตัวแปรหรือค่าคงที่ในนั้น (ค่าคงที่จะดีกว่าเนื่องจากขอบเขตมีขนาดใหญ่กว่า) เช่น APPROOT แต่ APPROOT นี้ไม่ใช่เส้นทางที่แน่นอน แต่เป็นเส้นทางสัมพัทธ์ของไดเร็กทอรีที่สัมพันธ์กับไดเร็กทอรีรากของโปรแกรมที่คุณระบุ
3. เขียน need_once('settings.php'); ในประโยคแรกของไฟล์รายการโปรแกรมทั้งหมดในไดเร็กทอรีนี้ (นั่นคือไฟล์แรกที่มีไฟล์อื่นหรือไฟล์ที่อนุญาตให้เรียกดูโดยตรงในเบราว์เซอร์) โปรดทราบว่าทางที่ดีไม่ควรเพิ่มประโยคนี้ลงในไฟล์ที่รวมไว้ทั้งหมด - จริงๆ แล้ว คุณสามารถเพิ่มประโยคได้ เพราะคุณสามารถเขียน if(!defed(APPROOT)) Defin(APPROOT, '../. .'); คำสั่งประเภทนี้ป้องกันการนิยามใหม่
4. หากคุณต้องการรวมไฟล์อื่นๆ ไม่ว่าจะโดยตรงหรือโดยอ้อม คุณสามารถเขียน include(APROOT.$path); โดยที่ $path คือพาธสัมบูรณ์ของไฟล์ที่รวมไว้โดยสัมพันธ์กับไดเร็กทอรีรากของโปรแกรมที่คุณระบุ
หลักการ:
ไดเร็กทอรีรากของโปรแกรมที่กำหนดนั้นเป็นพาธสัมพัทธ์ แต่ตำแหน่งของไดเร็กทอรีเฉพาะนั้นเป็นพาธสัมบูรณ์ที่สัมพันธ์กับไดเร็กทอรีรากนั้น การรวมกันของทั้งสองคือพาธสัมพัทธ์ของไฟล์เฉพาะที่สัมพันธ์กับไดเร็กทอรีรากของโปรแกรม ตัวอย่างเช่น ไดเร็กทอรี c:wwwrootapp คือไดเร็กทอรีรากของโปรแกรมที่คุณระบุ จากนั้นจะมีไฟล์สองไฟล์ c:wwwrootappaindex.php และ c:wwwrootappbinc.php . สำหรับไดเรกทอรีย่อย a APPROOT คือ '..' และสำหรับไดเรกทอรีรากของโปรแกรม พาธสัมบูรณ์ของ inc.php คือ $path='/b/inc.php' และการรวมกันของทั้งสองคือ '../b /inc.php'. หากคุณต้องการรวม inc.php ใน index.php คุณต้องเขียน include('../b/inc.php'); และพาธนี้ไม่ใช่แค่ APPROOT.$path ที่เพิ่งรวมกันใช่ไหม
สรุปแล้ว:
หลังจากการประมวลผลข้างต้น แต่ละพาธจะเรียบร้อยและสม่ำเสมอ สิ่งเดียวที่ยุ่งยากเล็กน้อยคือต้องกำหนด APPROOT ในแต่ละไดเร็กทอรี แต่จะต้องกำหนดเพียงครั้งเดียวใน settings.php ของไดเร็กทอรีนี้ในแต่ละไดเร็กทอรี ไดเรกทอรี หากโปรแกรมทั้งหมดของคุณมีไฟล์รายการเดียว เช่น index.php และไฟล์อื่นๆ ทั้งหมดรวมอยู่ในไฟล์รายการเดียวนี้ คุณจะต้องเพิ่ม settings.php ลงในไดเร็กทอรีที่มี index.php อยู่ ครั้งเดียวและมันก็โอเค ถ้าเพื่อนได้ทำโครงการ Delphi และศึกษาไฟล์โครงการ เขาจะพบว่าสถานการณ์ที่ฉันเพิ่งกล่าวถึงว่าโปรแกรมมีไฟล์รายการหลักเพียงไฟล์เดียวนั้นคล้ายกับโครงการ Delphi มาก เนื่องจาก Delphi มีไฟล์โปรแกรมหลักเพียงไฟล์เดียว (dpr file) ส่วนที่เหลือเป็นไฟล์หน่วยหรือไฟล์ทรัพยากรทั้งหมด และไม่สามารถดำเนินการได้อย่างอิสระ ใน PHP หากสถานการณ์นี้เกิดขึ้น คุณจะต้องกำหนด APPROOT เพียงครั้งเดียว และเขียน need_once('settings.php'); ในประโยคแรกของไฟล์โปรแกรมหลัก และการรวมที่ตามมาทั้งหมดสามารถใช้ include(APROOT.$ path) ; รับประกันว่าจะไม่มีปัญหาใดๆ เว้นแต่คุณจะไม่เขียนสิ่งนี้ "รวมเส้นทางสัมบูรณ์ของไฟล์ที่เกี่ยวข้องกับไดเรกทอรีรากของโปรแกรม" $path
ฉันใช้วิธีนี้มากกว่าหนึ่งครั้งและได้ผลดี นอกจากนี้ คุณยังสามารถอ้างถึงวิธีกำหนดเส้นทางได้ใน WEB-INFO ของ JSP
นี่เป็นแผนที่เป็นสูตรที่ยังคงไม่เปลี่ยนแปลงเพื่อตอบสนองต่อการเปลี่ยนแปลงที่เปลี่ยนแปลงตลอดเวลา ถ้าใครมีแผนที่ดีกว่านี้ โปรดอย่าลังเลที่จะหารือเกี่ยวกับเรื่องนี้! หากมีสิ่งใดที่คุณไม่เข้าใจโปรดถาม