PHP’s FIG and PSRs* *or how to come up with a title made up of acronyms miércoles 6 de noviembre de 13
May 11, 2015
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
I was born in Spain
I work in London
Javier López
miércoles 6 de noviembre de 13
Lead Engineer at Time OutPreviously 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
Framework InteroperabilityGroup
#1
miércoles 6 de noviembre de 13
David Zülke M. Dowling Ivan Habunek Kris Wallsmith Paul Jones Larry Masters Jordi Boggiano
Leo Feyer G. Blanco Larry Garfield André Romcke K. Dambekalns Lukas Smith Don Gilbert
Taylor Otwell Nate Abele Brett Bieber Nils Adermann Mike van Riel Paul Dragoonis Will Durand
P. Sturgeon Evert Pot John Mertic B. Schussek Cal Evans Alex. Makarov Pádraic Brady
miércoles 6 de noviembre de 13
Do you want to become a member?
miércoles 6 de noviembre de 13
PHPStandardsRecomendation
#2
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 de 13
PSR-0Autoloading
miércoles 6 de noviembre de 13
\<Vendor Name>\(<Namespace>\)*<Class Name>
miércoles 6 de noviembre de 13
/path/to/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
\Doctrine\Common\IsolatedClassLoader
miércoles 6 de noviembre de 13
/path/to/lib/vendor/Zend/Acl.php
\Zend\Acl
miércoles 6 de noviembre de 13
/path/to/lib/vendor/Vendor/Package/Class/Subclass.php
\Vendor\Package\Class_Subclass
miércoles 6 de noviembre de 13
/path/to/lib/vendor/Vendor/With_Underscores/Class.php
\Vendor\With_Underscores\Class
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-1Basics 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 beUPPERCASED_WITH_UNDERSCORES_SEPARATORS
miércoles 6 de noviembre de 13
Class methods declared in camelCase
miércoles 6 de noviembre de 13
PSR-2Coding Styling Guide
miércoles 6 de noviembre de 13
Namespaces and classes follow PSR-1
miércoles 6 de noviembre de 13
<?phpnamespace Vendor\Package;
use FooInterface;use BarClass as Bar;use OtherVendor\OtherPackage\BazClass;
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
<?phpnamespace Vendor\Package;
use FooInterface;use BarClass as Bar;use OtherVendor\OtherPackage\BazClass;
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 }}
\LF
\LF
\LF
\LF
\LF
\LF
\LF
\LF
\LF
\LF
\LF
\LF\LF
\LF
\LF
\LF
\LF
\LF
\LF
\LF
\LFmiércoles 6 de noviembre de 13
<?phpnamespace Vendor\Package;
use FooInterface;use BarClass as Bar;use OtherVendor\OtherPackage\BazClass;
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 }}
80 120
miércoles 6 de noviembre de 13
<?phpnamespace Vendor\Package;
use FooInterface;use BarClass as Bar;use OtherVendor\OtherPackage\BazClass;
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
PHP keywords all lowercase
miércoles 6 de noviembre de 13
true, false and null all lowercase
miércoles 6 de noviembre de 13
<?phpnamespace Vendor\Package;
use FooInterface;use BarClass as Bar;use OtherVendor\OtherPackage\BazClass;
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 }}
\LF
\LF
miércoles 6 de noviembre de 13
<?phpnamespace Vendor\Package;
use FooInterface;use BarClass as Bar;use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface{ public $foo = null;
final public static function bar($arg1, &$arg2) { // body }}
miércoles 6 de noviembre de 13
<?phpnamespace Vendor\Package;
use FooInterface;use BarClass as Bar;use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface{ public $foo = null;
final public static function bar($arg1, &$arg2) { // body }}
miércoles 6 de noviembre de 13
<?phpnamespace Vendor\Package;
use FooInterface;use BarClass as Bar;use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface{ public $foo = null;
final public static function bar($arg1, &$arg2) { // body }}
miércoles 6 de noviembre de 13
<?phpnamespace Vendor\Package;
use FooInterface;use BarClass as Bar;use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface{ public $foo = null;
final public static function bar($arg1, &$arg2) { // body }}
miércoles 6 de noviembre de 13
<?phpnamespace Vendor\Package;
use FooInterface;use BarClass as Bar;use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface{ public $foo = null;
final public static function bar($arg1, &$arg2) { // body }}
miércoles 6 de noviembre de 13
<?phpnamespace Vendor\Package;
use FooInterface;use BarClass as Bar;use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface{ public $foo = null;
final public static function bar($arg1, &$arg2) { // body }}
miércoles 6 de noviembre de 13
<?phpnamespace Vendor\Package;
use FooInterface;use BarClass as Bar;use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface{ public $foo = null;
final public static function bar($arg1, &$arg2) { // body }}
miércoles 6 de noviembre de 13
<?phpnamespace Vendor\Package;
use FooInterface;use BarClass as Bar;use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface{ public $foo = null;
final public static function bar($arg1, &$arg2) { // body }}
miércoles 6 de noviembre de 13
<?phpnamespace Vendor\Package;
use FooInterface;use BarClass as Bar;use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface{ public $foo = null;
final public static function bar($arg1, &$arg2) { // body }}
miércoles 6 de noviembre de 13
and the list goes on and on and on
http://www.php-fig.org/psr/psr-2/
... methods and function calls ... control structures ... closures ... multiple lines ...
miércoles 6 de noviembre de 13
> 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-3Logger Interface
miércoles 6 de noviembre de 13
<?php
namespace Psr\Log;
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
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
RFC 5424
miércoles 6 de noviembre de 13
$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
Helper classes and interfaces
miércoles 6 de noviembre de 13
<?php
namespace Psr\Log;
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
<?php
namespace Psr\Log;
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
<?php
namespace Psr\Log;
class NullLogger extends AbstractLogger{ public function log($level, $message, array $context = array()) {
}}
miércoles 6 de noviembre de 13
<?php
namespace Psr\Log;
interface LoggerAwareInterface{ public function setLogger(LoggerInterface $logger);}
miércoles 6 de noviembre de 13
<?php
namespace Psr\Log;
class LogLevel{ const EMERGENCY = 'emergency'; const ALERT = 'alert'; const CRITICAL = 'critical'; const ERROR = 'error'; const WARNING = 'warning'; const NOTICE = 'notice'; const INFO = 'info'; const DEBUG = 'debug';}
miércoles 6 de noviembre de 13
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
SoWhatNow?
#3
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