Суть в следующем: хочу спрятать создание объекта и вызов его функций за фасадом.
Превратить это:
$session=new Session();
$session->get('key');
в это:
Session::get('key');
На данный момент имею следующее:
namespace facades;
abstract class Facade{
protected static $instance=[];
public static function __callStatic($method, $args){
$instance = static::instance();
return call_user_func_array([$instance,$method],$args);
}
protected static function instance(){
$accessor=static::accessor();
if( !static::$instance[$accessor] instanceof $accessor ){
static::$instance[$accessor]=new $accessor;
}
return static::$instance[$accessor];
}
abstract protected static function accessor():string;
}
В моем случае все потомки реализуя метод accessor возвращают название класса для которого будет использован фасад.
Все работает, но возник такой вопрос. Если объекту требуется передать параметры в конструктор моя схема крашится. Ибо в данном случае подобная возможность не реализована. Так вот. Каким способом лучше всего порождать объекты в моем случае? Переложить это в потомка или в отдельный класс?