デコレータパターンを必要とするコードに取り組んでいるので、__callマジックメソッドを処理して本当に簡単に使用できるようにしたかったのです。
実際のところ、デコレータパターンを使用する場合(ここでは、シングルトンを追加し、いくつかのメソッドを追加し、他のメソッドを禁止します)、一部のメソッドをオーバーライドする必要はありません。したがって、__ callを使用することは、コードを単純化するための良い方法です。
いくつかのメソッドが参照によって渡される引数を必要とするとき、私の状況は起こります。
例を挙げると、PDOを装飾するXPDOクラスを作成しました。以前のケースではありませんが、それを示すことはできません。
<?php
class XPDO{
private static $dbInstance=null;
private $pdoConnexion;
static function getInstance(){
if(self::$dbInstance ==null){
self::$dbInstance = new XPDO(/*tes params*/);
}
return self::$dbInstance;
}
private function __clone(){
}
private function __construct(){
$this->pdoConnexion = new PDO('mysql:localhost;dbname=blog','root','');
}
/**
*on possède toutes les méthodes de PDO mais en plus certaines qui nous sont propres ou qui
*surchargent/limitent celles de PDO si telles qu'elles sont implémentées dans PDO, on ne les aime pas.
*/
public function __call($method, $args){
if(is_callable(array($this,$method))){
return call_user_func_array(array($this,$method),$args);
}else if(is_callable(array($this->pdoConnexion,$method))){
return call_user_func_array(array($this->pdoConnexion,$method),$args);
}
}
/**
*
*@param string $query the query we want to add the where
*@param string $param name of the column
*@return string the identifier that we would use to bind a value
*/
private function addAndWhere(&$query,$param){
$uid = rand(1,100000);
if(strpos($query,'WHERE')){
$query.= ' AND '.$param.'=:'.$param.$uid;
}else{
$query.= ' WHERE '.$param.'=:'.$param.$uid;
}
return $param.$uid;
}
}
$pdo = XPDO::getInstance();
$query = 'SELECT * FROM sometable';
var_dump($pdo->addAndWhere($query,'smth'));
var_dump($query);
addAndWhereは参照を予期し、コピーが提供されるため、これは失敗します。このコードは、addAndWhereをpublicに渡すことで簡単に修正でき、意味があります。これは単なる例です。ここで、参照が必要なのはPDOであり、あなたが私の主張を理解したと想像してください。