Php da nom maydonidan foydalanishga misollar. PHP-dagi nom maydonlari tushuntirildi. Nomlar bo'shliqlari: bir nechta tavsif doiralari

Men yaqinda loyihamni nomlar maydoniga kiritdim va tegishli hujjatlar yo'qligi muammosiga duch keldim. Biz topishga muvaffaq bo'lgan hamma narsa taxminan 2009 yilga to'g'ri keladi va bu deyarli 2012 yil ... Topilgan materialda php ning joriy versiyasida bo'lmagan narsadan foydalanadigan juda ko'p ishlamaydigan joylar mavjud. Shu munosabat bilan men ushbu masalaga biroz oydinlik kiritmoqchiman.
Xo'sh, nom maydoni yoki nom maydoni nima? Buyuk Vikipediya ularni quyidagicha belgilaydi:

Nomlar maydoni - to'plam bo'lib, u noyob identifikatorlarni (ya'ni nomlarni) mantiqiy guruhlash uchun yaratilgan model, mavhum saqlash yoki muhitni anglatadi. Nomlar maydonida aniqlangan identifikator ushbu nom maydoni bilan bog'langan. Xuddi shu identifikator bir nechta bo'shliqlarda mustaqil ravishda belgilanishi mumkin. Shunday qilib, bitta nom maydonida aniqlangan identifikator bilan bog'langan qiymat boshqa nom maydonida aniqlangan bir xil identifikator bilan bir xil (yoki boshqacha) ma'noga ega bo'lishi mumkin (yoki bo'lmasligi mumkin). Nomlar maydonidan xabardor tillar identifikator qaysi nom maydoniga tegishli ekanligini ko'rsatadigan qoidalarni belgilaydi (ya'ni uning ta'rifi).wiki

Hammasi tushunarli? Bu aslida oddiy. 5.3 versiyasidan oldin php-da faqat ikkita bo'sh joy mavjud edi - global (asosiy kodingiz bajarilgan) va mahalliy (funktsiya o'zgaruvchilari aniqlangan).

5.3 versiyasidan beri hamma narsa o'zgardi. Endi siz sinflaringiz, usullaringiz va boshqalar mavjud bo'lgan nomlar maydonini belgilashingiz mumkin.


Umid qilamanki, bu biroz aniqroq bo'ldi.

Men alohida sinflarni bir xil nomladim. Ular turli bo'shliqlarda aniqlanganligi sababli, ular bir xil nomlarga qaramay, ikki xil sinfdir. Asosiy skript hali ham global makonda ishlaydi, bu erda hech narsa o'zgarmadi va unda sinflar va funktsiyalarni aniqlash mumkin. Xo'sh, bo'sh joylar nima uchun? Avvalo, biror ramka yoki kutubxonaga ega faylni qo'shsangiz, sinflaringiz ramka sinflarini bekor qilmasligiga yoki aksincha.

Nomlar maydonida belgilangan sinflardan foydalanish uchun siz o'zingiz belgilagan joyni global bo'shliqqa to'g'ri joyda import qilishingiz kerak (men buni odatda fayl boshida qilishni afzal ko'raman). Buning uchun use kalit so'zidan foydalaning.

Diqqat: negadir php kalit so'zdan foydalanishga ruxsat bermaydi foydalanish shartli bloklar va halqalarda

Keling, rasmlardan misol olib, uni kodda amalga oshiramiz:

Diqqat: namespace kalit so'zi faylning eng boshida, darhol keyin joylashgan bo'lishi kerak
fayl A.php
B.php fayli
Muqobil sintaksis mumkin:
Har bir nom maydonini alohida faylda e'lon qilish tavsiya etiladi. Birida mumkin bo'lsa-da, bu qat'iyan tavsiya etilmaydi!
Endi bizning asosiy skriptimiz ishlaydigan uchinchi faylga o'tamiz
index.php
Ko'rinishidan, bu afzallik, faqat ko'proq kod qo'shiladi, lekin bu mutlaqo to'g'ri emas, birozdan keyin men avtomatik yuklash sinfiga misol keltiraman, bunda fayllarni sinflar bilan bog'laydigan chiziqlar keraksiz bo'ladi.
Endi darslarimizni ko'rib chiqaylik.

Diqqat: php nom maydonlarida qamrovni aniqlash operatori (::) yordamida ruxsat berilmagan! U mos keladigan yagona narsa statik sinf usullari va konstantalariga kirishdir. Avvaliga ular uni nom maydoni uchun ishlatmoqchi bo'lishdi, ammo keyin paydo bo'lgan muammolar tufayli ular bundan voz kechishdi. Shuning uchun, A::A::say(); kabi konstruksiya. noto'g'ri va xatolikka olib keladi.

Nom bo'shliqlari uchun "\" teskari chiziq belgisidan foydalanish kerak.
Diqqat: Tushunmovchiliklarga yo'l qo'ymaslik uchun satrlarda ishlatilganda ushbu belgidan qochish kerak: "\\"

Nom maydonlari bir-birining ichiga joylashtirilishi mumkin, keling, A.php faylimizga qo'shamiz:
va indeksda biz quyidagilarni yozamiz:

Muhim nuqta - import qilingan bo'shliqlar uchun taxalluslardan foydalanish. A\subA::say(); ni yozishingiz mumkin. Har safar bo'shliqlarga to'liq yo'llarni yozish qiyinligiga rozi bo'lasiz, buning oldini olish uchun taxalluslar kiritilgan. Kompilyatsiya qilishda quyidagilar sodir bo'ladi: sub taxallus o'rniga A\subA almashtiriladi, shuning uchun biz A\subA::say();

Global makonda aniqlangan funktsiyalarni chaqirganda nima bo'ladi? PHP avval siz hozir ishlayotgan makon ichida funktsiyani qidiradi va agar topmasa, u global miqyosga o'tadi. Global funksiyadan foydalanayotganingizni darhol ko'rsatish uchun uning oldiga teskari chiziq qo'yishingiz kerak.

Bo'shliqlardan sinflarni avtomatik yuklash bilan bog'liq muammolarni oldini olish uchun fayl tizimi bo'shliqlarni tashkil qilish kabi tashkil etilishi kerak. Misol uchun, bizda ildiz papkasi mavjud bo'lib, u erda bizning sinflarimiz saqlanadi, keyin bizning bo'shliqlarimiz quyidagicha tashkil etilishi mumkin
classes\A\A.php
classes\A\sub\A.php (pastki bo'shliq alohida faylga joylashtiriladi)
classes\B\B.php

PHP __NAMESPACE__ sehrli konstantaga ega bo'lib, u joriy maydon nomini o'z ichiga oladi.

Va endi avtomatik yuklash haqida.

Quyidagi sinf meniki emas, men uni ishga tushirdim va biroz yaxshiladim, shu yerdan olingan.
Diqqat: Sinflaringiz yuklanishi uchun sinf nomi fayl nomiga mos kelishi kerak!

".$fayl ." in " .$filepath)); if (file_exists($filepath)) ( if(Autoloader::debug) Autoloader::StPutFile(("ulangan" .$filepath)); $flag = FALSE; require_once($filepath); break; ) Autoloader::recursive_autoload($file, $path2, &$flag); ) ) closedir($handle); ) ) StPutFile($data) xususiy statik funksiyasi ( $dir = $_SERVER["DOCUMENT_ROOT"] ." /Log/Log.html"; $file = fopen($dir, "a"); flock($file, LOCK_EX); fwrite($file, ("║" .$data ."=>" .date(" d.m.Y H:i:s")".

" .PHP_EOL)); flock($file, LOCK_UN); fclose ($file); ) ) \spl_autoload_register("yourNameSpace\Autoloader::autoloader"); )
Agar siz yuklash uchun kiradigan sinflarning nomlariga qarasangiz, har bir sinfdan oldin foydalanishda ko'rsatilgan nomlar maydonidan prefiks borligini ko'rasiz. Shuning uchun men nomlar maydoniga o'xshash kataloglarda fayllarning joylashuvidan foydalanishni maslahat beraman; bu qidiruvni bir yoki ikkita iteratsiyaga tezlashtiradi.

Endi bizning indeksimiz quyidagicha yozilishi mumkin:
Endi siz foydalanadigan barcha sinflar va interfeyslar avtomatik ravishda yuklanadi.

Tilning ba'zi dinamik imkoniyatlarini bo'shliqlar bilan namoyish qilish uchun keling, boshqa sinfni e'lon qilaylik:
test.php

Index.php
sayName("test"); //yoki bu testni bajarishingiz mumkin\sayName("test2"); //yoki shunga o'xshash $obj::sayName("test"); //yoki bu testni bajarishingiz mumkin::sayName("test2");

Umid qilamanki, mening maqolam kimgadir foydali bo'ladi.

PHP 5.3 versiyasidan boshlab bizga nom maydonlarini berdi. O'shandan beri bu nom maydonidan qanday foydalanish haqida biroz sust va qizg'in munozaralar bo'ldi?
Ba'zi ramkalar, masalan, Symphony, Laravel va, albatta, Zend, bu texnologiyani qabul qildi.
Bularning barchasi MVC sxemasiga ko'proq yoki kamroq mos keladi. Bitta, ehtimol, abadiy munozara mavjud: ilovaning asosiy nikoh juftligi nima bo'lishi kerak - Model va Nazoratchi?
Ba'zilar bizga Model baquvvat va semiz bo'lishi va u bilan nozik va nozik Controller bo'lishi kerakligini aytadi. Bir so'z bilan aytganda - matriarxat.
Boshqalar, aksincha, Nazoratchi hamma narsani boshqarishi va boshqarishi kerak, deb hisoblashadi, shuning uchun u mustahkam va to'yingan bo'lib chiqadi. Va u bilan birga nozik, nozik Model bor, uning vazifasi berish va olib kelishdir. Bu patriarxat.
Xo'sh, MVC sxemasida qaysi biri yaxshiroq? Patriarxatmi yoki matriarxatmi?
Keling, buni demokratiyaga asoslangan oila qurish nuqtai nazaridan ko'rib chiqaylik. Bunda bizga Namespace yordam bersin.

Bizga chinni do'konidagi buqa kabi, ehtiyotsiz bo'lsangiz, butun ilovani ezib tashlashi mumkin bo'lgan qalin, tirishqoq Controllers yoqmaydi.
Bizga semiz modellar ham yoqmaydi. Xo'sh, ularni kim yoqtiradi? Ular podiumga munosib bo'lishlari kerak!
Keling, Namespace yordamida, xuddi yaxshi o'yinchi kabi, uyg'un oila yaratishga harakat qilaylik.

Birinchidan, dastur skeletini yaratamiz. Qanchalik oddiy bo'lmasin, blog bo'lsin.

Biz asosiy tuzilmani yaratdik, bu erda:

  • Blog bizning ilovamizni saqlash joyidir;
  • Views and Templates - ko'rinishlar va shablonlarni saqlash;
  • Utility - umumiy kutubxonalar ombori;
  • index.php - yuklash skripti;
  • Post - bu erda Controller va Modelning oilaviy idili sodir bo'lishi kerak.

index.php bilan hamma narsa oddiy:

ishga tushirish(); /* * index.php oxiri */

Biz kerakli yo'llarni aniqlaymiz va autoloader yaratamiz.
Avtomatik yuklovchi kerakli sinflarni yuklaydi, ular sinf nomlari maydoniga muvofiq papka ierarxiyasida joylashgan. Masalan, BlogPostServicesView klassi Blog/Post/Xizmatlarda qidiriladi.
Mana, Namespace bilan birinchi uchrashuv.
index.php ni ishga tushirganimizda biz Blog ilovasining namunasini yaratamiz, uning sinfi Blog/Blog.php dan yuklanadi.
Keling, unga qaraylik.

post = yangi xabar(); ) umumiy funktsiya run() ( $this->post->view->all(); ) )//end class Blog

Blog sinfini yaratishda biz unga Namespace BlogPost bilan Post sinfini kiritamiz va autoloader uni Blog/Post/Post.php dan yuklaydi.
Ehtimol, bu sinfni Controller deb atash mumkin,

view = new View(); ) )//klassni yakunlash Post

Pochta ob'ekti quyidagilarni o'z ichiga oladi:
- ma'lumotlar yozuvining o'zi tuzilishi - BlogPostEntitiesPostEntity.php

Controller so'rovlariga xizmat qiluvchi xizmatlar - BlogPostServicesView.php (masalan, xizmatlardan biri)

db = yangi DB(); )//end __construct public function all() ( $posts = $this->db->survey(); Contemplate::compose(array("header" => "header", "main" => "main", "footer" => "footer",), array("posts" => $posts, "title" => "Viper sayti",)); ) )//end class PostView

Ma'lumotlar bazasi bilan o'zaro ta'sir qilish tizimi - BlogPostRepositoriesDB.php - bu bizning nozik, oqlangan Modelimiz,
Faqat bering, olib keling va boshqa hech narsa yo'q!

dbh = new PDO("mysql:host=localhost;dbname=test", $user, $pass, array(PDO::ATTR_PERSISTENT => true)); ) catch (PDOException $e) ( echo "Xato!: " . $e->getMessage() ”.
"; die(); ) )//end __construct public function survey() ( $query_view = $this->dbh->prepare("SELECT * from posts"); $query_view->execute(); return $query_view- >fetchAll(PDO::FETCH_CLASS, "BlogPostEntitiesPostEntity"); )//so'rovni yakunlash )//Db sinfini tugatish

Natijada, biz barcha komponentlar yaxshi bog'langan dastur tuzilmasini yaratishga muvaffaq bo'ldik, shu bilan birga biz sinflarni aniq ajratishga erishdik, bu erda har bir sinf o'z vazifasini bajaradi. Bizning kontrollerimiz nozik va ayni paytda kuchli. Model unga mos keladi. Mukammal oila!
Va hammasi Namespace uchun rahmat.

Men bahslashmayman, ko'p hollarda ramka qulay. Ammo qarang, Namespace sizga hech narsani eslatmaydimi?
Sinflarga aniq bo'linish, qat'iy va ayni paytda qat'iy va moslashuvchan ierarxiya kataloglari va sinflari ishlab chiquvchiga to'liq bo'ysunadi.
Ba'zan yuzlab fayllar va ramkalar ko'rinishidagi sinflar ko'rinishida bunday muhim qo'shimchalar mavjud emas.
Sinflar va komponentlarning o'zaro ta'siri uchun Procrustean qoidalarining yo'qligi.

Maqola Laravel ramkasining muallifi Teylor Otvellning ushbu mavzu bo'yicha fikrlaridan ilhomlangan, buning uchun unga katta rahmat.
GitHub-dagi misol manba kodining manzili.

Salom. Bugungi maqolada biz ko'rib chiqamiz, PHP da nom maydonlari nima.

Agar siz undan uzoq vaqt foydalansangiz OOP, keyin siz uchinchi tomon kutubxonasini ulashda siz allaqachon kutubxonadagi kabi kodingizda bir xil sinf nomlaridan foydalanayotganingiz sababli muvaffaqiyatsizlikka uchragan vaziyatga duch kelgansiz. Bu, ayniqsa, kabi umumiy nomlardan foydalansangiz sodir bo'lishi mumkin "model", "db" va h.k. Buni qanday tuzatish kerakligini hozir aytaman.

Nom maydoni- bu noyob identifikatorlarni (nomlarni) mavhum guruhlash uchun yaratilgan saqlashning bir turi.

Bular. foydalansangiz nom maydonlari, keyin siz uchinchi tomon kutubxonalarini xavfsiz ulashingiz mumkin va ular sizning kodingizdagi kabi nomlarga ega bo'lishidan qo'rqmang. Keling, nazariyani tugatamiz va amaliyotga o'tamiz.

Keling, fayl yarataylik myclass.php ushbu tarkib bilan

nomlar maydoni my\oneProject;
sinf MyClass ()
?>

Bu erda biz nomlar maydonida sinf yaratdik mening\oneLoyiham. Aytgancha, siz aniq teskari chiziqni yozishingiz kerak. Adashib qolmang!

Endi faylda index.php quyidagini yozamiz

require_once("myclass.php");
$mc = yangi MyClass(); // Xato: sinf topilmadi
$mc = yangi my\oneProject\MyClass(); // hammasi ishlaydi
?>

Ko'rib turganingizdek, endi bunday sinf yaratish mumkin emas, siz qaysi birini belgilashingiz kerak nom maydoni u yotibdi.

Biz bir vaqtning o'zida bir nechtasini belgilashimiz mumkin nom maydonlari bitta faylda

nom maydoni loyihasi;

Const CONNECT_OK = 1;
sinf ulanishi ( )
ulanish funktsiyasi () ( )

NamespaceAnotherProject;

Const CONNECT_OK = 1;
sinf ulanishi ( )
ulanish funktsiyasi () ( )
?>

Bizda sinflar, funktsiyalar va konstantalarning mutlaqo bir xil nomlari mavjud bo'lsa-da, bizda nomlar to'qnashuvi bo'lmaydi, chunki ular turli bo'shliqlarda yotadi.

Qavs sintaksisidan ham foydalanishimiz mumkin.

nom maydoni loyihasi (

Const CONNECT_OK = 1;
sinf ulanishi ( )
ulanish funktsiyasi () ( )
}

Namespace AnotherProject (

Const CONNECT_OK = 1;
sinf ulanishi ( )
ulanish funktsiyasi () ( )
}
?>

Agar siz kodni birlashtirsangiz global nom maydoni boshqa bo'shliqlarda kod bilan, keyin faqat qavslar bilan sintaksis ishlatiladi.

nom maydoni loyihasi (

Const CONNECT_OK = 1;
sinf ulanishi ( )
ulanish funktsiyasi () ( )
}

Nomlar maydoni ( // global kod
session_start();
$a = Loyiha\connect();
echo Project\Connection::start();
}
?>

Bundan tashqari, nom maydonini belgilash har doim kodning birinchi qatori bo'lishi kerakligini unutmang. Agar shunday yozsangiz xato bo'ladi

Qaysi nom maydonida ekanligingizni bilish uchun siz doimiydan foydalanishingiz mumkin __NAMESPACE__

nom maydoni loyihasi;
echo """, __NAMESPACE__, """; // "Loyiha" ni chop etadi
?>

Ushbu konstantadan foydalanib, masalan, nomlarni dinamik ravishda qurishingiz mumkin

nom maydoni loyihasi;

Funktsiya, shu jumladan($classname) (
$a = __NAMESPACE__ . "\\". $sinf nomi;
yangi $a qaytarish;
}
?>

Demak, bugun hammasi shu. Kursni o'tash orqali ko'proq ma'lumot va amaliy bilim olishingiz mumkin

Men yaqinda loyihamni nomlar maydoniga kiritdim va tegishli hujjatlar yo'qligi muammosiga duch keldim. Biz topishga muvaffaq bo'lgan hamma narsa taxminan 2009 yilga to'g'ri keladi va bu deyarli 2012 yil ... Topilgan materialda php ning joriy versiyasida bo'lmagan narsadan foydalanadigan juda ko'p ishlamaydigan joylar mavjud. Shu munosabat bilan men ushbu masalaga biroz oydinlik kiritmoqchiman.
Xo'sh, nom maydoni yoki nom maydoni nima? Buyuk Vikipediya ularni quyidagicha belgilaydi:

Nomlar maydoni - to'plam bo'lib, u noyob identifikatorlarni (ya'ni nomlarni) mantiqiy guruhlash uchun yaratilgan model, mavhum saqlash yoki muhitni anglatadi. Nomlar maydonida aniqlangan identifikator ushbu nom maydoni bilan bog'langan. Xuddi shu identifikator bir nechta bo'shliqlarda mustaqil ravishda belgilanishi mumkin. Shunday qilib, bitta nom maydonida aniqlangan identifikator bilan bog'langan qiymat boshqa nom maydonida aniqlangan bir xil identifikator bilan bir xil (yoki boshqacha) ma'noga ega bo'lishi mumkin (yoki bo'lmasligi mumkin). Nomlar maydonidan xabardor tillar identifikator qaysi nom maydoniga tegishli ekanligini ko'rsatadigan qoidalarni belgilaydi (ya'ni uning ta'rifi).wiki

Hammasi tushunarli? Bu aslida oddiy. 5.3 versiyasidan oldin php-da faqat ikkita bo'sh joy mavjud edi - global (asosiy kodingiz bajarilgan) va mahalliy (funktsiya o'zgaruvchilari aniqlangan).

5.3 versiyasidan beri hamma narsa o'zgardi. Endi siz sinflaringiz, usullaringiz va boshqalar mavjud bo'lgan nomlar maydonini belgilashingiz mumkin.


Umid qilamanki, bu biroz aniqroq bo'ldi.

Men alohida sinflarni bir xil nomladim. Ular turli bo'shliqlarda aniqlanganligi sababli, ular bir xil nomlarga qaramay, ikki xil sinfdir. Asosiy skript hali ham global makonda ishlaydi, bu erda hech narsa o'zgarmadi va unda sinflar va funktsiyalarni aniqlash mumkin. Xo'sh, bo'sh joylar nima uchun? Avvalo, biror ramka yoki kutubxonaga ega faylni qo'shsangiz, sinflaringiz ramka sinflarini bekor qilmasligiga yoki aksincha.

Nomlar maydonida belgilangan sinflardan foydalanish uchun siz o'zingiz belgilagan joyni global bo'shliqqa to'g'ri joyda import qilishingiz kerak (men buni odatda fayl boshida qilishni afzal ko'raman). Buning uchun use kalit so'zidan foydalaning.

Diqqat: negadir php kalit so'zdan foydalanishga ruxsat bermaydi foydalanish shartli bloklar va halqalarda

Keling, rasmlardan misol olib, uni kodda amalga oshiramiz:

Diqqat: namespace kalit so'zi faylning eng boshida, darhol keyin joylashgan bo'lishi kerak
fayl A.php
B.php fayli
Muqobil sintaksis mumkin:
Har bir nom maydonini alohida faylda e'lon qilish tavsiya etiladi. Birida mumkin bo'lsa-da, bu qat'iyan tavsiya etilmaydi!
Endi bizning asosiy skriptimiz ishlaydigan uchinchi faylga o'tamiz
index.php
Ko'rinishidan, bu afzallik, faqat ko'proq kod qo'shiladi, lekin bu mutlaqo to'g'ri emas, birozdan keyin men avtomatik yuklash sinfiga misol keltiraman, bunda fayllarni sinflar bilan bog'laydigan chiziqlar keraksiz bo'ladi.
Endi darslarimizni ko'rib chiqaylik.

Diqqat: php nom maydonlarida qamrovni aniqlash operatori (::) yordamida ruxsat berilmagan! U mos keladigan yagona narsa statik sinf usullari va konstantalariga kirishdir. Avvaliga ular uni nom maydoni uchun ishlatmoqchi bo'lishdi, ammo keyin paydo bo'lgan muammolar tufayli ular bundan voz kechishdi. Shuning uchun, A::A::say(); kabi konstruksiya. noto'g'ri va xatolikka olib keladi.

Nom bo'shliqlari uchun "\" teskari chiziq belgisidan foydalanish kerak.
Diqqat: Tushunmovchiliklarga yo'l qo'ymaslik uchun satrlarda ishlatilganda ushbu belgidan qochish kerak: "\\"

Nom maydonlari bir-birining ichiga joylashtirilishi mumkin, keling, A.php faylimizga qo'shamiz:
va indeksda biz quyidagilarni yozamiz:

Muhim nuqta - import qilingan bo'shliqlar uchun taxalluslardan foydalanish. A\subA::say(); ni yozishingiz mumkin. Har safar bo'shliqlarga to'liq yo'llarni yozish qiyinligiga rozi bo'lasiz, buning oldini olish uchun taxalluslar kiritilgan. Kompilyatsiya qilishda quyidagilar sodir bo'ladi: sub taxallus o'rniga A\subA almashtiriladi, shuning uchun biz A\subA::say();

Global makonda aniqlangan funktsiyalarni chaqirganda nima bo'ladi? PHP avval siz hozir ishlayotgan makon ichida funktsiyani qidiradi va agar topmasa, u global miqyosga o'tadi. Global funksiyadan foydalanayotganingizni darhol ko'rsatish uchun uning oldiga teskari chiziq qo'yishingiz kerak.

Bo'shliqlardan sinflarni avtomatik yuklash bilan bog'liq muammolarni oldini olish uchun fayl tizimi bo'shliqlarni tashkil qilish kabi tashkil etilishi kerak. Misol uchun, bizda ildiz papkasi mavjud bo'lib, u erda bizning sinflarimiz saqlanadi, keyin bizning bo'shliqlarimiz quyidagicha tashkil etilishi mumkin
classes\A\A.php
classes\A\sub\A.php (pastki bo'shliq alohida faylga joylashtiriladi)
classes\B\B.php

PHP __NAMESPACE__ sehrli konstantaga ega bo'lib, u joriy maydon nomini o'z ichiga oladi.

Va endi avtomatik yuklash haqida.

Quyidagi sinf meniki emas, men uni ishga tushirdim va biroz yaxshiladim, shu yerdan olingan.
Diqqat: Sinflaringiz yuklanishi uchun sinf nomi fayl nomiga mos kelishi kerak!

".$fayl ." in " .$filepath)); if (file_exists($filepath)) ( if(Autoloader::debug) Autoloader::StPutFile(("ulangan" .$filepath)); $flag = FALSE; require_once($filepath); break; ) Autoloader::recursive_autoload($file, $path2, &$flag); ) ) closedir($handle); ) ) StPutFile($data) xususiy statik funksiyasi ( $dir = $_SERVER["DOCUMENT_ROOT"] ." /Log/Log.html"; $file = fopen($dir, "a"); flock($file, LOCK_EX); fwrite($file, ("║" .$data ."=>" .date(" d.m.Y H:i:s")".

" .PHP_EOL)); flock($file, LOCK_UN); fclose ($file); ) ) \spl_autoload_register("yourNameSpace\Autoloader::autoloader"); )
Agar siz yuklash uchun kiradigan sinflarning nomlariga qarasangiz, har bir sinfdan oldin foydalanishda ko'rsatilgan nomlar maydonidan prefiks borligini ko'rasiz. Shuning uchun men nomlar maydoniga o'xshash kataloglarda fayllarning joylashuvidan foydalanishni maslahat beraman; bu qidiruvni bir yoki ikkita iteratsiyaga tezlashtiradi.

Endi bizning indeksimiz quyidagicha yozilishi mumkin:
Endi siz foydalanadigan barcha sinflar va interfeyslar avtomatik ravishda yuklanadi.

Tilning ba'zi dinamik imkoniyatlarini bo'shliqlar bilan namoyish qilish uchun keling, boshqa sinfni e'lon qilaylik:
test.php

Index.php
sayName("test"); //yoki bu testni bajarishingiz mumkin\sayName("test2"); //yoki shunga o'xshash $obj::sayName("test"); //yoki bu testni bajarishingiz mumkin::sayName("test2");

Umid qilamanki, mening maqolam kimgadir foydali bo'ladi.

(PHP 5 >= 5.3.0, PHP 7)

Nom maydonlaridan foydalanishni muhokama qilishdan oldin, PHP sizning kodingiz so'ralayotgan nomlar maydoni elementini qanday bilishini tushunish muhimdir. PHP nom maydonlari va fayl tizimi o'rtasida oddiy o'xshashlik qilish mumkin. Fayl tizimidagi faylga kirishning uchta usuli mavjud:

  1. Nisbiy fayl nomi kabi foo.txt. Bu hal qiladi currentdirectory/foo.txt bu erda currentdirectory hozirda band bo'lgan katalogdir. Shunday qilib, agar joriy katalog bo'lsa /home/foo, nomi hal qiladi /home/foo/foo.txt.
  2. Nisbiy yo'l nomi kabi subdirectory/foo.txt. Bu hal qiladi currentdirectory/subdirectory/foo.txt.
  3. Mutlaq yo'l nomi kabi /main/foo.txt. Bu hal qiladi /main/foo.txt.
Xuddi shu tamoyil PHP da nom maydoni elementlariga nisbatan qo'llanilishi mumkin. Masalan, sinf nomini uchta usulda ko'rsatish mumkin:
  1. Noma'lum nom yoki prefikssiz sinf nomi kabi $a = new foo(); yoki foo::staticmethod(); joriy nomlar maydoni, bu hal qiladi currentnamespace\foo foo. Bitta ogohlantirish: agar nom maydoni funksiyasi yoki doimiysi aniqlanmagan bo'lsa, funktsiyalar va konstantalar uchun noaniq nomlar global funktsiyalar va konstantalarga o'tadi. Tafsilotlar uchun nomlar boʻshliqlaridan foydalanish: global funktsiyaga qaytish/doimiy boʻlimga qarang.
  2. Malakali nom yoki oldingi sinf nomi kabi $a = yangi subnamespace\foo(); yoki subnamespace\foo::staticmethod();. Agar joriy nom maydoni bo'lsa joriy nomlar maydoni, bu hal qiladi currentnamespace\subnamespace\foo. Agar kod global, nom bo'shlig'i bo'lmagan kod bo'lsa, bu hal qilinadi subnamespace\foo.
  3. To'liq malakali nom yoki global prefiks operatori kabi prefiksli nom $a = new \currentnamespace\foo(); yoki \currentnamespace\foo::staticmethod();. Bu har doim kodda ko'rsatilgan so'zma-so'z nomini hal qiladi, currentnamespace\foo.

Haqiqiy koddagi sintaksisning uchta turiga misol:

nomlar maydoni Foo\Bar\subnamespace;

const FOO = 1;
foo()() funktsiyasi
sinf foo
{
}
?>

nom maydoni Foo\Bar;
"file1.php" ni o'z ichiga oladi;

const FOO = 2;
foo()() funktsiyasi
sinf foo
{
statik funktsiya staticmethod()()
}

/* Noma’lum ism */
foo(); foo::staticmethod(); echo FOO;

/* Malakali ism */
subnamespace\foo(); // Foo\Bar\subnamespace\foo funktsiyasini hal qiladi
subnamespace\foo::staticmethod(); // Foo\Bar\subnamespace\foo sinfini hal qiladi,
// statik usul
echo subnamespace\FOO; // doimiy Foo\Bar\subnamespace\FOO ni hal qiladi

/* To'liq ism */
\foo\bar\foo(); // Foo\Bar\foo funktsiyasini hal qiladi
\foo\bar\foo::staticmethod(); // Foo\Bar\foo sinfiga hal qiladi, staticmethod usuli
echo \ Foo \ Bar \ FOO; // doimiy Foo\Bar\FOO ga hal qiladi
?>

E'tibor bering, har qanday global sinfga, funksiyaga yoki doimiyga kirish uchun to'liq malakali nomdan foydalanish mumkin, masalan \strlen() yoki \ Istisno yoki \INI_ALL. ?>