Last active
December 21, 2015 05:39
-
-
Save Anahkiasen/6259019 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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