Your SlideShare is downloading. ×
PHP's FIG and PSRs
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

PHP's FIG and PSRs

2,486
views

Published on

An introduction to the FIG and PSR in the PHP scene

An introduction to the FIG and PSR in the PHP scene

Published in: Technology, Education

0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,486
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
17
Comments
0
Likes
8
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. PHP’s FIG and PSRs* *or how to come up with a title made up of acronyms miércoles 6 de noviembre de 13
  • 2. ABOUT ME miércoles 6 de noviembre de 13
  • 3. Javier López I work in London I was born in Spain miércoles 6 de noviembre de 13
  • 4. Lead Engineer at Time Out Previously worked for IPC Media and Sensio Labs miércoles 6 de noviembre de 13
  • 5. www.desymfony.com me miércoles 6 de noviembre de 13
  • 6. AGENDA miércoles 6 de noviembre de 13
  • 7. 1. FIG 2. PSRs 3. SWN miércoles 6 de noviembre de 13
  • 8. #1 Framework Interoperability Group miércoles 6 de noviembre de 13
  • 9. David Zülke M. Dowling Leo Feyer G. Blanco Larry Garfield Taylor Otwell Nate Abele Brett Bieber P. Sturgeon Evert Pot John Mertic miércoles 6 de noviembre de 13 Ivan Habunek Kris Wallsmith Paul Jones Larry Masters Jordi Boggiano André Romcke K. Dambekalns Lukas Smith Don Gilbert Nils Adermann Mike van Riel Paul Dragoonis Will Durand B. Schussek Cal Evans Alex. Makarov Pádraic Brady
  • 10. Do you want to become a member? miércoles 6 de noviembre de 13
  • 11. #2 PHP Standards Recomendation miércoles 6 de noviembre de 13
  • 12. PSR-0 Autoloading PSR-1 Basic Coding Standards PSR-2 Coding Style Guide PSR-3 Logger Interface miércoles 6 de noviembre de 13
  • 13. PSR-0 Autoloading miércoles 6 de noviembre de 13
  • 14. <Vendor Name>(<Namespace>)*<Class Name> miércoles 6 de noviembre de 13
  • 15. DoctrineCommonIsolatedClassLoader /path/to/lib/vendor/Doctrine/Common/IsolatedClassLoader.php miércoles 6 de noviembre de 13
  • 16. ZendAcl /path/to/lib/vendor/Zend/Acl.php miércoles 6 de noviembre de 13
  • 17. VendorPackageClass_Subclass /path/to/lib/vendor/Vendor/Package/Class/Subclass.php miércoles 6 de noviembre de 13
  • 18. VendorWith_UnderscoresClass /path/to/lib/vendor/Vendor/With_Underscores/Class.php miércoles 6 de noviembre de 13
  • 19. SplClassLoader implementation http://gist.github.com/221634 miércoles 6 de noviembre de 13
  • 20. Composer http://getcomposer.org miércoles 6 de noviembre de 13
  • 21. PSR-1 Basics Coding Standards miércoles 6 de noviembre de 13
  • 22. Files must use only <?php and <? tags miércoles 6 de noviembre de 13
  • 23. Files SHOULD either declare symbols or cause side-effects but SHOULD NOT do both. miércoles 6 de noviembre de 13
  • 24. Namespaces and classes follow PSR-0 miércoles 6 de noviembre de 13
  • 25. Class names declared in StuldyCaps miércoles 6 de noviembre de 13
  • 26. Class constants MUST be UPPERCASED_WITH_UNDERSCORES_SEPARATORS miércoles 6 de noviembre de 13
  • 27. Class methods declared in camelCase miércoles 6 de noviembre de 13
  • 28. PSR-2 Coding Styling Guide miércoles 6 de noviembre de 13
  • 29. Namespaces and classes follow PSR-1 miércoles 6 de noviembre de 13
  • 30. <?php namespace VendorPackage; use FooInterface; use BarClass as Bar; use OtherVendorOtherPackageBazClass; class Foo extends Bar implements FooInterface { public function sampleFunction($a, $b = null) { if ($a === $b) { bar(); } elseif ($a > $b) { $foo->bar($arg1); } else { BazClass::bar($arg2, $arg3); } } final public static function bar() { // method body } } miércoles 6 de noviembre de 13
  • 31. <?php LF namespace VendorPackage; LF use FooInterface; LF use BarClass as Bar; LF use OtherVendorOtherPackageBazClass; LF class Foo extends Bar implements FooInterface LF { public function sampleFunction($a, $b = null) LF { LF if ($a === $b) { LF bar(); LF } elseif ($a > $b) { LF $foo->bar($arg1); LF } else { LF BazClass::bar($arg2, $arg3); LF } LF } LF final public static function bar() LF { LF // method body } LF } LF LF miércoles 6 de noviembre de 13
  • 32. <?php namespace VendorPackage; use FooInterface; use BarClass as Bar; use OtherVendorOtherPackageBazClass; class Foo extends Bar implements FooInterface { public function sampleFunction($a, $b = null) { if ($a === $b) { bar(); } elseif ($a > $b) { $foo->bar($arg1); } else { BazClass::bar($arg2, $arg3); } } final public static function bar() { // method body } } miércoles 6 de noviembre de 13 80 120
  • 33. <?php namespace VendorPackage; use FooInterface; use BarClass as Bar; use OtherVendorOtherPackageBazClass; class Foo extends Bar implements FooInterface { public function sampleFunction($a, $b = null) { if ($a === $b) { bar(); } elseif ($a > $b) { $foo->bar($arg1); } else { BazClass::bar($arg2, $arg3); } } final public static function bar() { // method body } } miércoles 6 de noviembre de 13
  • 34. PHP keywords all lowercase miércoles 6 de noviembre de 13
  • 35. true, false and null all lowercase miércoles 6 de noviembre de 13
  • 36. <?php namespace VendorPackage; LF use FooInterface; use BarClass as Bar; use OtherVendorOtherPackageBazClass; LF class Foo extends Bar implements FooInterface { public function sampleFunction($a, $b = null) { if ($a === $b) { bar(); } elseif ($a > $b) { $foo->bar($arg1); } else { BazClass::bar($arg2, $arg3); } } final public static function bar() { // method body } } miércoles 6 de noviembre de 13
  • 37. <?php namespace VendorPackage; use FooInterface; use BarClass as Bar; use OtherVendorOtherPackageBazClass; class Foo extends Bar implements FooInterface { public $foo = null; final public static function bar($arg1, &$arg2) { // body } } miércoles 6 de noviembre de 13
  • 38. <?php namespace VendorPackage; use FooInterface; use BarClass as Bar; use OtherVendorOtherPackageBazClass; class Foo extends Bar implements FooInterface { public $foo = null; final public static function bar($arg1, &$arg2) { // body } } miércoles 6 de noviembre de 13
  • 39. <?php namespace VendorPackage; use FooInterface; use BarClass as Bar; use OtherVendorOtherPackageBazClass; class Foo extends Bar implements FooInterface { public $foo = null; final public static function bar($arg1, &$arg2) { // body } } miércoles 6 de noviembre de 13
  • 40. <?php namespace VendorPackage; use FooInterface; use BarClass as Bar; use OtherVendorOtherPackageBazClass; class Foo extends Bar implements FooInterface { public $foo = null; final public static function bar($arg1, &$arg2) { // body } } miércoles 6 de noviembre de 13
  • 41. <?php namespace VendorPackage; use FooInterface; use BarClass as Bar; use OtherVendorOtherPackageBazClass; class Foo extends Bar implements FooInterface { public $foo = null; final public static function bar($arg1, &$arg2) { // body } } miércoles 6 de noviembre de 13
  • 42. <?php namespace VendorPackage; use FooInterface; use BarClass as Bar; use OtherVendorOtherPackageBazClass; class Foo extends Bar implements FooInterface { public $foo = null; final public static function bar($arg1, &$arg2) { // body } } miércoles 6 de noviembre de 13
  • 43. <?php namespace VendorPackage; use FooInterface; use BarClass as Bar; use OtherVendorOtherPackageBazClass; class Foo extends Bar implements FooInterface { public $foo = null; final public static function bar($arg1, &$arg2) { // body } } miércoles 6 de noviembre de 13
  • 44. <?php namespace VendorPackage; use FooInterface; use BarClass as Bar; use OtherVendorOtherPackageBazClass; class Foo extends Bar implements FooInterface { public $foo = null; final public static function bar($arg1, &$arg2) { // body } } miércoles 6 de noviembre de 13
  • 45. <?php namespace VendorPackage; use FooInterface; use BarClass as Bar; use OtherVendorOtherPackageBazClass; class Foo extends Bar implements FooInterface { public $foo = null; final public static function bar($arg1, &$arg2) { // body } } miércoles 6 de noviembre de 13
  • 46. and the list goes on and on and on ... methods and function calls ... control structures ... closures ... multiple lines ... http://www.php-fig.org/psr/psr-2/ miércoles 6 de noviembre de 13
  • 47. > phpcs --standard=PSR2 *.php https://github.com/squizlabs/PHP_CodeSniffer miércoles 6 de noviembre de 13
  • 48. > php php-cs-fixer.phar fix . https://github.com/fabpot/PHP-CS-Fixer miércoles 6 de noviembre de 13
  • 49. PSR-3 Logger Interface miércoles 6 de noviembre de 13
  • 50. <?php namespace PsrLog; interface LoggerInterface { public function alert($message, array $context = array()); public function critical($message, array $context = array()); public function error($message, array $context = array()); public function warning($message, array $context = array()); public function notice($message, array $context = array()); public function info($message, array $context = array()); public function debug($message, array $context = array()); public function log($level, $message, array $context = array()); } miércoles 6 de noviembre de 13
  • 51. RFC 5424 Emergency – the system is unusable Alert – immediate action is required Critical – critical conditions Error – errors that do not require immediate attention but should be monitored Warning – unusual or undesirable occurrences that are not errors Notice – normal but significant events Info – interesting events Debug – detailed information for debugging purposes http://tools.ietf.org/html/rfc5424 miércoles 6 de noviembre de 13
  • 52. $message = "{DB}: SELECT * FROM user"; $context = array("DB" => "MY_PROJECT"); $logger->debug($message, $context); // "MY PROJECT": SELECT * FROM user" miércoles 6 de noviembre de 13
  • 53. Helper classes and interfaces miércoles 6 de noviembre de 13
  • 54. <?php namespace PsrLog; abstract class AbstractLogger implements LoggerInterface {     public function emergency($message, array $context = array())     {         $this->log(LogLevel::EMERGENCY, $message, $context);     } . . .     public function debug($message, array $context = array())     {         $this->log(LogLevel::DEBUG, $message, $context);     } } miércoles 6 de noviembre de 13
  • 55. <?php namespace PsrLog; trait LoggerTrait {     public function emergency($message, array $context = array())     {         $this->log(LogLevel::EMERGENCY, $message, $context);     } . . .     abstract public function log($level, message, array $context) } miércoles 6 de noviembre de 13
  • 56. <?php namespace PsrLog; class NullLogger extends AbstractLogger { public function log($level, $message, array $context = array()) { } } miércoles 6 de noviembre de 13
  • 57. <?php namespace PsrLog; interface LoggerAwareInterface { public function setLogger(LoggerInterface $logger); } miércoles 6 de noviembre de 13
  • 58. <?php namespace PsrLog; class LogLevel { const EMERGENCY const ALERT const CRITICAL const ERROR const WARNING const NOTICE const INFO const DEBUG } miércoles 6 de noviembre de 13 = = = = = = = = 'emergency'; 'alert'; 'critical'; 'error'; 'warning'; 'notice'; 'info'; 'debug';
  • 59. https://github.com/php-fig/log miércoles 6 de noviembre de 13
  • 60. {     "require": {         "psr/log": "dev-master"     } } miércoles 6 de noviembre de 13
  • 61. Monolog https://github.com/Seldaek/monolog miércoles 6 de noviembre de 13
  • 62. #3 So What Now? miércoles 6 de noviembre de 13
  • 63. PSR-4? miércoles 6 de noviembre de 13
  • 64. My humble opinion miércoles 6 de noviembre de 13
  • 65. Thanks! Questions? @loalf miércoles 6 de noviembre de 13