Skip to content

Instantly share code, notes, and snippets.

@timothylhuillier
Forked from Anahkiasen/facades.php
Created August 17, 2013 22:42
Show Gist options
  • Save timothylhuillier/6259052 to your computer and use it in GitHub Desktop.
Save timothylhuillier/6259052 to your computer and use it in GitHub Desktop.
<?php
// Les instances en temps normal
//////////////////////////////////////////////////////////////////////
// En PHP, quand on a une classe non-statique, il faut d'abord l'instancier
// en faisant `new MyClass`. On place cette instance dans une variable, ensuite
// on appelle les méthodes sur la variables, comme ceci :
$elastica = new Elastica\Client('123456789');
$results = $elastica->search('foobar');
// Les classes statiques
//////////////////////////////////////////////////////////////////////
// Une classe statique est une classe n'ayant pas besoin d'être instanciée pour être
// utilisée, la plupart sont soit "stateless" soit des singletons
// C'est-à-dire que vous qu'on appelle toujours la même classe on ne peut pas avoir différentes
// instances de cette classe en même temps
// Si la classe d'avant avait été statique, cela aurait ressemblé à ça :
Elastica\Client::setKey('123456789');
$results = Elastica\Client::search('foobar');
// Comme la classe est statique, elle utilise toujours les mêmes identifiants (123456789)
// Si on veut avoir les résultats avec d'autres identifiants, il faut faire ça :
Elastica\Client::setKey('azertyuiop');
$results = Elastica\Client::search('foobar');
// Alors qu'avec une classe non-statique on peut faire ça :
$elasticaUn = new Elastica\Client('123456789');
$elasticaDeux = new Elastica\Client('azertyuiop');
// Et utilise n'importe laquelle des deux quand on veut
$results = $elasticaUn->search('foobar');
// Les facades
//////////////////////////////////////////////////////////////////////
// Une facade comme celles de Laravel est un type particulier de "décorateur"
// Elle permet de faire comme si une classe non-statique était une classe statique
// Voilà un exemple de facade faite à la main
class ElasticaFacade
{
/**
* Ici on utilise la méthode __callStatic de PHP : quand on va appeler
* une méthode statique sur cette classe (ElasticaFacade::truc) et qu'elle
* n'existe pas, PHP va exécuter cette méthode en nous donnant la méthode
* qu'on a cherché à exécuter, et ses arguments
*
* @param string $method
* @param array $arguments
*
* @return mixed
*/
public static function __callStatic($method, $arguments)
{
// On crée notre instance
$elastica = new Elastica\Client('123456789');
// Et on utilise call_user_func_array qui va appeler la méthode qu'on a
// voulu appeler et la passer à une autre classe, ici notre instance
// de Elastica créée juste au dessus
return call_user_func_array([$elastica, $method], $arguments);
}
}
// Les facades dans Laravel
//////////////////////////////////////////////////////////////////////
// La classe Illuminate\Support\Facades\Facade fait exactement la même chose
// qu'au dessus, mais couplée à un IoC Container
// Rappel, un container est une sorte "d'array" dans lequel on stocke des
// instances de classes (en gros) :
$container = array();
$container['url'] = new UrlGenerator;
$container['html'] = new HtmlBuilder($container['url']);
$container['elastica'] = new Elastica\Client('123456789');
// Toutes les facades de Laravel ont accès à ce container global,
// tout ce qu'on a à leur dire, c'est quelle classe sortir du container :
class ElasticaFacade extends Facade
{
public function getFacadeAccessor()
{
return 'elastica';
}
}
// Ce qui veut dire que ça :
$elastica = new Elastica\Client('123456798');
$results = $elastica->search('foobar');
// Est identique à ça :
$results = $container['elastica']->search('foobar');
// Est identique à ça :
$results = ElasticaFacade::search('foobar');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment