PHP's FIG and PSRs

2,868
-1

Published on

An introduction to the FIG and PSR in the PHP scene

Published in: Technology, Education
1 Comment
9 Likes
Statistics
Notes
  • http://www.dbmanagement.info/Tutorials/MYSQL-PHP.htm
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
2,868
On Slideshare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
26
Comments
1
Likes
9
Embeds 0
No embeds

No notes for slide

PHP's FIG and PSRs

  1. 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. 2. ABOUT ME miércoles 6 de noviembre de 13
  3. 3. Javier López I work in London I was born in Spain miércoles 6 de noviembre de 13
  4. 4. Lead Engineer at Time Out Previously worked for IPC Media and Sensio Labs miércoles 6 de noviembre de 13
  5. 5. www.desymfony.com me miércoles 6 de noviembre de 13
  6. 6. AGENDA miércoles 6 de noviembre de 13
  7. 7. 1. FIG 2. PSRs 3. SWN miércoles 6 de noviembre de 13
  8. 8. #1 Framework Interoperability Group miércoles 6 de noviembre de 13
  9. 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. 10. Do you want to become a member? miércoles 6 de noviembre de 13
  11. 11. #2 PHP Standards Recomendation miércoles 6 de noviembre de 13
  12. 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. 13. PSR-0 Autoloading miércoles 6 de noviembre de 13
  14. 14. <Vendor Name>(<Namespace>)*<Class Name> miércoles 6 de noviembre de 13
  15. 15. DoctrineCommonIsolatedClassLoader /path/to/lib/vendor/Doctrine/Common/IsolatedClassLoader.php miércoles 6 de noviembre de 13
  16. 16. ZendAcl /path/to/lib/vendor/Zend/Acl.php miércoles 6 de noviembre de 13
  17. 17. VendorPackageClass_Subclass /path/to/lib/vendor/Vendor/Package/Class/Subclass.php miércoles 6 de noviembre de 13
  18. 18. VendorWith_UnderscoresClass /path/to/lib/vendor/Vendor/With_Underscores/Class.php miércoles 6 de noviembre de 13
  19. 19. SplClassLoader implementation http://gist.github.com/221634 miércoles 6 de noviembre de 13
  20. 20. Composer http://getcomposer.org miércoles 6 de noviembre de 13
  21. 21. PSR-1 Basics Coding Standards miércoles 6 de noviembre de 13
  22. 22. Files must use only <?php and <? tags miércoles 6 de noviembre de 13
  23. 23. Files SHOULD either declare symbols or cause side-effects but SHOULD NOT do both. miércoles 6 de noviembre de 13
  24. 24. Namespaces and classes follow PSR-0 miércoles 6 de noviembre de 13
  25. 25. Class names declared in StuldyCaps miércoles 6 de noviembre de 13
  26. 26. Class constants MUST be UPPERCASED_WITH_UNDERSCORES_SEPARATORS miércoles 6 de noviembre de 13
  27. 27. Class methods declared in camelCase miércoles 6 de noviembre de 13
  28. 28. PSR-2 Coding Styling Guide miércoles 6 de noviembre de 13
  29. 29. Namespaces and classes follow PSR-1 miércoles 6 de noviembre de 13
  30. 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. 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. 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. 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. 34. PHP keywords all lowercase miércoles 6 de noviembre de 13
  35. 35. true, false and null all lowercase miércoles 6 de noviembre de 13
  36. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 47. > phpcs --standard=PSR2 *.php https://github.com/squizlabs/PHP_CodeSniffer miércoles 6 de noviembre de 13
  48. 48. > php php-cs-fixer.phar fix . https://github.com/fabpot/PHP-CS-Fixer miércoles 6 de noviembre de 13
  49. 49. PSR-3 Logger Interface miércoles 6 de noviembre de 13
  50. 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. 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. 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. 53. Helper classes and interfaces miércoles 6 de noviembre de 13
  54. 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. 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. 56. <?php namespace PsrLog; class NullLogger extends AbstractLogger { public function log($level, $message, array $context = array()) { } } miércoles 6 de noviembre de 13
  57. 57. <?php namespace PsrLog; interface LoggerAwareInterface { public function setLogger(LoggerInterface $logger); } miércoles 6 de noviembre de 13
  58. 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. 59. https://github.com/php-fig/log miércoles 6 de noviembre de 13
  60. 60. {     "require": {         "psr/log": "dev-master"     } } miércoles 6 de noviembre de 13
  61. 61. Monolog https://github.com/Seldaek/monolog miércoles 6 de noviembre de 13
  62. 62. #3 So What Now? miércoles 6 de noviembre de 13
  63. 63. PSR-4? miércoles 6 de noviembre de 13
  64. 64. My humble opinion miércoles 6 de noviembre de 13
  65. 65. Thanks! Questions? @loalf miércoles 6 de noviembre de 13
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×