Saya mengalami masalah dalam memahami kumpulan aturan tentang jalur include relatif PHP. Jika saya menjalankan file A.PHP- dan file A.PHP menyertakan file B.PHP yang menyertakan file C.PHP, sebaiknya jalur relatif ke C.PHP terkait dengan lokasi B.PHP, atau ke lokasi A .PHP? Artinya, apakah penting dari file mana include dipanggil, atau hanya apa direktori kerja saat ini- dan apa yang menentukan direktori kerja saat ini?
php
include
relative-path
Yarin
sumber
sumber
Jawaban:
Ini relatif terhadap skrip utama, dalam hal ini A.php. Ingatlah bahwa
include()
hanya memasukkan kode ke dalam skrip yang sedang berjalan.Tidak.
Jika Anda ingin membuatnya penting, dan melakukan include terhadap B.php, gunakan
__FILE__
konstanta (atau__DIR__
sejak PHP 5.2 IIRC) yang akan selalu mengarah ke file literal saat ini tempat baris kodenya berada.sumber
__DIR__
untuk tujuan yang tepat.include(dirname(__FILE__)."/C.PHP");
, karenainclude("C.PHP");
sudah cukup (Ya! C.PHP dapat berada di direktori yang sama dengan B.PHP) Ini mungkin gagal hanya jika ada dua file C.PHP dalam proyek Anda.@Pekka membawa saya ke sana, tetapi hanya ingin membagikan apa yang saya pelajari:
getcwd()
mengembalikan direktori tempat file yang Anda mulai jalankan berada.dirname(__FILE__)
mengembalikan direktori file yang berisi kode yang sedang dijalankan.Dengan menggunakan dua fungsi ini, Anda selalu dapat membuat jalur penyertaan yang sesuai dengan yang Anda butuhkan.
Misalnya, jika b.php dan c.php berbagi direktori, b.php dapat menyertakan c.php seperti:
tidak peduli dari mana b.php dipanggil.
Faktanya, ini adalah cara yang lebih disukai untuk membuat jalur relatif, karena kode tambahan membebaskan PHP dari keharusan melakukan iterasi melalui include_path dalam upaya untuk menemukan file target.
Sumber:
Perbedaan Antara getcwd () dan dirname (__ FILE__)? Yang mana yang harus saya gunakan?
Mengapa Anda harus menggunakan dirname (__ FILE__)
sumber
Jika termasuk jalur tidak dimulai dengan
./
atau../
, misalnya:Jika menyertakan jalur dimulai dengan
./
atau../
, misalnya:The
.
atau..
di atas adalah relatif terhadapgetcwd()
, yang default ke jalan masuknya.php
berkas (yaituA.php
).Diuji pada PHP 5.4.3 (Tanggal Pembuatan: 8 Mei 2012 00:47:34).
(Perhatikan juga bahwa
chdir()
dapat mengubah outputgetcwd()
.)sumber
chdir(__DIR__)
untuk memperbaiki masalah.getcwd()
, yang defaultnya ke jalur entri file .php [...] - belum tentu benar. Jika saya menjalankan PHP pada baris perintah makagetcwd()
mengacu pada direktori kerja saat ini dari shell, apa pun.php
file yang saya panggil. Saya dapat membayangkan, meskipun, bahwa jika PHP dijalankan di lingkungan server web, lingkungan menginisialisasi direktori kerja saat ini ke.php
file entri . Diuji di macOS dengan PHP 7.2.2 yang diinstal melalui Homebrew.Jawaban Pekka yang diterima tidak lengkap dan, dalam konteks umum, menyesatkan. Jika file disediakan sebagai jalur relatif, konstruksi bahasa yang dipanggil
include
akan mencarinya dengan cara berikut.Pertama, ini akan melalui jalur variabel lingkungan
include_path
, yang dapat disetel denganini_set
. Jika gagal, ia akan mencari di direktori skrip pemanggil itu sendiridirname(__FILE__)
(__DIR__
dengan php> = 5.3.) Jika ini juga gagal, barulah ia akan mencari di direktori kerja! Ternyata, secara default, variabel lingkunganinclude_path
dimulai dengan.
, yang merupakan direktori kerja saat ini. Itulah satu-satunya alasan mengapa ia mencari pertama kali di direktori kerja saat ini. Lihat http://php.net/manual/en/function.include.php .Jadi, jawaban yang benar untuk bagian pertama dari pertanyaan ini adalah bahwa penting di mana berada skrip panggilan yang disertakan. Jawaban untuk bagian terakhir dari pertanyaan ini adalah bahwa direktori kerja awal , dalam konteks server web, adalah direktori dari skrip yang disebut, skrip yang mencakup semua yang lain saat ditangani oleh PHP. Dalam konteks baris perintah, direktori kerja awal adalah apa pun itu ketika php dipanggil pada prompt, tidak harus direktori tempat skrip yang dipanggil berada. The saat direktori kerja, bagaimanapun, dapat diubah pada waktu berjalan dengan fungsi PHP
chdir
. Lihat http://php.net/manual/en/function.chdir.php .Paragraf ini ditambahkan untuk mengomentari jawaban lain. Beberapa telah menyebutkan bahwa mengandalkan
include_path
kurang kuat dan oleh karena itu lebih disukai menggunakan jalur lengkap seperti./path
atau__DIR__ . /path
. Beberapa orang bahkan mengatakan bahwa mengandalkan direktori kerja.
itu sendiri tidak aman, karena dapat diubah. Namun, terkadang, Anda perlu mengandalkan nilai lingkungan. Misalnya, Anda mungkin ingininclude_path
mengosongkan, sehingga direktori skrip pemanggil adalah tempat pertama yang akan dicari, bahkan sebelum direktori kerja saat ini. Kode mungkin sudah ditulis dan diperbarui secara teratur dari sumber eksternal dan Anda tidak ingin memasukkan kembali awalan__DIR__
setiap kali kode diperbarui.sumber
dirname(__FILE__)
(__DIR__)
dengan php> = 5.3.)" Anda yakin? Dimana didokumentasikan? Saya harap Anda salah, dan PHP tidak menggunakan__FILE__
dan__DIR__
untuk tujuan ini , karena hal itu akan segera merusak termasuk skrip "sibling" dari yang terhubung dengan symlink ! : -o (Untungnya, tampaknya berfungsi dengan baik di sini, di pengaturan 7.1 saya.)Jawaban singkat: ini relatif terhadap skrip penyertaan.
TFM menjelaskannya dengan benar:
Jadi, jika /app/main.php mengatakan
include("./inc.php")
itu akan menemukan /app/inc.php .Itu ./ tidak benar-benar diperlukan, tetapi menghilangkan ketergantungan apapun pada include_path.
Saya tidak akan mengandalkan menemukan file yang disertakan dalam direktori kerja saat ini jika seseorang mengubahnya dengan
chdir()
.sumber
./
, apakah itu memeriksa direktori skrip pemanggil terlebih dahulu atau direktori kerja saat ini terlebih dahulu?./
. yaitu chdir ("/ app / other") akan membuatinclude("./inc.php")
gagal. Jadi, gunakaninclude("inc.php")
untuk aman dalam kasus ini.Untuk menyertakan
a
dalamb
Anda perluinclude("../a.php");
Untuk menyertakan
b
dalamc
Anda perluinclude("dir2/b.php");
sumber