The PSR (PHP Standards Recommendation) is a series of recommendations put together by the FIG (Framework Interop Group).
"The idea behind the group is for project representatives to talk about the commonalities between our projects and find ways we can work together" - FIG FAQ
PSRs can be in the following states: Accepted, Review, Draft or Deprecated.
PSR-4 is an accepted recommendation that outlines the standard for autoloading classes via filenames. This recommendation is recommended as the alternative to the earlier (and now deprecated) PSR-0.
The fully qualified class name should match the following requirement:
\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
Alphabet
)Google\AdWord
)KeywordPlanner
)Thus the final class name would be Alphabet\Google\AdWord\KeywordPlanner
. The fully qualified class name should also translate into a meaningful file path therefore Alphabet\Google\AdWord\KeywordPlanner
would be located in [path_to_source]/Alphabet/Google/AdWord/KeywordPlanner.php
Starting with PHP 5.3.0, a custom autoloader function can be defined to load files based on the path and filename pattern that you define.
# Edit your php to include something like:
spl_autoload_register(function ($class) { include 'classes/' . $class . '.class.php';});
Replacing the location ('classes/') and filename extension ('.class.php') with values that apply to your structure.
Composer package manager supports PSR-4 which means, if you follow the standard, you can load your classes in your project automatically using Composer's vendor autoloader.
# Edit the composer.json file to include
{
"autoload": {
"psr-4": {
"Alphabet\\": "[path_to_source]"
}
}
}
Regenerate the autoloader file
$ composer dump-autoload
Now in your code you can do the following:
<?php
require __DIR__ . '/vendor/autoload.php';
$KeywordPlanner = new Alphabet\Google\AdWord\KeywordPlanner();
PSR-1 is an accepted recommendation and outlines a basic standard recommendation for how code should be written.
<?php
and <?=
but not <?
.PSR-8 is a spoof PSR (currently in Draft) proposed by Larry Garfield as an April Fools joke on 1 April 2014.
The draft outlines how to define an interface to make an object Huggable
.
Excert from the code outline:
<?php
namespace Psr\Hug;
/**
* Defines a huggable object.
*
* A huggable object expresses mutual affection with another huggable object.
*/
interface Huggable
{
/**
* Hugs this object.
*
* All hugs are mutual. An object that is hugged MUST in turn hug the other
* object back by calling hug() on the first parameter. All objects MUST
* implement a mechanism to prevent an infinite loop of hugging.
*
* @param Huggable $h
* The object that is hugging this object.
*/
public function hug(Huggable $h);
}