PHP примери за напреднали


  • 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

Ето това е нещо сравнително просто, което мноого рядко може да ви се наложи, но докато не прочетете в документацията няма да знаете дали можете да го направите. Ако няколко вложени цикъла то единственият начин да прескочите външните е като подадете втори параметър на continue. Това важи и за break. Ето един пример:
for($i = 1; $i <= 3; $i++) {
for($h = 1; $h <= 3; $h++) {
if ($h == 2) continue;
echo $h . " ";
if ($i == 2) continue 2;
}
echo $i . "\n";
}

Така ще получите:

1 1
3 1
1 1 3
3 3

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)