Saya mendapatkan kesalahan ini ketika mencoba menggunakan muat otomatis dan ruang nama:
Kesalahan fatal: Kelas 'Class1' tidak ditemukan di /usr/local/www/apache22/data/public/php5.3/test.php pada baris 10
Adakah yang bisa memberi tahu saya apa yang saya lakukan salah?
Ini kode saya:
Class1.php:
<?php
namespace Person\Barnes\David
{
class Class1
{
public function __construct()
{
echo __CLASS__;
}
}
}
?>
test.php:
<?php
function __autoload($class)
{
require $class . '.php';
}
use Person\Barnes\David;
$class = new Class1();
?>
AS
. Itu tidak mengapa solusi ini berhasil. Anda dapat dengan mudah melakukan:use Person\Barnes\David\Class1;
(yang setara denganuse Person\Barnes\David\Class1 as Class1;
).use Person\Barnes\David\Class1;
untuk melakukannya$class = new Class1();
. Denganuse Person\Barnes\David;
Anda harus melakukannya$class = new David\Class1();
. Katause
kunci itu sendiri sama denganuse Person\Barnes\David\Class1 as Class1;
atauuse Person\Barnes\David as David;
, masing-masing untuk setiap contoh.Seperti yang disebutkan Pascal MARTIN, Anda harus mengganti '\' dengan DIRECTORY_SEPARATOR misalnya:
Saya juga menyarankan Anda untuk mengatur ulang struktur direktori, untuk membuat kode lebih mudah dibaca. Ini bisa menjadi alternatif:
Struktur direktori:
Mengajukan:
/ProjectRoot/lib/Person/Barnes/David/Class1.php
Mengajukan:
/ProjectRoot/test.php
sumber
__autoload
Fungsi Anda akan menerima nama kelas lengkap, termasuk nama namespace.Artinya, dalam kasus Anda,
__autoload
fungsi tersebut akan menerima 'Person\Barnes\David\Class1
', dan tidak hanya 'Class1
'.Jadi, Anda harus memodifikasi kode pemuatan otomatis Anda, untuk menangani nama yang "lebih rumit" semacam itu; solusi yang sering digunakan adalah mengatur file Anda menggunakan satu tingkat direktori per "level" ruang nama, dan, saat memuat otomatis, ganti '
\
' di nama ruang nama denganDIRECTORY_SEPARATOR
.sumber
__autoload
Fungsi Anda akan menerima nama-kelas lengkap, termasuk nama ruang nama" - ini hanya berlaku jika Anda telah secara eksplisituse
d kelas yang Anda coba rujuk, bukan jika Anda hanyause
d ruang nama yang dimilikinya. Kesalahan OP adalah bahwa dia akanuse
menggunakan namespace yang berisi kelas dan kemudian mengharapkan fungsi muat otomatisnya secara ajaib melewati jalur kelas penuh. Jawaban ini tidak benar-benar mengatasi kesalahan OP.Saya melakukan sesuatu seperti ini: Lihat Contoh GitHub ini
sumber
Saya menemukan permata ini dari Flysystem
sumber
Saya melihat bahwa fungsi muat otomatis hanya menerima nama kelas "lengkap" - dengan semua ruang nama sebelumnya - dalam dua kasus berikut:
Saya melihat bahwa fungsi muat otomatis TIDAK menerima nama kelas lengkap dalam kasus berikut:
UPDATE: [c] adalah kesalahan dan bukan cara kerja namespace. Saya dapat melaporkan bahwa, alih-alih [c], dua kasus berikut juga berfungsi dengan baik:
Semoga ini membantu.
sumber
use
kata kunci tidak bekerja dengan baik dalam antarmuka baris perintah interaktif PHP (php --interactive
);Saya menggunakan peretasan sederhana ini dalam satu baris:
sumber
memiliki masalah yang sama dan baru saja menemukan ini:
Saat Anda membuat struktur subfolder yang cocok dengan ruang nama kelas yang memuatnya, Anda bahkan tidak perlu mendefinisikan pemuat otomatis.
Ini bekerja seperti pesona
Info lebih lanjut di sini: http://www.php.net/manual/en/function.spl-autoload-register.php#92514
EDIT: ini menyebabkan masalah di Linux karena garis miring terbalik ... Lihat di sini untuk solusi kerja oleh immeëmosol
Namespace Autoload berfungsi di bawah windows, tetapi tidak di Linux
sumber
Menggunakan memiliki gotcha, meskipun sejauh ini merupakan metode tercepat, ia juga mengharapkan semua nama file Anda menjadi huruf kecil.
Sebagai contoh:
File yang berisi kelas SomeSuperClass perlu diberi nama somesuperclass.php, ini adalah gotcha saat menggunakan sistem file yang peka huruf besar kecil seperti Linux, jika file Anda bernama SomeSuperClass.php tetapi bukan masalah di Windows.
Penggunaan __autoload dalam kode Anda mungkin masih berfungsi dengan versi PHP saat ini, tetapi fitur ini diharapkan tidak digunakan lagi dan akhirnya dihapus di masa mendatang.
Jadi pilihan apa yang tersisa:
Versi ini akan bekerja dengan PHP 5.3 ke atas dan memungkinkan nama file SomeSuperClass.php dan somesuperclass.php. Jika Anda menggunakan 5.3.2 dan yang lebih baru, pemuat otomatis ini akan bekerja lebih cepat.
sumber
str_replace ([ '_','\\'] '/', $className );
dua kali lebih cepat dari dua str_replaceSaya baru-baru ini menemukan jawaban tanerkuc sangat membantu! Hanya ingin menambahkan bahwa menggunakan
strrpos()
+substr()
sedikit lebih cepat dariexplode()
+end()
:sumber
Saya akan memberikan dua sen saya untuk pemula relatif atau yang tidak menginginkan pengaturan spl_autoload_register () sederhana tanpa semua teori: Cukup buat satu file php untuk setiap kelas, beri nama file php itu sama dengan nama kelas Anda, dan simpan file kelas Anda di direktori yang sama dengan file php Anda yang dimaksud, maka ini akan berfungsi:
Googling bagian di dalam fungsi ini harus menjawab cara kerjanya. PS: Saya menggunakan Linux, dan ini berfungsi di Linux. Orang-orang Windows harus mengujinya terlebih dahulu.
sumber
https://thomashunter.name/blog/simple-php-namespace-friendly-autoloader-class/
Anda akan ingin meletakkan file kelas Anda ke dalam folder bernama
Classes
, yang ada di direktori yang sama dengan titik masuk ke aplikasi PHP Anda. Jika kelas menggunakan ruang nama, ruang nama akan diubah menjadi struktur direktori.Tidak seperti banyak pemuat otomatis lainnya, garis bawah tidak akan diubah menjadi struktur direktori (sulit untuk melakukan PHP <5.3 pseudo namespaces bersama dengan PHP> = 5.3 ruang nama asli).
Anda akan ingin menempatkan kode berikut ke dalam skrip PHP utama Anda (titik masuk):
Berikut adalah contoh tata letak direktori:
sumber
sumber