PHP примери за напреднали
Публикувано от Ivelin Pavlov в PHP Код, Важни, Код на 22 март 2018г.
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
Надявам се, че вие също ползвате подобни средства, за да улесните живота си. Ако се сещате за нещо подобно, което използвате може да оставите коментар.
Подобряване с Codeception
Публикувано от Ivelin Pavlov в Важни, Програмиране на 15 февруари 2018г.
Когато за пръв път започнах работа с codeception се сблъсках с някои неизбежни проблеми. Ще се опитам да ги покажа за да оцените приимуществото на тази система, както и тестовете като цяло.
Ето ги и тях:
- Първото нещо, което ми разкри codeception е файловата ми структура и начина по които е организирана. Важно е какви файлове се зареждат от всяка една част на апликацията и ако са преплетени един в друг може да усложни много тестването. Настройките, които първоначално нагласям трябва да са изолирани и да не пречат на тестовете. Това ми даде възможност да тествам с различни параметри всяка една част от системата. Най-лесния начин за добавяне на други параметри за мен беше да подам .env.testing файл преди .env на Codeception, което ми гарантира, че всичко може да се замени.
- Повечето неща при мен преминаваха през DI контейнер и това много улесни и тестването. Но за другите зависимости веднага си личи кое не си е на мястото. Най-много при unit тестването.. когато не можете да тествате определен вариант или да mock-нете някой клас. Точно в тези случаи трябва всичко да се изчисти за да работите по-добре за в бъдеще и тестовете да се пишат по-лесно.
- Докато пиша тестовете аз на практика си проверявах кода сам. На няколко пъти ми се е случвало да си показвам кода на колеги, да обеснявам какво прави и тогава винаги съм откривал някои грешки или съм се сещал за по-добри решения – принципа на гуменото пате. Не е толкова важно какво ще каже другия човек, но самото усилие да се предаде някаква информация ни настройва да мислим различно и да си открием проблеми или решения. Имам и реално гумено пате, но нещо не върши добра работа и не работи при мен. Това което работи почти по същия начин е писането на тестове. Тогава минавам кода повторно да обмисля логически какво трябва да тествам, както и дали не съм изпуснал нещо, но вече като мисля в перспектива. Тогава откривам най-много бъгове и ги хващам в преди дори да пусна и един тест.
Това са едни от най-сериозните ми приимущества при писането на тестове. Те помагат още преди да се пуснат за проверка.
Codeception
Публикувано от Ivelin Pavlov в Codeception Код, PHP Код, Важни, Код, Програмиране, Сайтове, Технологии на 18 януари 2018г.
Лесен и достъпен начин за тестване на вашият код. Предимно за PHP приложения, но не е задължително.
Ако използвате Codeception може да покриете по всякакъв начин вашия код с unit, functional или acceptance тестове.
Документацията им е добре написана и лесно можете да започнете с първите си тестове.
Само като пример (с Composer) бих дал няколко команди които ще създадът всичко необходимо за създаване и изпълнение на Codeceptio тестове:
composer require codeception/codeception --dev vendor/bin/codecept bootstrap codecept generate:cept acceptance First vendor/bin/codecept run
Това ще ви добави библиотеката, чрез Composer.
След това ще създаде стартова версия с unit, functional и acceptance тестови конфигурации.
Генерираме тестов файл с формат Cept за acceptance suit и име First.
Накрая пускаме проверка за всички тестове, които нямат никакви проверки, но все пак всички основни файлове са създадени и може да започнете доректно с покриването на вашия код.
След лекцията ми на RuseConf 2017, реших да дам малко повече публичност на начините за тестове. С тази публикация започвам серия от най-добри практики при писане не стандартни тестове.
Codeception има примерни тестове за много видове проекти, както и за фреймуърковете, които поддържат – Zend, Yii, Phalcon, Doctrene, Laravel, Simpfony, Silex..
Избрах да направя разширена версия на тестовете им на Laravel, за да покажа добри практики за по-напреднали тестове. Можете да я намерите в Github: https://github.com/ibpavlov/codeception-laravel5-advanced
Читалище Шумен CMS
Публикувано от Ivelin Pavlov в Phalcon, Важни, Проекти, Сайтове на 22 декември 2016г.
Това е един проект направен по време на Code4.Tech в Шумен състезание 2016 г. Цели подготвяне на ученици, студенти и професионалисти за интервю. С тази платформа може да получите информация за читалищата в област Шумен, да допринесете с информация за събития, новини, снимки и да бъдете част от една локална общност.
Това е един малко по-различен CMS, за който идеята е публично да може да се дава информация и всеки който иска да публикува информация. Не са използвани готови компоненти, а редакцията и авторизацията е правена само с Phalcon.
Все още като прототип и има много незавършена фукционалност, но базовите неща може да ги видите като си заредите платформата като следвате стъпките в хранилището.
Ето и линк към пълния код:
https://github.com/ibpavlov/chitalishte-shumen
Interview-U (подготовка за интервю)
Публикувано от Ivelin Pavlov в Phalcon, Важни, Проекти, Публичен код, Сайтове на 07 август 2016г.
Това е един публичен проект направен по време на Code4.Tech в Русе състезание 2016 г. Цели подготвяне на ученици, студенти и професионалисти за интервю. С тази платформа може да получите полезни съвети, да направите IQ тест (в разработка), да се подготвите с въпросник, който се оценява (в разработка) и видео интервю (за лична подготовка). Възможно е да управлявате записаните видеа, както и всички въпроси на сайта.
Използвани технологии:
- PHP 5.5+
- Phalcon 2+
- Composer
- Mysql server
Link: https://github.com/ibpavlov/Interview-U