เส้นทางไฟล์ถูกต้องโดยฉันและ phpStorm แต่ผิดในโลกแห่งความเป็นจริง

phpStorm และฉันยอมรับว่านี่เป็นเรื่องบ้า แต่เส้นทางไฟล์ "ผิด" ทำงานได้ในขณะที่เส้นทาง "ถูกต้อง" ล้มเหลว โครงสร้างพื้นฐาน

  |
  |------classes(directory)
  |         |
  |         |
  |         Person.php
  |
  |------include(directory)
  |         |
  |         |
  |         db-connect.inc.php
  |         autoloader.inc.php
  |         helper.inc.php
  |
  |
  |index.php
  |etc.php

ในดัชนีฉันใช้: (1)

include_once "include/autoloader.inc.php";
include_once "include/db-connect.inc.php";
include_once "include/helper.inc.php";

และใน Person.php ฉันคาดว่าจะใช้: (2)

include_once "../include/autoloader.inc.php";
include_once "../include/db-connect.inc.php";
include_once "../include/helper.inc.php";

แต่นั่นก็คือ:

"Warning: include_once(../include/autoloader.inc.php): failed to open stream:
No such file or directory in C:\xampp\htdocs\dummy\classes\Person.php on line 2"

แปลกประหลาด (3)

include_once "/../include/autoloader.inc.php";
include_once "/../include/db-connect.inc.php";
include_once "/../include/helper.inc.php";

ใช้งานได้และแปลกประหลาดยิ่งกว่านั้นด้วย (4)

include_once "include/autoloader.inc.php";
include_once "include/db-connect.inc.php";
include_once "include/helper.inc.php";

แม้ว่าเราจะอยู่ระดับไดเร็กทอรีหนึ่งระดับก็ตาม!

phpStorm ตั้งค่าสถานะ 3 และ 4 เป็นข้อผิดพลาด (ระบุว่า "ไม่พบเส้นทางรวม/autoloader.inc.php" และ "ไม่ได้รับการแก้ไขนิพจน์รวม") ในขณะที่ (2) ซึ่งเป็นสิ่งที่ฉันคิดว่า "ถูกต้อง" ได้รับสีเขียวขนาดใหญ่ที่ดี ทำเครื่องหมายแต่ไม่สำเร็จเมื่อแก้ไขจุดบกพร่อง หรือหากเข้าถึงโดยตรงผ่าน http://localhost ฯลฯ

ฉันมักจะต่อสู้กับเส้นทางเหล่านี้ แต่ทำไม phpStorm และฉันจึงเห็นด้วยและโลกแห่งความเป็นจริงก็ปฏิเสธ!

เดาว่าฉันจะต้องใส่ $_SERVER['DOCUMENT_ROOT'] ลงไปให้ทั่ว (ง่ายกว่ามากเมื่อใช้ Storm แทนที่จะใช้มือยาว!) แต่ก็ยังเจ็บอยู่!


person BeNice    schedule 27.09.2015    source แหล่งที่มา
comment
ชื่อโฟลเดอร์ของคุณคือ 'รวม' ในตัวอย่างแผนผังไดเร็กทอรีของคุณ แต่คำสั่งรวมของคุณระบุว่า 'รวม' - มีการพิมพ์ผิดในโค้ดหรือตัวอย่างของคุณหรือไม่   -  person Anuj    schedule 27.09.2015
comment
คุณอาจต้องการลอง getcwd จากไฟล์ php รวมเพื่อดูว่ามันคิดว่าคุณอยู่ในจุดที่คุณคิดว่าคุณอยู่หรือไม่ php.net/manual/en/function.getcwd.php   -  person Smack Jack    schedule 27.09.2015
comment
ลองใช้เส้นทางที่แน่นอนมากขึ้น เช่น include_once __DIR__ . "/../include/autoloader.inc.php"; -- มีความน่าเชื่อถือมากกว่ามาก เพราะด้วยวิธีนี้ คุณจะไม่ให้โอกาส PHP ตีความมันผิด (เช่น เพราะคุณอาจมีความซับซ้อน include_path เป็นต้น) ตามหลักการแล้ว ฉันอยากจะแนะนำให้ใช้คลาส, PSR-4 และการโหลดอัตโนมัติของคลาส - ในกรณีเช่นนี้ มีเพียงไม่กี่รายการที่รวม/ต้องการ และส่วนที่เหลือจะถูกโหลดโดยอัตโนมัติ   -  person LazyOne    schedule 28.09.2015


คำตอบ (1)


นี่เป็นพฤติกรรมที่ถูกต้อง

หน้าเว็บที่คุณโหลดอยู่ใน /

คุณได้รวมไฟล์จาก /includes ไว้ที่นั่น

และตอนนี้ไฟล์ที่คุณรวมไว้เป็นส่วนหนึ่งของหน้าใน /

ดังนั้นการรวมทั้งหมดไว้ในไฟล์ที่รวมไว้จะถูกมองว่าเป็นญาติจาก / ไม่ใช่จาก /includes

และอื่นๆ...

person Julio Soares    schedule 27.09.2015
comment
มีสองเพจที่แตกต่างกัน - เพจหนึ่งอยู่ในรูทและอีกเพจอยู่ในคลาส ฉันไม่เห็นว่าการรวมควรใช้เส้นทางเดียวกันอย่างไร - person BeNice; 27.09.2015
comment
เมื่อคุณรวมไฟล์ไว้ในเพจ ไฟล์ที่รวมไว้จะกลายเป็นส่วนหนึ่งของเพจ และการอ้างอิงไปยังแผนผังไดเร็กทอรีจากภายในเพจจะสัมพันธ์กับตำแหน่งเพจในแผนผัง และไม่มาจากตำแหน่งของไฟล์ที่รวมไว้ในที่สุด - person Julio Soares; 27.09.2015