include dirname(__FILE__).'/../../index.php';
adalah taruhan terbaik Anda di sini, dan ini akan menghindari sebagian besar bug jalur relatif yang dapat Anda temui dengan solusi lain.
Memang, ini akan memaksa penyertaan untuk selalu relatif terhadap posisi skrip saat ini tempat kode ini ditempatkan (lokasi mana yang kemungkinan besar stabil, karena Anda menentukan arsitektur aplikasi Anda). Ini berbeda dari hanya melakukan include '../../index.php'
yang akan menyertakan secara relatif ke skrip yang menjalankan (juga disebut "memanggil") dan kemudian secara relatif ke direktori kerja saat ini , yang akan mengarah ke skrip induk yang menyertakan skrip Anda, alih-alih menyelesaikan dari jalur skrip yang Anda sertakan .
Dari dokumentasi PHP:
File disertakan berdasarkan jalur file yang diberikan atau, jika tidak ada yang diberikan, include_path ditentukan. Jika file tidak ditemukan di include_path, include akhirnya akan memeriksa direktori skrip pemanggil itu sendiri dan direktori kerja saat ini sebelum gagal.
Dan posting tertua yang saya temukan mengutip trik ini berasal dari tahun 2003, oleh Tapken .
Anda dapat menguji dengan pengaturan berikut:
Buat tata letak seperti ini:
htdocs
¦ parent.php
¦ goal.php
¦
+---sub
¦ included.php
¦ goal.php
Dalam parent.php
, menempatkan:
<?php
include dirname(__FILE__).'/sub/included.php';
?>
Dalam sub/included.php
, menempatkan:
<?php
print("WRONG : " . realpath('goal.php'));
print("GOOD : " . realpath(dirname(__FILE__).'/goal.php'));
?>
Hasil saat mengakses parent.php
:
WRONG : X:\htdocs\goal.php
GOOD : X:\htdocs\sub\goal.php
Seperti yang bisa kita lihat, dalam kasus pertama, jalur diselesaikan dari skrip pemanggil parent.php
, sedangkan dengan menggunakan dirname(__FILE__).'/path'
trik, penyertaan dilakukan dari skrip included.php
tempat kode ditempatkan.
Waspadalah, berikut ini TIDAK setara dengan trik di atas yang bertentangan dengan yang bisa dibaca di tempat lain:
include '/../../index.php';
Memang, prepending /
akan berfungsi, tetapi itu akan menyelesaikan seperti include ../../index.php
dari skrip panggilan (perbedaannya adalah include_path
tidak akan terlihat setelah itu jika gagal). Dari dokumen PHP :
Jika jalur ditentukan - apakah absolut (dimulai dengan huruf drive atau \ pada Windows, atau / pada sistem Unix / Linux) atau relatif terhadap direktori saat ini (dimulai dengan. Atau ..) - include_path akan diabaikan sama sekali.