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

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

, , ,

Няма коментари

Подобряване с Codeception

Когато за пръв път започнах работа с codeception се сблъсках с някои неизбежни проблеми. Ще се опитам да ги покажа за да оцените приимуществото на тази система, както и тестовете като цяло.

Ето ги и тях:

  1. Първото нещо, което ми разкри codeception е файловата ми структура и начина по които е организирана. Важно е какви файлове се зареждат от всяка една част на апликацията и ако са преплетени един в друг може да усложни много тестването. Настройките, които първоначално нагласям трябва да са изолирани и да не пречат на тестовете. Това ми даде възможност да тествам с различни параметри всяка една част от системата. Най-лесния начин за добавяне на други параметри за мен беше да подам .env.testing файл преди .env на Codeception, което ми гарантира, че всичко може да се замени.
  2. Повечето неща при мен преминаваха през DI контейнер и това много улесни и тестването. Но за другите зависимости веднага си личи кое не си е на мястото. Най-много при unit тестването.. когато не можете да тествате определен вариант или да mock-нете някой клас. Точно в тези случаи трябва всичко да се изчисти за да работите по-добре за в бъдеще и тестовете да се пишат по-лесно.
  3. Докато пиша тестовете аз на практика си проверявах кода сам. На няколко пъти ми се е случвало да си показвам кода на колеги, да обеснявам какво прави и тогава винаги съм откривал някои грешки или съм се сещал за по-добри решения – принципа на гуменото пате. Не е толкова важно какво ще каже другия човек, но самото усилие да се предаде някаква информация ни настройва да мислим различно и да си открием проблеми или решения. Имам и реално гумено пате, но нещо не върши добра работа и не работи при мен. Това което работи почти по същия начин е писането на тестове. Тогава минавам кода повторно да обмисля логически какво трябва да тествам, както и дали не съм изпуснал нещо, но вече като мисля в перспектива. Тогава откривам най-много бъгове и ги хващам в преди дори да пусна и един тест.

Това са едни от най-сериозните ми приимущества при писането на тестове. Те помагат още преди да се пуснат за проверка.

, , ,

Няма коментари

Codeception

Лесен и достъпен начин за тестване на вашият код. Предимно за 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

Това е един проект направен по време на Code4.Tech в Шумен състезание 2016 г. Цели подготвяне на ученици, студенти и професионалисти за интервю. С тази платформа може да получите информация за читалищата в област Шумен, да допринесете с информация за събития, новини, снимки и да бъдете част от една локална общност.

Това е един малко по-различен CMS, за който идеята е публично да може да се дава информация и всеки който иска да публикува информация. Не са използвани готови компоненти, а редакцията и авторизацията е правена само с Phalcon.

Все още като прототип и има много незавършена фукционалност, но базовите неща може да ги видите като си заредите платформата като следвате стъпките в хранилището.

Ето и линк към пълния код:

https://github.com/ibpavlov/chitalishte-shumen

, , , , , ,

Няма коментари

Interview-U (подготовка за интервю)

Това е един публичен проект направен по време на Code4.Tech в Русе състезание 2016 г. Цели подготвяне на ученици, студенти и професионалисти за интервю. С тази платформа може да получите полезни съвети, да направите IQ тест (в разработка), да се подготвите с въпросник, който се оценява (в разработка) и видео интервю (за лична подготовка). Възможно е да управлявате записаните видеа, както и всички въпроси на сайта.

Използвани технологии:

  • PHP 5.5+
  • Phalcon 2+
  • Composer
  • Mysql server

Link: https://github.com/ibpavlov/Interview-U

 

 

, , , ,

Няма коментари

  • Страница 1 от 46
  • 1
  • 2
  • 3
  • 4
  • ...
  • 46
  • >

Лични проекти

Мои проекти или такива в които съм взимал активно участие

Читалище Шумен CMS

На 22.12.2016
Phalcon, Важни, Проекти, Сайтове

, , , , , ,

Interview-U (подготовка за интервю)

На 07.08.2016
Phalcon, Важни, Проекти, Публичен код, Сайтове

, , , ,

Menu Android Апликация

На 10.05.2014
Android, Java, Важни, Проекти

Bebeshko.com

На 10.03.2014
Проекти, Сайтове

, ,

Компютърна графика Javascript

На 21.01.2014
Java-Script Код, JavaScript, Код

Imotiko.com

На 13.01.2013
JavaScript, Проекти, Сайтове

, , ,




Код

Примерни фрагменти, функции, модули за различни програмни езици

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

На 22.03.2018
PHP Код, Важни, Код

, , ,

Codeception

На 18.01.2018
Codeception Код, PHP Код, Важни, Код, Програмиране, Сайтове, Технологии

, , , , ,

JSON_NUMERIC_CHECK round-fix

На 01.08.2016
PHP Код, Важни, Код

, , ,

Разделяне на локация в 2 отделни полета

На 16.12.2015
MySQL/SQL, Код

Bootstrap качване на файл

На 17.03.2015
Bootstrap, Java-Script Код, Код

, ,

Активна навигация

На 05.05.2014
PHP Код, Код