PHP's FIG and PSRs

  • 2,357 views
Uploaded on

An introduction to the FIG and PSR in the PHP scene

An introduction to the FIG and PSR in the PHP scene

More in: Technology , Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,357
On Slideshare
0
From Embeds
0
Number of Embeds
4

Actions

Shares
Downloads
14
Comments
0
Likes
6

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