Jalur file benar menurut saya dan phpStorm tetapi salah di dunia nyata

phpStorm dan saya setuju ini gila tetapi jalur file yang "salah" berfungsi sementara yang "benar" gagal. Struktur dasar.

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

Dalam indeks saya menggunakan: (1)

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

dan di Person.php saya berharap untuk menggunakan: (2)

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

Tapi yang didapat adalah:

"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"

Anehnya (3)

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

berhasil dan yang lebih aneh lagi (4)

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

meskipun kita naik satu level direktori!

phpStorm menandai 3 dan 4 sebagai kesalahan (mengatakan "Path include/autoloader.inc.php tidak ditemukan" dan "Sertakan ekspresi tidak terselesaikan") sementara (2), yang menurut saya "benar", mendapat warna hijau besar yang bagus centang tetapi gagal saat debug atau jika diakses langsung melalui http://localhost dll.

Saya selalu kesulitan dengan jalur ini tetapi kenapa phpStorm dan saya setuju dan dunia nyata mengatakan tidak!

Sepertinya saya harus meletakkan $_SERVER['DOCUMENT_ROOT'] di semua tempat (lebih mudah dengan Storm daripada menggunakan tulisan tangan!) tapi tetap saja merepotkan!


person BeNice    schedule 27.09.2015    source sumber
comment
Nama folder Anda adalah 'termasuk' dalam contoh pohon direktori Anda, tetapi pernyataan penyertaan Anda mengatakan 'termasuk' - apakah ada kesalahan ketik pada kode atau contoh Anda?   -  person Anuj    schedule 27.09.2015
comment
Anda mungkin ingin mencoba getcwd dari file php yang disertakan untuk melihat apakah menurutnya Anda berada di tempat yang Anda kira. php.net/manual/en/function.getcwd.php   -  person Smack Jack    schedule 27.09.2015
comment
Coba gunakan lebih banyak jalur absolut, mis. include_once __DIR__ . "/../include/autoloader.inc.php"; -- jauh lebih dapat diandalkan karena dengan cara ini Anda tidak memberikan kesempatan bagi PHP untuk salah menafsirkannya (misalnya karena Anda mungkin memiliki include_path yang kompleks, dll). Idealnya saya akan merekomendasikan untuk menggunakan kelas, PSR-4 dan kelas autoloading -- dalam hal ini hanya sedikit yang menyertakan/membutuhkan dan sisanya akan dimuat secara otomatis.   -  person LazyOne    schedule 28.09.2015


Jawaban (1)


Ini adalah perilaku yang benar.

Halaman yang Anda muat ada di /

Di sana Anda menyertakan file dari /includes

Dan sekarang file yang Anda sertakan adalah bagian dari halaman di /

Jadi semua yang disertakan dalam file yang disertakan dipandang sebagai kerabat dari / bukan dari /includes

dan seterusnya...

person Julio Soares    schedule 27.09.2015
comment
Ada dua halaman berbeda - satu di root dan yang lainnya di kelas. Saya tidak mengerti bagaimana penyertaan harus menggunakan jalur yang sama. - person BeNice; 27.09.2015
comment
Saat Anda memasukkan file ke dalam halaman, file yang disertakan menjadi bagian dari halaman dan referensi ke pohon direktori dari dalam halaman terkait dengan posisi halaman di pohon dan bukan dari posisi file apa pun yang akhirnya disertakan. - person Julio Soares; 27.09.2015