Advanced PHP usage


  • return; return;
  • continue 2
  • catch(Excepton1|Exception2 $e)
  • isset($param1, $param2, $param3)
  • !empty(array_intersect(['firstname','lastname'], array_keys(array_filter($array))))
  • iterator_to_array(new \RecursiveIteratorIterator(new \RecursiveArrayIterator($array)))
  • preg_match("/(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})/", $dateString, $coordinates)

Това са функционалносто на PHP, които не са описани в началните курсове или не се покриват в повечето уроци свързани с PHP. Исках да извадя някои от скорошните ми способи за подобрение на кода. Всяка една функционалност може да се напише и по друг начин, но с повече редове или по-бавни (както ги срещам най-често). Бих казал, че това са най-кратко написаните решения на даден проблем. Ако все пак някой знае по-добър ще се радвам да го науча.

return; return;

Добре де, return; return; не е всъщност нещо което работи – поне след първия return, но исках да напомня да внимавате за неизпълним код. По-лошото от код който трудно се поддържа е само кой, които никога и не се използва. До преди време исках да покрия всичко което правя и да включа допълнителна функционалност – FUTURE PROOF. Но ако имаш 10 такива библиотеки и използваш само 10% от написаното, всъщност ще ти е много трудно да ги поддържаш за в бъдеще (изключения са ако правите Framework, CMS,.. някоя външна библиотека)., защото изискванията винаги се сменят и неизползвания код става все по-голям.

continue 2

Ето това е нещо сравнително просто, което мноого рядко може да ви се наложи, но докато не прочетете в документацията няма да знаете дали можете да го направите. На мен ми се наложи за да обходя масив, с модел, които след намерен елемент следваше друг, който не е важен. Ето и пример: [1,2,3,'name1', 'phone1', 4,5 'name2', 'phone2']. Всъщност при мен трябваше за всеки един елемент да правя изчисления дали е име и да се взима от под-списък, затова пропускането на телефона ми спести ресурси.

continue може да получи броя на цикли, които трябва да прескочи, като по-подразбиране си е 1.

catch(Excepton1|Exception2 $e)

Това е нещо ново – php 7.1+, но ако често използвате try..catch може да ви спести повторения на код. Тук хващаме грешка ако е инстанция на един от 2-та класа.

Може да провчетете документацията за да се запознаете с всички подробности –exceptions

isset($param1, $param2, $param3)

Знаехте ли, че isset може да поема повече от 1 параметър. Накрая връща true само когато всеки един от тях е зададен.

Друг вариант за използването му е да проверите дали елементи в масив съдържат нулеви стойности като isset(...$array)

Документация: isset

!empty(array_intersect(['firstname','lastname'], array_keys(array_filter($array))))

А с този скрипт проверявам дали някои от елементите на списъка са не-празни и се срещат в масив. Ако масива ви е ['firstname' => '', 'lastname' => 'Doe'] ще върне true, но ако е ['firstname' => '', 'middlename' => 'Name'] ще върне false. Удобно е когато изпращате някоя форма да проверите първо дали има не-празни стойности за желаните елементи.

Документация:  array_intersect, array_keys, array_filter

iterator_to_array(new \RecursiveIteratorIterator(new \RecursiveArrayIterator($array)))

Обхождането на много-измерни списъци е трудно и винаги се прави с рекурсия, но по този начин с 1 ред код може да вземем плоска версия на масива. Ако искаме просто да обходим всички елементи то можем да извикаме само new \RecursiveIteratorIterator(new \RecursiveArrayIterator($array)) и да обходим неговите елементи, понеже може да загубим някои стойности ако имаме едни и същи ключове (Пример: ['key' => 'val', 'other' => ['key' => 'val2']], което ще доведе до ['key' => 'val2'].

Документация:  iterator_to_array, RecursiveIteratorIterator, RecursiveArrayIterator

preg_match("/(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})/", $subject, $matches)

Много често виждам $matches[1]/$matches[0]/$matches[2], което е трудно за четене може да доведе до грешки в някои по-сложни случаи. А така, като подадете ?P<name>директно задавате ключ на параметъраname(а 0,1,2 са си все там, ако желаете да ги използвате).

Документация: preg_match

 

Надявам се, че вие също ползвате подобни средства, за да улесните живота си. Ако се сещате за нещо подобно, което използвате може да оставите коментар.

  1. Няма коментари.
(will not be published)