การตั้งค่ารวมเส้นทางและการโหลดอัตโนมัติเป็นสองสิ่งที่แตกต่างกันหรือไม่

ฉันสังเกตเห็นว่าการเพิ่มเส้นทางรวมของโฟลเดอร์ที่ฉันต้องการนั้นไม่เพียงพอที่จะเข้าถึงคลาส

ฉันมีโฟลเดอร์ application/tests/ ซึ่งมี application/tests/Test.php

คลาส Test.php มีชื่อว่า Test โดยไม่มีคำนำหน้าใดๆ

class Test {

}

หากฉันเพิ่มโฟลเดอร์การทดสอบเฉพาะในเส้นทางรวม

realpath(APPLICATION_PATH . '/tests')

คลาส Test.php ไม่ทำงานในคอนโทรลเลอร์

new Test()

รวมโฟลเดอร์ในเส้นทางรวมไม่เพียงพอหรือ


person jblue    schedule 11.12.2010    source แหล่งที่มา
comment
ฟังก์ชันโหลดอัตโนมัติจาก ZF แมปชื่อคลาสกับโฟลเดอร์/พาธไฟล์ เช่น: คลาสในโฟลเดอร์ /models/db/connection.php จะต้องตั้งชื่อ model_db_connection (Zend จะจับคู่โมเดลกับโมเดลในชื่อคลาสโดยอัตโนมัติ)   -  person JF Dion    schedule 11.12.2010


คำตอบ (2)


@StasM ถูกต้องแล้ว แต่นี่เป็นคำอธิบายเพิ่มเติมเล็กน้อย

include_path จะบอก PHP ว่าจะต้องดูที่ไหนเมื่อรัน include, include_once, require หรือ require_once แน่นอนว่า includes และ requires เหล่านี้อ้างอิงถึง ไฟล์ เฉพาะเจาะจงเสมอ

การโหลดอัตโนมัตินั้นเกี่ยวข้องกับ คลาส ที่ขาดหายไปโดยเฉพาะ เมื่อมีการอ้างอิงคลาสที่ยังไม่ได้โหลดในโค้ด - โดยทั่วไป แม้ว่าจะไม่จำกัดเฉพาะโดยการเรียกใช้ตัวดำเนินการ new เช่นเดียวกับในตัวอย่างของคุณ การโหลดอัตโนมัติเป็นกระบวนการที่สามารถเริ่มด้วยอัลกอริธึมสำหรับการโหลดคลาส โดยทั่วไปกระบวนการนี้เกี่ยวข้องกับการเริ่มต้นจากชื่อของคลาสที่หายไปและสร้างคอลเลกชันของชื่อพา ธ ที่เป็นไปได้ - ไม่ว่าจะเป็นแบบสัมบูรณ์ในระบบไฟล์หรือสัมพันธ์กับรายการใน include_path - จากชื่อของคลาสที่หายไปจากนั้นดำเนินการ include ด้วยความหวังว่า คำจำกัดความของคลาสอยู่ในหนึ่งในนั้น

ในกรณีของคุณ คุณได้เรียกชั้นเรียนชื่อ "Test" ไฟล์ที่มีคลาสนี้อยู่ในไฟล์ APPLICATION_PATH . 'tests/Test.php' และคุณได้วางไดเรกทอรี APPLICATION_PATH . 'tests' ไว้ใน include_path แต่จนกว่าจะมีอัลกอริธึมการโหลดอัตโนมัติ ไม่มีวิธีใดที่ระบบจะเชื่อมต่อชื่อคลาส 'Test' กับชื่อไฟล์ 'Test.php'

แบบแผนการตั้งชื่อคลาสแบบ PEAR จะให้การเชื่อมต่อนี้ และตัวโหลดอัตโนมัติที่ใช้หลักการนั้น - เช่นเดียวกับตัวโหลดอัตโนมัติของ Zend Framework เริ่มต้น - จะสามารถทำการแมปนั้นจากชื่อคลาสไปยังชื่อไฟล์ จากนั้น include ไปยังไฟล์ที่ต้องการ

ภาวะแทรกซ้อนขั้นสุดท้าย รูปแบบไดเร็กทอรี Zend Framework แบบเดิมจะวางคลาสบางคลาสไว้ในโฟลเดอร์ที่ NOT บนพาธรวม: โมเดล แบบฟอร์ม บริการ ตัวควบคุม ตัวช่วยดู ตัวช่วยการดำเนินการ ฯลฯ นั่นคือสาเหตุว่าทำไม คุณมักจะเห็นการกำหนดค่าตัวโหลดอัตโนมัติเพิ่มเติม - โดยทั่วไปจะอยู่ในคลาส Bootstrap - กำหนดการแมประหว่างชื่อคลาสบางชื่อและตำแหน่งบางแห่งในระบบไฟล์ที่ ปิด include_path

ตัวอย่างเช่น คลาสชื่อ 'Default_Model_User' อาจต้องอยู่บน include_path ในไฟล์ 'Default/Model/User.php' เมื่อมองแวบแรก แต่โครงสร้างไดเรกทอรีแอปมาตรฐานต้องการวางไฟล์นั้นใน 'application/models/User.php' สังเกตพหูพจน์ 'models' และตัวพิมพ์เล็ก 'm' ในชื่อเส้นทาง เช่นเดียวกับการมี "Default" ในชื่อคลาส จำเป็นต้องมีการกำหนดค่าเพิ่มเติมในตัวโหลดอัตโนมัติเพื่อให้เข้าใจได้ โดยจัดเตรียมรูปแบบสำหรับการแมปชื่อคลาสกับชื่อไฟล์ โดยปกติแล้วจะสำเร็จได้ด้วยตัวโหลดทรัพยากรอัตโนมัติ

หวังว่าสิ่งนี้จะช่วยคุณหรือคนอื่นได้ ไชโย!

person David Weinraub    schedule 11.12.2010

เส้นทางรวมจะแสดงตำแหน่งที่ PHP จะค้นหาสคริปต์ที่กำลังจะรวมไว้ ดังนั้นเมื่อคุณพูดว่า include('blah.php') เอ็นจิ้น PHP จะค้นหา blah.php ในทุกเส้นทางในเส้นทางรวม

การโหลดอัตโนมัติเป็นฟังก์ชันที่ช่วยให้สามารถเรียกใช้ฟังก์ชันบางอย่างได้เมื่อ PHP ตรวจพบว่าจำเป็นต้องใช้คลาสนั้นแต่ไม่ได้กำหนดไว้ ในฟังก์ชันนี้ คุณสามารถใช้เส้นทางรวมเพื่อค้นหาไฟล์ที่มีคลาสและโหลดได้ แต่สิ่งเหล่านี้แตกต่างอย่างสิ้นเชิง

realpath() ไม่เกี่ยวข้องกับสิ่งใดๆ เหล่านั้น และเป็นฟังก์ชันที่ส่งคืนเส้นทางระบบไฟล์เฉพาะของไฟล์ที่กำหนด โดยมีสิ่งต่างๆ เช่น .. และลิงก์สัญลักษณ์ได้รับการแก้ไขแล้ว

person StasM    schedule 11.12.2010