PHP’s FIG and PSRs*

*or how to come up with a title made up of acronyms
miércoles 6 de noviembre de 13
ABOUT ME

miércoles 6 de noviembre de 13
Javier López

I work in London

I was born in Spain

miércoles 6 de noviembre de 13
Lead Engineer at Time Out
Previously worked for IPC Media and Sensio Labs

miércoles 6 de noviembre de 13
www.desymfony.com

me

miércoles 6 de noviembre de 13
AGENDA

miércoles 6 de noviembre de 13
1.

FIG

2.

PSRs

3.

SWN

miércoles 6 de noviembre de 13
#1
Framework
Interoperability
Group

miércoles 6 de noviembre de 13
David Zülke

M. Dowling

Leo Feyer

G. Blanco

Larry Garfield

Taylor Otwell

Nate Abele

Brett Bieber

P. Sturgeon

Evert ...
Do you want to become a
member?

miércoles 6 de noviembre de 13
#2
PHP
Standards
Recomendation

miércoles 6 de noviembre de 13
PSR-0 Autoloading
PSR-1 Basic Coding Standards
PSR-2 Coding Style Guide
PSR-3 Logger Interface

miércoles 6 de noviembre d...
PSR-0
Autoloading

miércoles 6 de noviembre de 13
<Vendor Name>(<Namespace>)*<Class Name>

miércoles 6 de noviembre de 13
DoctrineCommonIsolatedClassLoader
/path/to/lib/vendor/Doctrine/Common/IsolatedClassLoader.php

miércoles 6 de noviembre de...
ZendAcl
/path/to/lib/vendor/Zend/Acl.php

miércoles 6 de noviembre de 13
VendorPackageClass_Subclass
/path/to/lib/vendor/Vendor/Package/Class/Subclass.php

miércoles 6 de noviembre de 13
VendorWith_UnderscoresClass
/path/to/lib/vendor/Vendor/With_Underscores/Class.php

miércoles 6 de noviembre de 13
SplClassLoader implementation

http://gist.github.com/221634
miércoles 6 de noviembre de 13
Composer

http://getcomposer.org
miércoles 6 de noviembre de 13
PSR-1
Basics Coding Standards

miércoles 6 de noviembre de 13
Files must use only <?php and <? tags

miércoles 6 de noviembre de 13
Files SHOULD either declare symbols or
cause side-effects but SHOULD NOT do
both.

miércoles 6 de noviembre de 13
Namespaces and classes follow PSR-0

miércoles 6 de noviembre de 13
Class names declared in StuldyCaps

miércoles 6 de noviembre de 13
Class constants MUST be
UPPERCASED_WITH_UNDERSCORES_SEPARATORS

miércoles 6 de noviembre de 13
Class methods declared in camelCase

miércoles 6 de noviembre de 13
PSR-2
Coding Styling Guide

miércoles 6 de noviembre de 13
Namespaces and classes follow PSR-1

miércoles 6 de noviembre de 13
<?php
namespace VendorPackage;
use FooInterface;
use BarClass as Bar;
use OtherVendorOtherPackageBazClass;
class Foo exten...
<?php LF
namespace VendorPackage; LF
use FooInterface; LF
use BarClass as Bar; LF
use OtherVendorOtherPackageBazClass; LF
...
<?php
namespace VendorPackage;
use FooInterface;
use BarClass as Bar;
use OtherVendorOtherPackageBazClass;
class Foo exten...
<?php
namespace VendorPackage;
use FooInterface;
use BarClass as Bar;
use OtherVendorOtherPackageBazClass;
class Foo exten...
PHP keywords all lowercase

miércoles 6 de noviembre de 13
true, false and null all lowercase

miércoles 6 de noviembre de 13
<?php
namespace VendorPackage;
LF

use FooInterface;
use BarClass as Bar;
use OtherVendorOtherPackageBazClass;
LF

class F...
<?php
namespace VendorPackage;
use FooInterface;
use BarClass as Bar;
use OtherVendorOtherPackageBazClass;
class Foo exten...
<?php
namespace VendorPackage;
use FooInterface;
use BarClass as Bar;
use OtherVendorOtherPackageBazClass;
class Foo exten...
<?php
namespace VendorPackage;
use FooInterface;
use BarClass as Bar;
use OtherVendorOtherPackageBazClass;
class Foo exten...
<?php
namespace VendorPackage;
use FooInterface;
use BarClass as Bar;
use OtherVendorOtherPackageBazClass;
class Foo exten...
<?php
namespace VendorPackage;
use FooInterface;
use BarClass as Bar;
use OtherVendorOtherPackageBazClass;
class Foo exten...
<?php
namespace VendorPackage;
use FooInterface;
use BarClass as Bar;
use OtherVendorOtherPackageBazClass;
class Foo exten...
<?php
namespace VendorPackage;
use FooInterface;
use BarClass as Bar;
use OtherVendorOtherPackageBazClass;
class Foo exten...
<?php
namespace VendorPackage;
use FooInterface;
use BarClass as Bar;
use OtherVendorOtherPackageBazClass;
class Foo exten...
<?php
namespace VendorPackage;
use FooInterface;
use BarClass as Bar;
use OtherVendorOtherPackageBazClass;
class Foo exten...
and the list goes on and on and on
... methods and function calls
... control structures
... closures
... multiple lines
....
> phpcs --standard=PSR2 *.php

https://github.com/squizlabs/PHP_CodeSniffer

miércoles 6 de noviembre de 13
> php php-cs-fixer.phar fix .

https://github.com/fabpot/PHP-CS-Fixer

miércoles 6 de noviembre de 13
PSR-3
Logger Interface

miércoles 6 de noviembre de 13
<?php
namespace PsrLog;
interface LoggerInterface
{
public function alert($message, array $context = array());
public func...
RFC 5424
Emergency – the system is unusable
Alert – immediate action is required
Critical – critical conditions
Error – er...
$message = "{DB}: SELECT * FROM user";
$context = array("DB" => "MY_PROJECT");
$logger->debug($message, $context); // "MY ...
Helper classes and interfaces

miércoles 6 de noviembre de 13
<?php
namespace PsrLog;
abstract class AbstractLogger implements LoggerInterface
{
    public function emergency($message,...
<?php
namespace PsrLog;
trait LoggerTrait
{
    public function emergency($message, array $context = array())
    {
      ...
<?php
namespace PsrLog;
class NullLogger extends AbstractLogger
{
public function log($level, $message, array $context = a...
<?php
namespace PsrLog;
interface LoggerAwareInterface
{
public function setLogger(LoggerInterface $logger);
}

miércoles ...
<?php
namespace PsrLog;
class LogLevel
{
const EMERGENCY
const ALERT
const CRITICAL
const ERROR
const WARNING
const NOTICE...
https://github.com/php-fig/log

miércoles 6 de noviembre de 13
{
    "require": {
        "psr/log": "dev-master"
    }
}

miércoles 6 de noviembre de 13
Monolog

https://github.com/Seldaek/monolog
miércoles 6 de noviembre de 13
#3
So
What
Now?

miércoles 6 de noviembre de 13
PSR-4?

miércoles 6 de noviembre de 13
My humble opinion

miércoles 6 de noviembre de 13
Thanks! Questions?

@loalf
miércoles 6 de noviembre de 13
Upcoming SlideShare
Loading in …5
×

PHP's FIG and PSRs

3,106 views
2,951 views

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
3,106
On SlideShare
0
From Embeds
0
Number of Embeds
171
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

×