niedziela, 16 czerwca 2019

Symfony Live Warszawa 2019


     By艂a to moja pierwsza konferencja Symfony Live (ostatnia w Polsce by艂a zorganizowana ca艂e wieki temu bo w 2013) a jestem w sumie nowy w tym 艣rodowisku (u偶ywam dopiero od paru miesi臋cy). Co prawda zdawa艂em sobie spraw臋 jak du偶a jest spo艂eczno艣膰 Symfony (najpopularniejszy frejm w Polsce), ale to co zobaczy艂em tak czy inaczej zrobi艂o na mnie du偶e wra偶enie. Na konferencji zebra艂o si臋 oko艂o 350 uczestnik贸w, kilkunastu prelegent贸w (doskonale znanych w 艣rodowisku PHP) oraz oczywi艣cie ekipa SensioLabs z Fabien'em na czele. 




     Poziom jaki prezentowa艂y wszystkie prezentacje by艂 bardzo wysoki. Wiadomo, 偶e dla ka偶dego co艣 innego i tak dla mnie niekt贸re prezentacje by艂y czym艣 w rodzaju "ok teraz sobie pos艂ucham po raz kolejny jak dobre jest x", a inne wysypywa艂y w moim kierunku wiedz臋 kt贸r膮 zbiera艂em gar艣ciami i nie chcia艂em uroni膰 偶adnego szczeg贸艂u. Tak czy inaczej nawet te znane przeze mnie zagadnienia ubrane by艂y w now膮 form臋/inny kontekst co sprawia艂o, 偶e 艣wietnie si臋 ich s艂ucha艂o. Naprawd臋 dobrze!

     Tak jak pisa艂em - generalnie poziom by艂 bardzo wysoki ale najwi臋ksze wra偶enie zrobi艂y na mnie:


DDD, CQRS, ES, Hexagon... oraz Symfony 
Tomasz Kowalczyk

     Tomasza widzia艂em ju偶 wcze艣niej na konferencjach, ale do tej pory jego prezentacje (ok, raczej poruszane tematyki) nie robi艂y na mnie wra偶enie. Jednak偶e pierwszy dzie艅 konferencji sporo zmieni艂. Sam tytu艂 jest ok i faktycznie odnosi艂 si臋 do tre艣ci, ale nie do ko艅ca ujmowa艂 to o czym m贸wi艂 prelegent. W pierwszej cz臋艣ci wszyscy zgromadzeni us艂yszeli do艣膰 radykalne o艣wiadczenie jak na zaistnia艂e okoliczno艣ci zlotu Symfony: Nienawidz臋 frejmwork贸w*... kr贸tka konsternacja i s艂owa wyja艣nienia (gwiazdka) dlaczego Symfony jest dla niego wyj膮tkiem od tego stwierdzenia. Generalnie to stanowi艂o pierwsz膮 cze艣膰 prezentacji. Pozbawione technicznych aspekt贸w, bardziej skupiaj膮ce si臋 na b艂臋dnym (pozbawionym refleksji) podej艣ciu developer贸w do projektowania i sposobu w jaki wykorzystuj膮 dost臋pne narz臋dzie. Druga cz臋艣膰 to wymienione w tytule prezentacji buzzwords'y zastosowane w kontek艣cie Symfony - czyli jak projektowa膰 lepiej. 


Kr贸tka historia o tym jak mo偶emy projektowa膰 i implementowa膰 aplikacje Symfony przy u偶yciu TDD 
Leszek Prabucki


     Prelegent opowiada艂 g艂贸wnie o podej艣ciu TDD do kt贸rego u偶ywa PHPSpec. Prezentacja bardziej na luzie, Leszek cz臋sto rzuca艂 ci臋tymi tekstami przez co publiczno艣膰 wybucha艂a 艣miechem. Wida膰, 偶e podczas przem贸wienia czuje si臋 swobodnie i prowadzi je na sw贸j charakterystyczny spos贸b. Jak b臋dziecie mieli okazj臋 zobaczy膰 go na jakiej艣 konferencji to naprawd臋 zach臋cam do uczestnictwa. Jak sam si臋 przedstawi艂: Lubi臋 piwo - uwierzcie mi... nadmieni臋 tylko, 偶e te偶 posiada certyfikacje ZCE & Symfony, organizuje PHPers'贸w, ponad 10 lat zwi膮zany z Symfony, prowadzi w艂asn膮 firm臋 CoCoders. 


Statyczna analiza aplikacji Symfony
Jakub Zalas

     Jakub na co dzie艅 prowadzi w艂asn膮 firm臋 艣wiadcz膮c膮 pomoc przy prowadzeniu zewn臋trznych projekt贸w. Przedstawi艂 ca艂e tony narz臋dzi i metodyk z kt贸rymi pracuj臋, pomagaj膮ce zrozumie膰 co w danym projekcie stanowi problem i gdzie nale偶y skupi膰 swoj膮 prac臋 by podnie艣膰 jego jako艣膰. Z analiz膮 statyczn膮 nie mia艂em wcze艣niej styczno艣ci, ale prezentacja pana Zalasa otworzy艂a mi oczy na pewn膮 spraw臋 - tworzenie dobrego projektu to nie tylko skupienie si臋 pisaniu kodu, ale te偶 analiza tego co do tej pory zosta艂o napisane. 




Framework agnostic application - will it fit with Symfony? 
Dariusz Drobisz


     Wiele ju偶 s艂ysza艂em o podej艣ciu Framework Agnostic czy architekturze hexagonalnej. Jednak materia艂y z kt贸rymi si臋 zetkn膮艂em (internet, konferencje) przedstawia艂y zagadnienia do艣膰 teoretycznie nie skupiaj膮c si臋 na implementacji nie m贸wi膮c nawet o przyk艂adach w PHP. Dariusz pokazuje jak mo偶na to zastosowa膰 w Symfony, pokazuj膮c struktur臋 aplikacji, jak czy艣ci膰 modele, tworzy膰 repozytoria, czy stosowa膰 wzorzec Command. 







殴le u偶ywasz Doctrine'a ! 
Tomasz Surowiec

     Jak autor podkre艣li艂 na starcie - tytu艂 mia艂 zaintrygowa膰, troch臋 podpu艣ci膰 publiczno艣膰 i by艂o to clickbait. Generalnie ca艂a prezentacji to same konkrety, przyk艂ady co mo偶esz zrobi膰 lepiej w swoim projekcie by efektywniej wykorzysta膰 Doctrine i napisany kod by艂 przyjemniejszy w utrzymaniu. Dla mnie by艂a to wiedza kt贸r膮 z dnia na dzie艅 mo偶na wcieli膰 w 偶ycie w projektach komercyjnych.




Podsumowuj膮c

Mo偶na powiedzie膰 (p贸艂 偶artem p贸艂 serio) 偶e tematami przewodnimi ca艂ej konferencji by艂y:

  • Rejestrowanie u偶ytkownika (xD),
  • Marco Pivetta nie lubi YAML (xD),
  • Dokumentacja Symfony pokazuje tylko jak wykorzysta膰 Symfony i nie jest wyznacznikiem projektowania aplikacji,
  • Uniezale偶nienie si臋 od frejmworka. 



pi膮tek, 7 czerwca 2019

Zend Framework zmienia si臋 w Laminas po piecz膮 Linux Foundation







ang. Laminas - liczba mnoga od Lamina - w wolnym t艂umaczeniu 'bardzo cienka warstwa'. Ma to przedstawia膰 g艂贸wn膮 ide臋 tw贸rc贸w - elementy kompozycyjne b膮d藕 warstwy aplikacji (Layered Architecture). 



Historia Zend Framework


Pierwsza stabilna wersja ujrza艂a 艣wiat艂o dzienne w 2007 roku lecz prac臋 nad nim si臋gaj膮 roku 2005. Jest to w zasadzie oficjalny framework PHP - mog臋 tak pisa膰 bo firma z kt贸rej si臋 wywodzi sprawuje piecz臋 na PHP. 

Na przestrzeni ostatnich lat jego popularno艣膰 spad艂a (413 milion贸w pobra艅 i tak robi wra偶enie) na rzecz Laravel'a i Symfony. Tak czy inaczej by艂 to pierwszy tak popularny framework PHP'a, w kt贸rym pisane by艂y znacz膮ce projekty, a developerzy z ca艂ego 艣wiata starali si臋 o certyfikacj臋.  

Od samego pocz膮tku istnienia, piecz臋 na ZF sprawowa艂 Zend Technologies, p贸藕niej Rogue Wave Software - to oni ca艂ymi latami przewodzili projektem jak i wyk艂adali na niego pieni膮dze. Koniec ko艅c贸w wykrystalizowa艂 si臋 ma艂y, dodatkowy zesp贸艂 developer贸w-pomocnik贸w, odgrywaj膮cy b膮d藕 co b膮d藕 du偶y wp艂yw przy codziennym utrzymaniu ekosystemu i prowadzeniu stron z nowo艣ciami dzi臋ki czemu g艂贸wny zesp贸艂 m贸g艂by skupi膰 si臋 na tym co najwa偶niejsze. 

Co teraz


Wszystkie projekty z ca艂ego ekosystemu Zend (Expressive, Apigility, MVC i inne niezale偶ne komponenty) staj膮 teraz pod szyldem Laminas. Zebrani specjali艣ci napisz膮 odpowiednie oprogramowanie do przerzucenia jak dot膮d napisanego kodu, zmieni膮 przestrzenie nazw i umo偶liwi膮 zachowanie kompatybilno艣ci wstecznej, dbaj膮c o utrzymanie napisanych przy pomocy tych narz臋dzi aplikacji biznesowych. To czym by艂 do teraz ZF zostanie zarchiwizowane i dalej dost臋pne na GitHub'ie tylko do odczytu, a wszystkie projekty dost臋pne na Packagist oznaczone jako Deprecated. Dla developer贸w pragn膮cych podnie艣膰 wersj臋 legacy system贸w stoj膮cych na ZF wkr贸tce zostan膮 udost臋pnione narz臋dzia to umo偶liwiaj膮ce, dzi臋ki czemu ca艂y proces zostanie zautomatyzowany i przeprowadzony mo偶liwie najmniej bole艣nie. 

The Linux Foundation


Jak mo偶na przeczyta膰 na oficjalnej stronie, jest to organizacja wspieraj膮ca projekty open source zar贸wno finansowo jak i zapewniaj膮c zasoby intelektualne, zaplecze techniczne czy organizacyjne (konferencje, warsztaty itp.). Jak rozk艂ada si臋 to na realne liczby? 
  • ~16 miliard贸w dolar贸w przeznaczonych na rozw贸j stu najwi臋kszych projekt贸w,
  • 35 tysi臋cy specjalist贸w rok rocznie bior膮cych udzia艂 we wszelkiej ma艣ci wydarzeniach, 
  • 1 milion profesjonalist贸w partycypuj膮cych w projektach pod piecz膮 fundacji. 
Do licznego grona projekt贸w pod skrzyd艂ami LF nale偶膮:
  • Jenkins,
  • Kubernetes,
  • Linux,
  • NodeJs,
  • JQuery.


Kiedy


Tw贸rcy zak艂adaj膮 偶e mo偶e to by膰 2-3 kwarta艂 tego roku. Wszystko zale偶y od zebrania odpowiednich ludzi jak i kwestii technicznych.


殴r贸d艂a

czwartek, 6 czerwca 2019

#1 PHP Errors & Exceptions - obiekty i klasy

  • PHP 7.3
  • bez deklarowania strict_types=1

Klasy i obiekty


FATAL ERROR - Instancjonowanie nieistniej膮cej klasy
new Example();
// Fatal Error: Uncaught Error: Class 'Example' not found

// -----------------------------------------
class Example {}

FATAL ERROR - Wywo艂anie nieistniej膮cej metody (ze statyczn膮 jest tak samo)
(new Example())->doesntExists();
/Fatal Error: Uncaught Error: Call to undefined method Example::doesntExists()


FATAL ERROR - Wywo艂anie nieistniej膮cego pola statycznego
Example::$nonExistentProperty;
// Fatal Error: Uncaught Error: Access to undeclared static property: Example::$nonExistentProperty

NOTICE - Wywo艂anie nieistniej膮cego pola 
(new Example)->nonExistentProperty;
// Notice: Undefined property: Example::$nonExistentProperty

// troch臋 inaczej

NOTICE NOTICE - Ciekawy przyk艂ad zahaczaj膮cy o Variable variables
class Example {
public $a = 5;
}
echo (new Example)->$a;
// Notice: Undefined variable: a
// Notice: Undefined property: Example::$

Jak wiadomo pierwszy Notice nie przerywa wykonywania kodu wi臋c jak interpreter pr贸buje wywo艂a膰 zmienn膮 nic to okazuje si臋 偶e nie ma pola nic klasy Example 

// -----------------------------------------

FATAL ERROR - Wywo艂anie pola prywatnego (z protected tak samo)
class Example { private $a = 5; }
(new Example)->a;
// Fatal Error: Uncaught Error: Cannot access private property Example::$a

FATAL ERROR - Wywo艂anie funkcji prywatnej (z protected tak samo)
class Example { private function foo() {} }
(new Example)->foo();
// Fatal Error: Uncaught Error: Call to private method Example::foo() from context

// -------- PHP 4 style constructor --------

class Example {
  public $a = 1;
function Example($a) {
$this->a = $a;
}
}

echo (new Example(2))->a; // 2


Powy偶sze wywo艂anie w PHP wersji 7.x powinno zwr贸ci膰 E_DEPRECATED (je偶eli w klasie nie jest zadeklarowany __construct()) - ale co mnie dziwi - w przypadku moich test贸w, stary styl konstruktora klasy po prostu zadzia艂a艂 bezb艂臋dnie. Takiego komunikatu si臋 spodziewa艂em: 


Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; Example has a deprecated constructor

Wi臋cej na:

https://www.php.net/manual/en/migration70.deprecated.php

// -----------------------------------------
DEPRECATED FATAL ERROR - Wywo艂anie metody z $this w statyczny spos贸b
class Example {
public $a = 1;
function foo() {
echo $this->a;
}
}
Example::foo();
// Deprecated: Non-static method Example::foo() should not be called statically 
// Fatal Error: Uncaught Error: Using $this when not in object context

// -----------------------------------------
FATAL ERROR - Wywo艂anie nieistniej膮cej sta艂ej klasy
class Example {}
echo Example::NON_EXISTEN_CONST;
// Fatal Error: Uncaught Error: Undefined class constant 'NON_EXISTEN_CONST'
// -----------------------------------------
RECOVERABLE ERROR - Kastowanie obiektu na string gdy jego klasa nie ma zaimplementowanej metody magiczne __toString()
class Example {}
$recoverable = new Example();
echo (string)$recoverable;
// Recoverable fatal error: Object of class Example could not be converted to string

RECOVERABLE ERROR - Kastowanie obiektu na string (poprzez wy艣wietlenie go konstruktem echogdy jego klasa ma zaimplementowan膮 metod臋 magiczn膮 __toString() zwracaj膮c膮 integer
class Example {
public function __toString() {
return 1;
}
}
$recoverable = new Example();
echo $recoverable;
// Recoverable fatal error: Method Example::__toString() must return a string value

  • E_RECOVERABLE_ERROR (4094) (od wersji 5.2) - Fatal Error do przechwycenia. Okre艣la prawdopodobnie gro藕n膮 sytuacj臋, ale nie pozostawia silnika PHP w niestabilnym stanie. Je偶eli programista nie napisa艂 w艂asnego handlera do obs艂ugi b艂臋du (set_error_handler()) to program przerwie wykonywanie jak w przypadku E_ERROR. Warto nadmieni膰 偶e w PHP 5.x powodowa艂o to z mety zatrzymanie skryptu, od wersji 7.0 si臋 to jednak zmieni艂o.


// s艂owo kluczowe final... i nie tylko -----
FATAL ERROR - Dziedziczenie po klasie finalnej gdzie istotny czynnik odgrywa fakt, 偶e klasa rodzica korzysta z nazwy zarezerwowanej (tak samo ze s艂owem kluczowym self)
final class Parent {}
class Child extends Parent {}
Fatal error: Cannot use 'Parent' as class name as it is reserved
Generuje b艂膮d nie do przechwycenia. 

FATAL ERROR - Wywo艂anie nieistniej膮cej sta艂ej klasy
final class Parent1 {}
class Child extends Parent1 {}
// Fatal error: Class Child may not inherit from final class (Parent1)
Generuje b艂膮d nie do przechwycenia.