com_content şablonunun strukturunun təsviri. Foreach($item as &$item) Kataloqlarda və şablon fayllarında tələ

Bir çox insanlar bu və ya digər formada bu cür konstruksiyalar yazmağı sevirlər, hər kəs rastlaşdı:
foreach ($item kimi &$item) ( $item += 2; )
Ancaq çox adam burada gizlənən təhlükədən şübhələnmir.
Bir nümunəyə baxaq.

Vasya Pupkin massivi götürdü, oradan keçdi, bütün elementləri iki artırdı:
$elementlər = massiv("a" => 10, "b" => 20, "c" => 30,); foreach ($elementlər &$element kimi) ( $element += 2; ) print_r($items);
Zibilliyə baxdım, problemin həll olunduğunu gördüm və razı qaldım:
Massiv ([a] => 12 [b] => 22 [c] => 32)
Bir müddət sonra Petroviç kodun bu hissəsini başqa bir axtarışla əlavə etmək qərarına gəldi və aşağıdakıları əlavə etdi:
$newitems = massiv("a" => 10, "b" => 20, "c" => 30,); foreach ($newitems $key=>$element kimi) ( $newitems[$key] += 5; ) print_r($newitems);
Gördü ki, tapşırığı da həll olundu və işini başa çatdırmaq hissi ilə dosyeni bağladı:
Massiv ([a] => 15 [b] => 25 [c] => 35)
Bir müddət sonra izah olunmayan səhvlər görünməyə başladı. Niyə?
Kodun sonunda var_dump($items) edək:
massiv(3) (["a"]=> int(12) ["b"]=> int(22) ["c"]=> &int(30) )
otuz! Vasya Pupkin yoxladığını and içir. Niyə 32 idi və Petroviç kodundan sonra 30?

Səbəb ampersanddadır. O, başqasının işarələnmiş məlumatlara istinad etdiyini bildirir. Ayrılarkən Vasya kobud güc tətbiq etdiyi müvəqqəti dəyişkənliyi ($item) arxasından silmədi. Dəyişən mənbənin dəyişdirilməsi icazəsi ("&") ilə istifadə edilib, həmçinin "istinadla təyinat" da deyilir. O, əmin idi ki, dəyişən yalnız loop daxilində istifadə olunacaq. Petroviç axtarış zamanı eyni adlı dəyişəndən istifadə edərək onun dəyərini dəyişdi və hər dəfə bu dəyişənin saxlandığı yer dəyişdi. Və o, Pupkin massivinin sonuncu elementi ilə eyni yerdə saxlanıldı.

Təbii ki, məqalədəki hal şişirdilmişdir. Təcrübədə, bu cür əlaqələr çox mürəkkəb ola bilər, xüsusən də layihə aşağı qiymətlidirsə və kifayət qədər təcrübəli və səpələnmiş veb tərtibatçıları cəlb edirsə.

Bununla necə məşğul ola bilərsiniz?

  • İstifadədən sonra müvəqqəti dəyişənləri məhv edin, xüsusən də onların istifadə olunan məlumatlarla əlaqəsi varsa:
    foreach ($item kimi &$item) $element += 2; təyin edilmədi($element);
  • Artıq kimsə tərəfindən istifadə edilmiş dəyişənlərlə diqqətli olun.
  • Fəaliyyətlərinizi ayrı funksiyalara, metodlara və ya ad boşluqlarına daxil edin.
  • print_r əvəzinə var_dump istifadə edin və işarəyə diqqət yetirin. Brauzerə deyil, fayla köçürmək üçün print_r($var,true) üçün alternativ bu konstruksiya olardı:
    funksiya dump() ( ob_start(); foreach(func_get_args() $var kimi) var_dump($var); qaytar ob_get_clean(); )
Sonda deyim ki, linklərlə bağlı səhvlər təkcə foreach-da deyil. Və onların hamısı bir anda müzakirə edildi. Ancaq təcrübəmə əsasən, bu iş praktikada o qədər geniş yayılmışdır ki, xüsusi diqqətə layiqdir.

Siz CMS Joomla ilə işləyən vebsayt yaradırsınız və təbliğ edirsiniz və birdən com_content komponentinin standart şablonlarını redaktə edərək materialın dizaynını zövqünüzə uyğun və öz tərzinizlə yenidən düzəltməyə ehtiyacınız var? Komponent məzmun yaratmaq üçün məsuliyyət daşıyır. Komponentin özünün quruluşunu anlayaq.

Standart Material Şablon Yeri

Orijinal com_content komponent faylları komponentlər\com_content\views\View\tmpl qovluğunda yerləşir. Komponent faylları istifadə etdiyiniz \templates\template\html\com_content\ qovluğuna kopyalanırsa, material şablonu bu qovluqdakı fayllardan götürüləcək.

Kataloqlar və şablon faylları

Şablon yer qovluğunda görünüş yaratmaq üçün beş qovluq var.

arxiv qovluğu

  • Arxiv çıxış şablonu qovluğu. Bu məqalə müzakirə olunmur, nadir hallarda kimsə istifadə edir. Struktur aşağıda təsvir olunan qovluqlara bənzəyir;

məqalə qovluğu - Material

ön səhifə qovluğu - Əsas səhifə

  • default.php kateqoriya\blog.php ilə eyni prinsip;
  • default_item.php kateqoriya\blog_item.php ilə eyni prinsip;
  • default_links.php kateqoriya\blog_links.php ilə eyni prinsip;

qovluq bölməsi - Bölmə

  • blog.php Bölmə blog şablonu. kateqoriya\blog.php ilə eyni prinsip;
  • blog_item.php Bölmə bloqundan ayrıca material üçün şablon. kateqoriya\blog_item.php ilə eyni prinsip;
  • blog_links.php Bloq bölməsi altında keçidlərin təqdim edilməsi üçün şablon. kateqoriya\blog_links.php ilə eyni prinsip;
  • default.php Standart bölmə şablonu. Kateqoriya başlığını, onun təsvirini və elementlərin sayını göstərir. Kateqoriya başlığına kliklədikdən sonra səhifə kateqoriya\default.php tərəfindən işlənir;
Şablon redaktə nümunəsi. Materialın baxış sayını göstərir.

Deyək ki, biz kateqoriya bloqundan fərdi məqalənin baxış sayını göstərmək istəyirik. Bunun üçün kateqoriya\blog_item.php şablonunu redaktə edin. Xitlər haqqında məlumat daxil etmək üçün kod belə olacaq:

İndi siz kateqoriya\blog_item.php şablon faylında bu kodu daxil etmək üçün yeri tapmalısınız. Məsələn, materialın son redaktə olunduğu tarix göstərilməzdən əvvəl. Biz xətti axtarırıq:

Və ondan əvvəl kodu olan bir xətt daxil edirik.

Misal bir neçə sütunda kateqoriyaların siyahısını göstərir .

Bir çox ölümcül və bərpa edilə bilən ölümcül xətalar PHP 7-də istisnalara çevrilmişdir. Bu xəta istisnaları Atılan interfeysi həyata keçirən Error sinifindən miras alınır (yeni əsas interfeys bütün istisnalar miras qalır).

Bu o deməkdir ki, xüsusi xəta işləyiciləri artıq işə salınmaya bilər, çünki bunun əvəzinə istisnalar atıla bilər (tutulmamış Xəta istisnaları üçün yeni ölümcül xətalara səbəb olur).

PHP 7-də səhvlərin necə işlədiyinin daha dolğun təsvirini PHP 7 səhvləri səhifəsində tapa bilərsiniz. Bu miqrasiya bələdçisi sadəcə geriyə uyğunluğa təsir edən dəyişiklikləri sadalayacaq.

Daxili konstruktorlar həmişə uğursuzluq halında istisnalar qoyurlar

Əvvəllər bəzi daxili siniflər konstruktor uğursuz olduqda NULL və ya yararsız obyekti qaytarırdı. Bütün daxili siniflər artıq istifadəçi siniflərinin etməli olduğu şəkildə bu halda İstisna atacaq.

E_STRICT ciddilik dəyişikliklərini qeyd edir

Bütün E_STRICT bildirişləri digər səviyyələrə yenidən təsnifləşdirilib. E_STRICT sabiti saxlanılır, ona görə də zənglər bəyənilir xəta_hesabatı(E_ALL|E_STRICT) xətaya səbəb olmayacaq.

E_STRICT ciddilik dəyişikliklərini qeyd edir Vəziyyət Yeni səviyyə/davranış
Resurs tərəfindən indeksləşdirmə E_BİLDİRİŞ
Abstrakt statik üsullar
Konstruktorun "yenidən müəyyən edilməsi" Bildiriş silindi, heç bir səhvə səbəb olmur
Vərəsəlik zamanı imza uyğunsuzluğu E_XƏBƏRDARLIQ
İki istifadə olunan əlamətdə eyni (uyğun) xüsusiyyət Bildiriş silindi, heç bir səhvə səbəb olmur
Statik xüsusiyyətə qeyri-statik olaraq daxil olmaq E_BİLDİRİŞ
Yalnız dəyişənlər istinadla təyin edilməlidir E_BİLDİRİŞ
Yalnız dəyişənlər istinadla ötürülməlidir E_BİLDİRİŞ
Statik olmayan metodları statik olaraq çağırmaq E_QALDIRILIB
Dəyişənlərin idarə edilməsində dəyişikliklər

PHP 7 indi mənbə faylları təhlil edərkən abstrakt sintaksis ağacından istifadə edir. Bu, PHP-nin əvvəlki versiyalarında istifadə edilən təhlilçinin məhdudiyyətlərinə görə əvvəllər qeyri-mümkün olan dildə bir çox təkmilləşdirmələrə imkan verdi, lakin ardıcıllıq səbəbi ilə bir neçə xüsusi halın silinməsi ilə nəticələndi və bu, geriyə doğru uyğunluğun pozulması ilə nəticələndi. Bu hallar bu bölmədə ətraflı təsvir edilmişdir.

Dolayı dəyişənlərin, xassələrin və metodların idarə edilməsində dəyişikliklər

Dəyişənlərə, xassələrə və metodlara dolayı giriş indi xüsusi halların əvvəlki qarışığından fərqli olaraq, ciddi şəkildə soldan sağa ardıcıllıqla qiymətləndiriləcək. Aşağıdakı cədvəl qiymətləndirmə sırasının necə dəyişdiyini göstərir.

Dolayı ifadələrin köhnə və yeni qiymətləndirilməsi İfadə PHP 5 şərhi PHP 7 şərhi
$$foo["bar"]["baz"] $($foo["bar"]["baz"]) ($$foo)["bar"]["baz"]
$foo->$bar["baz"] $foo->($bar["baz"]) ($foo->$bar)["baz"]
$foo->$bar["baz"]() $foo->($bar["baz"])() ($foo->$bar)["baz"]()
Foo::$bar["baz"]() Foo::($bar["baz"])() (Foo::$bar)["baz"]()

Köhnə sağdan sola qiymətləndirmə sırasını istifadə edən kod bu qiymətləndirmə sırasını əyri mötərizələrlə açıq şəkildə istifadə etmək üçün yenidən yazılmalıdır (yuxarıdakı orta sütuna baxın). Bu, kodu həm PHP 7.x ilə irəli, həm də PHP 5.x ilə geriyə uyğun edəcək.

Fatal xəta: Tutulmamış Arifmetik Xəta: /tmp/test.php:2-də mənfi ədədə görə bit sürüşməsi: 2-ci sətirdə /tmp/test.php-də #0 (əsas) atılır

Aralıqdan kənar bit dəyişmələri

Tam ədədin bit genişliyindən kənara bitwise yerdəyişmələr (hər iki istiqamətdə) həmişə 0 ilə nəticələnəcək. Əvvəllər belə sürüşmələrin davranışı arxitekturadan asılı idi.

Sıfıra Bölməyə Dəyişikliklər

Əvvəllər bölmə (/) və ya modul (%) operatorları üçün bölən kimi 0 istifadə edildikdə, E_WARNING veriləcək və false qaytarılacaqdı. İndi bölmə operatoru IEEE 754 tərəfindən müəyyən edildiyi kimi +INF, -INF və ya NAN kimi float qaytarır. E_WARNING modul operatoru silinib və DivisionByZeroError istisnasını yaradacaq.

PHP 5-də yuxarıdakı nümunənin çıxışı:

Xəbərdarlıq: %s sətirində sıfıra bölmə %d bool(false) Xəbərdarlıq: %s sətirində sıfıra bölmə %d bool(false) Xəbərdarlıq: %s sətirində sıfıra bölmə %d bool(false)

PHP 7-də yuxarıdakı nümunənin çıxışı:

Xəbərdarlıq: %s sətirində sıfıra bölmə %d float(INF) Xəbərdarlıq: %s sətirində sıfıra bölmə %d float(NAN) PHP Fatal xəta: Tutulmamış DivisionByZeroError: %s sətirində sıfıra modul %d

\u( xətalara səbəb ola bilər

Yeni Unicode codepoint escape sintaksisinin əlavə edilməsi sayəsində hərfi məzmunlu sətirlər \u( sonra etibarsız ardıcıllıqla ölümcül xətaya səbəb olacaq. Bunun qarşısını almaq üçün qabaqcıl tərs xəttdən qaçmaq lazımdır.

Silinmiş funksiyalar Silinmiş INI direktivləri xsl.security_prefs

xsl.security_prefs direktivi silindi. Əvəzində hər bir prosessor əsasında təhlükəsizlik seçimlərinə nəzarət etmək üçün XsltProcessor::setSecurityPrefs() metodu çağırılmalıdır.

Digər geriyə uyğun olmayan dəyişikliklər Yeni obyektlər istinadla təyin edilə bilməz

Nəticəsi yeni ifadə artıq istinadla dəyişənə təyin edilə bilməz:

PHP 5-də yuxarıdakı nümunənin çıxışı:

Köhnəlmişdir: Yeni dəyərinin istinadla təyin edilməsi /tmp/test.php-də 3-cü sətirdə köhnəlmişdir.

PHP 7-də yuxarıdakı nümunənin çıxışı:

Təhlil xətası: sintaksis xətası, 3-cü sətirdə /tmp/test.php-də gözlənilməz "yeni" (T_NEW)

Yanlış sinif, interfeys və xüsusiyyət adları

Aşağıdakı adlar sinifləri, interfeysləri və ya xüsusiyyətləri adlandırmaq üçün istifadə edilə bilməz:

  • bool
  • int
  • sal
  • simli
  • SIFIR
  • DOĞRU
  • YANLIŞ

Bundan əlavə, aşağıdakı adlardan istifadə edilməməlidir. Baxmayaraq ki, onlar PHP 7.0-da xəta yaratmasalar da, gələcəkdə istifadə üçün qorunur və köhnəlmiş hesab edilməlidir.

  • obyekt
  • qarışıq
  • rəqəmli
ASP və script PHP teqləri silindi

PHP kodunu məhdudlaşdırmaq üçün ASP və skript teqlərindən istifadə dəstəyi silindi. Təsirə məruz qalan etiketlər bunlardır:

ASP və skript teqləri silindi Açılış etiketi Bağlama etiketi
Uyğun olmayan kontekstdən gələn zənglər silindi

Əvvəllər PHP 5.6-da köhnəlmiş, uyğun olmayan kontekstlə statik olmayan metoda edilən statik çağırışlar indi çağırılan metodun müəyyən edilməmiş metoda malik olması ilə nəticələnəcək. $bu dəyişən və köhnəlmə xəbərdarlığı verilir.

PHP 5.6-da yuxarıdakı nümunənin çıxışı:

Köhnəlmişdir: Qeyri-statik metod A::test() 8-ci obyekt(B)#1 (0) ( ) sətirindəki /tmp/test.php-də uyğun olmayan kontekstdən bunu $tmp/test.php fərz edərək, statik olaraq çağırılmamalıdır.

PHP 7-də yuxarıdakı nümunənin çıxışı:

Köhnəlmişdir: Qeyri-statik metod A::test() 8-ci sətirdə /tmp/test.php-də statik olaraq çağırılmamalıdır Qeyd: Müəyyən edilməmiş dəyişən: bu /tmp/test.php-də 3-cü sətirdə NULL

yield indi sağ assosiativ operatordur

Gəlir quruluşu artıq mötərizə tələb etmir və arasında üstünlük təşkil edən sağ assosiativ operatora dəyişdirilib. çap edin=> . Bu, davranışın dəyişməsi ilə nəticələnə bilər:

Mötərizələr bu halları aydınlaşdırmaq üçün istifadə edilə bilər.

Funksiyalar eyni ada malik bir neçə parametrə malik ola bilməz

Eyni ada malik iki və ya daha çox funksiya parametrlərini təyin etmək artıq mümkün deyil. Məsələn, aşağıdakı funksiya E_COMPILE_ERROR-u işə salacaq:

Arqumentləri yoxlayan funksiyalar hesabat verir cari parametr dəyəri

func_get_arg() , func_get_args() , debug_backtrace() və istisna geri izləri artıq parametrə ötürülən orijinal dəyəri bildirməyəcək, əksinə cari dəyəri (dəyişiklik edilmiş ola bilər) təmin edəcək.

PHP 5-də yuxarıdakı nümunənin çıxışı:

PHP 7-də yuxarıdakı nümunənin çıxışı:

Switch ifadələrində birdən çox standart blok ola bilməz

Bir keçid ifadəsində iki və ya daha çox standart bloku təyin etmək artıq mümkün deyil. Məsələn, aşağıdakı keçid bəyanatı E_COMPILE_ERROR-u işə salacaq:

JSON uzantısını JSOND ilə əvəz etdi

JSON uzadılması JSOND ilə əvəz olundu və üç kiçik BC fasiləsinə səbəb oldu. Birincisi, nömrə ondalık nöqtə ilə bitməməlidir (yəni. 34. birinə dəyişdirilməlidir 34.0 və ya 34 ). İkincisi, elmi qeydlərdən istifadə edərkən e eksponent dərhal onluq nöqtəni izləməməlidir (yəni. 3.e3 birinə dəyişdirilməlidir 3.0e3 və ya 3e3). Nəhayət, boş sətir artıq etibarlı JSON hesab edilmir.

Daşqın zamanı daxili funksiya çatışmazlığı

Əvvəllər, daxili funksiyalar, float tam ədəd kimi təqdim etmək üçün çox böyük olduqda, floatdan tam ədədə məcburetmə nəticəsində yaranan nömrələri səssizcə kəsirdi. İndi E_WARNING veriləcək və NULL qaytarılacaq.

Xüsusi sessiya işləyicisinin qaytarılması dəyərlərinə düzəlişlər

FALSE və ya qaytaran xüsusi sessiya işləyiciləri tərəfindən həyata keçirilən istənilən predikat funksiyaları -1 ölümcül səhvlər olacaq. Bu funksiyalardan booleandan başqa hər hansı bir dəyər varsa, -1 , və ya 0 qaytarılır, sonra uğursuz olacaq və E_XƏBƏRDARLIQ veriləcək.

Bərabər elementlərin çeşidlənməsi

Daxili çeşidləmə alqoritmi təkmilləşdirilmişdir ki, bu da əvvəlkindən bərabər müqayisə edilən elementlərin müxtəlif çeşidləmə sırası ilə nəticələnə bilər.

Bərabər müqayisə olunan elementlərin sırasına etibar etməyin; istənilən vaxt dəyişə bilər.

Yanlış yerləşdirilmiş fasilə və keçid ifadələri

fasilədavam et loopdan kənar ifadələr və ya keçid nəzarət strukturu indi əvvəlki kimi icra vaxtı əvəzinə tərtib zamanı aşkarlanır və E_COMPILE_ERROR-u işə salır.

Qeyri-ixtiyari bax... Rusca sinonim və mənaca oxşar ifadələrin lüğəti. altında. red. N. Abramova, M.: Rus lüğətləri, 1999. şüursuz instinktiv olaraq, fərqində olmadan, kortəbii, çaxnaşma, instinktiv olaraq, fərqində olmadan, fərqində olmadan,... ... Sinonimlərin lüğəti

Hesabsız, instinktiv, mexaniki, kortəbii, kor-koranə. Bax... Sinonimlər lüğəti

Qeyri-ixtiyari, şüursuz, şüursuz, instinktiv, mexaniki, mexaniki, kor-koranə, kortəbii; təsadüfən, istəmədən; İstər-istəməz, istər-istəməz (volens nolens), zərurətdən, özündən asılı olmayan şeylərə görə bunu etməli oldu... ... Sinonimlər lüğəti

Kor-koranə, şüuraltı, bağırsaq, fərqinə varmadan, bilmədən, kortəbii, şüursuz, fərqində olmadan, şüursuz, mexaniki, şüursuz, şüursuz, intuitiv, şüursuz, altıncı hiss, instinktiv olaraq Rus dili lüğəti... ... Sinonimlər lüğəti.

Qeyri-ixtiyari bax... Rusca sinonim və mənaca oxşar ifadələrin lüğəti. altında. red. N. Abramova, M.: Rus lüğətləri, 1999. kor-koranə şüursuz, qeyri-ixtiyari; qeyri-müəyyən, ehtiyatsız, hesabsız, kortəbii, instinktiv, kölə, şüursuz, qeyri-müəyyən,... ... Sinonimlər lüğəti

adv. məsuliyyətsizliyə. [Ana] geri dönmək istədi, lakin şüursuz olaraq yenidən irəli getdi. M. Qorki, Ana. [Yəhuda] yaxşı dostu Mama'ya yalvardı ki, onun əmlakını hesabsız idarə etsin. Saltykov Shchedrin, Messrs. Golovlevs ... Kiçik Akademik Lüğət

HESABAT VERİLMƏYƏCƏK, cavabdehlik daşımayan, hesabatsız; (qısa kişi istifadə edilmir) hesabsız, hesabsız. 1. Heç bir nəzarətə tabe olmayan, hesabat verməyə borclu deyil. O, dükana cavabdeh olaraq (adv.) rəhbərlik edirdi. 2. Ağlabatan mülahizələrdən asılı olmayan,... ... Uşakovun izahlı lüğəti

- (yunanca). Başqasının hesabına hesabsız ticarət etmək tapşırılan şəxs. Rus dilinə daxil olan xarici sözlərin lüğəti. Çudinov A.N., 1910. ANAQALİST Hesabat vermədən başqasının hesabına ticarət etmək tapşırılan şəxs. İzah... ... Rus dilinin xarici sözləri lüğəti

Hesabsız, şüursuz, mexaniki, qeyri-ixtiyari, avtomatik, mexaniki, avtomatik, mexaniki, avtopilot Rus sinonimlərinin lüğəti. avtomatik olaraq rus dilinin sinonimlərinin lüğətinə baxın. Praktik bələdçi. M.: Rus dili... Sinonimlər lüğəti

Qeyri-ixtiyari bax... Rusca sinonim və mənaca oxşar ifadələrin lüğəti. altında. red. N. Abramova, M.: Rus lüğətləri, 1999. instinktiv, şüursuz, qeyri-iradi; qeyri-ixtiyari, şüursuz, bağırsaq, kortəbii, kortəbii, şüursuz, kor-koranə,... ... Sinonimlər lüğəti

Kitablar
  • Çexoslovakiya ilə səyahət, J. Marko, M. Peterka, Praqa, 1959. Artia. Çoxlu foto illüstrasiyalarla. Nəşriyyatın məcburi. Vəziyyəti yaxşıdır. Dünyanın istənilən ölkəsindən olan ovsunlu sərgərdan bu ecazkar kitabı dərindən öyrənə bilər... Kateqoriya: Səyyahların qeydləri, xatirələr, araşdırmalar Nəşriyyatçı: Artia,
  • Şura və ya Sennaya, Gennadi Qriqoryev, Sergey Nosov, Sankt-Peterburqda sadəcə olaraq fantazmogen yerlər var. Bunlara Sennaya meydanı daxildir. "Sennaya - fantazmaqoriyanın beşiyi". Müəlliflərin özləri də Sennaya-da başlarına gələnlərdən təəccüblənirlər. Və... Kateqoriya: Klassik və müasir nəsr Seriya: Dövrümüzün Sankt-Peterburq simaları Nəşriyyatçı:

PHP-dən nə qədər istifadə etsək də, hələ də heç eşitmədiyimiz bəzi funksiyalar açılır. Onlardan bəziləri bizim üçün çox faydalı olardı. Hər bir PHP proqramçısının arsenalında olması lazım olan faydalı funksiyaların kiçik bir siyahısını yaratdım.

1. Dəyişən sayda arqumentlərlə funksiyaların yaradılması

Çox güman ki, siz artıq bilirsiniz ki, PHP bizə əlavə arqumentlərlə funksiyalar yaratmağa imkan verir. İndi mən arqumentlərin sayının hər halda dəyişə biləcəyi funksiyanı göstərəcəyəm.

Ancaq əvvəlcə funksiyaları adi şəkildə necə yaratdığımızı xatırlayaq:

// iki əlavə parametrli funksiya funksiyası foo($arg1 = "", $arg2 = "") ( echo "arg1: $arg1\n"; echo "arg2: $arg2\n"; ) foo("salam", "dünya"); /* çıxış edəcək: arg1: salam arg2: dünya */ foo(); /* çıxış edəcək: arg1: arg2: */

İndi isə qeyri-məhdud sayda arqumentli funksiyanı necə yaza biləcəyinizi nəzərdən keçirək. Bunun üçün func_get_args() metodundan istifadə olunacaq:

// arqumentləri göstərməyin funksiyası foo() ( // ötürülmüş arqumentlər massivini qaytarır $args = func_get_args(); foreach ($args kimi $k => $v) ( echo "arg".($k+1) ." : $v\n" ) ) foo(); /* heç nə çıxarmayacaq */ foo("salam"); /* arg1 çap edəcək: salam */ foo("salam", "dünya", "yenidən"); /* çap edəcək arg1: salam arg2: dünya arg3: yenidən */

2. Faylları axtarmaq üçün Glob() istifadə edin

Çox vaxt funksiyaların adları özləri üçün danışır. Eyni şeyi glob() funksiyası üçün demək olmaz.

Çox təfərrüata varmadan onun funksionallığı scandir() metoduna bənzəyir. Şablondan istifadə edərək tələb olunan faylı tapmağa imkan verir:

// bütün php fayllarını tapın $files = glob("*.php"); print_r($fayllar); /* çıxaracaq: Massiv ( => phptest.php => pi.php => post_output.php => test.php) */

Bir neçə növ faylı tapmaq üçün belə yazmalısınız:

// bütün php və txt fayllarını tapın $files = glob("*.(php,txt)", GLOB_BRACE); print_r($fayllar); /* çıxış: Massiv ( => phptest.php => pi.php => post_output.php => test.php => log.txt => test.txt) */

Şablonda yolu da təyin edə bilərsiniz:

$files = glob("../images/a*.jpg"); print_r($fayllar); /* çıxış: Massiv ( => ../images/apple.jpg => ../images/art.jpg) */

Sənədin tam yolunu əldə etmək üçün realpath() metodundan istifadə edin:

$files = glob("../images/a*.jpg"); // "realpath" funksiyasını hər massiv elementinə tətbiq edin $files = array_map("realpath",$files); print_r($fayllar); /* çıxacaq: Array ( => C:\wamp\www\images\apple.jpg => C:\wamp\www\images\art.jpg) */

3. İstifadə olunan yaddaş haqqında məlumat

Skriptləriniz tərəfindən istehlak edilən yaddaşın miqdarını izləsəniz, yəqin ki, onları daha tez-tez optimallaşdıracaqsınız.

PHP güclü yaddaş izləmə alətinə malikdir. Skriptin müxtəlif hissələrində yüklər fərqli ola bilər. Hazırda istifadə olunan yaddaş dəyərini əldə etmək üçün yaddaş_get_usage() metodundan istifadə etməliyik. İstifadə olunan maksimum yaddaş miqdarını düzəltmək üçün memory_get_peak_usage() istifadə edin.

Echo "İlkin: ".memory_get_usage()." bayt \n"; /* İlkin: 361400 bayt */ // ($i = 0; $i) üçün kiçik bir yük verin< 100000; $i++) { $array = md5($i); } // и ещё for ($i = 0; $i < 100000; $i++) { unset($array[$i]); } echo "Final: ".memory_get_usage()." bytes \n"; /* Final: 885912 bytes */ echo "Peak: ".memory_get_peak_usage()." bytes \n"; /* Peak: 13687072 bytes */

4. Prosessor haqqında məlumat

Bunun üçün getrusage() metodundan istifadə etməlisiniz. Ancaq unutmayın ki, bu funksiya Windows-da işləməyəcək.

Print_r(getrusage()); /* Massivi çap edir ( => 0 => 0 => 2 => 3 => 12692 => 764 => 3864 => 94 => 0 => 1 => 67 => 4 => 0 => 0 => 0 => 6269 => 0) */

Yuxarıda göstərilən şəkil sistem idarəçiliyində təcrübəsi olanlar üçün aydın olacaq. Hər kəs üçün transkript təqdim edirik:

  • ru_oublock: blok yazma əməliyyatlarının sayı
  • ru_inblock: blok oxu əməliyyatlarının sayı
  • ru_msgsnd: göndərilən mesajların sayı
  • ru_msgrcv: qəbul edilən mesajların sayı
  • ru_maxrss: səhifələnməmiş dəstin maksimum ölçüsü
  • ru_ixrss: paylaşılan yaddaşın ümumi miqdarı
  • ru_idrss: paylaşılmamış məlumatların ümumi həcmi
  • ru_minflt: istifadə olunan yaddaş səhifələrinin sayı
  • ru_majflt: itkin səhifə səhvlərinin sayı
  • ru_nsignals: qəbul edilən siqnalların sayı
  • ru_nvcsw: proses üzrə kontekst keçidlərinin sayı
  • ru_nivcsw: məcburi kontekst keçidlərinin sayı
  • ru_nswap: səhifələmə zamanı diskə girişlərin sayı
  • ru_utime.tv_usec: istifadəçi rejimində işləmə müddəti (mikrosaniyələr)
  • ru_utime.tv_sec: istifadəçi rejimində işləmə müddəti (saniyələr)
  • ru_stime.tv_usec: imtiyazlı rejimdə işləmə müddəti (mikrosaniyələr)
  • ru_stime.tv_sec: imtiyazlı rejimdə işləmə müddəti (saniyələr)

Prosessorunuzun hansı resurslarının skript tərəfindən istifadə edildiyini öyrənmək üçün sizə “istifadəçi vaxtı” (istifadəçi vaxtı) və “sistem vaxtı” (imtiyazlı rejim vaxtı) dəyəri lazımdır. Nəticəni həm saniyə, həm də mikrosaniyələrdə əldə edə bilərsiniz. Ümumi saniyə sayını onluq ədədə çevirmək üçün mikrosaniyələrin dəyərini 1 milyona bölməli və saniyə dəyərini dəyərə əlavə etməlisiniz.

Bir növ çaşdırıcıdır. Budur bir nümunə:

// 3 saniyə yatmaq (3); $data = getrusage(); echo "İstifadəçi vaxtı:". ($data["ru_utime.tv_sec"] + $data["ru_utime.tv_usec"] / 1000000); echo "Sistem vaxtı:". ($data["ru_stime.tv_sec"] + $data["ru_stime.tv_usec"] / 1000000); /* çap edir İstifadəçi vaxtı: 0.011552 Sistem vaxtı: 0 */

Skriptin icrası təxminən 3 saniyə çəksə də, prosessor çox yüklənməmişdir. Fakt budur ki, çağırılanda (yuxu), skript faktiki olaraq heç bir prosessor resursunu istehlak etmir. Ümumiyyətlə, xeyli vaxt tələb edən, lakin prosessordan istifadə etməyən bir çox vəzifə var. Məsələn, disklə əlaqəli əməliyyatları gözləmək. Beləliklə, skriptlərinizdə həmişə CPU vaxtından istifadə etmirsiniz.

Budur başqa bir nümunə:

// 10 milyon dəfə gəzin ($i=0;$i salam => 42 => Massiv ( => 1 => iki) => alma) */

Bu funksiyalar belə işləyir. Bununla belə, JSON-un populyarlığının sürətlə artması səbəbindən PHP 5.2-ə 2 üsul json_encode() və json_decode() əlavə edildi. Onların işi serialize() ilə oxşardır:

// kompleks massiv $myvar = massiv("salam", 42, massiv(1,"iki"), "alma"); // sətirə çevirmək $string = json_encode($myvar); echo $string; /* çap edəcək ["salam",42,,"apple"] */ // orijinal dəyəri bərpa edəcək $newvar = json_decode($string); print_r($newvar); /* Array çap edir ( => salam => 42 => Massiv ( => 1 => iki) => alma) */

Bu seçim daha yığcamdır və JavaScript kimi digər dillərlə uyğun gəlir. Lakin çox mürəkkəb obyektlərlə işləyərkən məlumat itkisi baş verə bilər.

8. Simli sıxılma

Sıxılma dedikdə ağlımıza dərhal ZIP formatında arxiv faylları gəlir. PHP heç bir fayl olmadan uzun sətirləri sıxışdırmaq imkanı verir.

Aşağıdakı nümunə gzcompress() və gzuncompress() funksiyalarının necə işlədiyini nümayiş etdirir:

$string = "Əlavə məlumat əldə edə bilərsiniz. Təmizləmə qabiliyyətinə malik ola bilərsiniz. Mükəmməl. , consectetur pretium ullamcorper quis iaculis, lacinia augue, ornare in mollis que eu non enim "; $sıxılmış = gzcompress($string); echo "Orijinal ölçü:". strlen($string)."\n"; /* orijinal ölçüsünü çıxaracaq: 800 */ echo "Sıxılmış ölçü:". strlen($sıxılmış)."\n"; /* Sıxılmış ölçü çıxaracaq: 418 */ // $original = gzuncompress($sıxılmış);

Mətnin həcmini 50% azalda bilərik. Eyni məqsədlər üçün siz fərqli sıxılma alqoritmindən istifadə edən gzencode() və gzdecode() metodlarından istifadə edə bilərsiniz.

9. Çıxmazdan əvvəl icra edin

PHP-nin register_shutdown_function() funksiyası var ki, bu da skripti söndürməzdən əvvəl bəzi kodu icra etməyə imkan verir.

Tutaq ki, siz bəzi məlumatları öyrənmək istəyirsiniz... Skriptin işləmə müddəti:

// başlanğıc vaxtını əldə edin $start_time = microtime(true); // bəzi əməliyyatlar // ... // icra müddətini göstər echo "icra alındı: ". (microtime(doğru) - $start_time). "saniyələr.";

İlk baxışdan bu, əhəmiyyətsiz bir iş kimi görünə bilər. Bu məqsədlər üçün kodu faylın sonunda yerləşdirə bilərsiniz. Bununla belə, exit() funksiyası bundan əvvəl haradasa işə salınarsa, bu kod heç vaxt işləməyəcək. Həmçinin, səhifədə xəta olarsa və ya istifadəçi səhifənin yüklənməsini dayandırarsa (brauzerində müvafiq düyməni basmaqla) işləməyəcək;

register_shutdown_function() metodundan istifadə edərkən kod istənilən halda icra olunacaq:

$start_time = microtime(doğru); register_sutdown_function("mənim_bağlamam"); my_shutdown() funksiyası ( qlobal $start_time; echo "icra alındı: ". (microtime(true) - $start_time). " saniyə."; )

Nəticə

PHP öz məzmunu ilə bizi heyrətləndirməyə davam edən bütöv bir planetdir. Bu funksiyalar haqqında nə düşünürsünüz?



Əlaqədar nəşrlər