У меня есть некоторые проблемы в моем собственном проекте. Я пишу простую систему экзаменов и для своего удобства использую Late Static Bindings. У меня есть следующий код:
<?php
class Controler {
public $dir;
public $name;
public $file;
public function __construct( $dir = ST_CONTROL_DIR ) {
$this->dir = $dir;
}
public function __call( $name, $arguments = array() ) {
$this->name = &$name;
$this->file = $this->dir . $this->name . '.php';
var_dump(get_called_class());
$result = $this->controler_include( ... $arguments );
return $result;
}
public static function __callStatic( $name, $arguments = array() ) {
var_dump(get_called_class());
$obj = new static();
return $obj->$name( ... $arguments );
}
private final function controler_include(){
return include $this->file;
}
}
class Router extends Controler {
public function __construct(){
parent::__construct(ST_ROUTER_DIR);
}
}class Routing {
protected $action;
protected $params;
protected $reffer;
static public function initialize(){
global $ROUTER;
$ROUTER = new self;
}
static public function process(){
global $ROUTER;
xdebug_start_trace( ST_DIR.'trace' );
if($ROUTER->action == 'api'){
$ROUTER->action = array_shift( $ROUTER->params );
trig( 'router_process_api_before' );
return Api::{ $ROUTER->action }( ... $ROUTER->params );
} else {
trig( 'router_process_before' );
return Router::{$ROUTER->action}( ... $ROUTER->params );
}
xdebug_stop_trace();
}
}
Мои методы написаны в отдельных файлах. Кроме того, класс Router является дочерним по отношению к Controler и отличается только папками, которые содержат свои файловые методы.
Я делаю GET-query / login и класс Routing выполняет построение этой страницы, используя следующий код:
<?php
reg( 'view_header_css', function(){
?><link href="<?php echo ST_CSS_PATH ?>login.css" rel="stylesheet"><?php
});
Controler::{'message'}();
Я хочу позвонить статический метод из Controler-класс Вот. Мой результат:
string 'Router' (length=6)
string 'Router' (length=6)
Трассировка XDebug:
TRACE START [2017-01-17 00:19:00]
0.0292 414792 -> trig('router_process_before') /public_html/vendor/core/Routing.php:40
0.0293 414888 -> func_get_args() /public_html/vendor/core/Core.php:87
>=> array (0 => 'router_process_before')
0.0293 414936 -> Core->trig($name = 'router_process_before') /public_html/vendor/core/Core.php:87
0.0293 414984 -> func_get_args() /public_html/vendor/core/Core.php:58
>=> array (0 => 'router_process_before')
0.0293 415288 -> array_shift(array (0 => 'router_process_before')) /public_html/vendor/core/Core.php:59
>=> 'router_process_before'
0.0294 415200 -> func_num_args() /public_html/vendor/core/Core.php:61
>=> 1
>=> NULL
>=> NULL
0.0294 415008 -> Router::login() /public_html/vendor/core/Routing.php:41
0.0295 415192 -> Controler::__callStatic($name = 'login', $arguments = array ()) /public_html/vendor/core/Routing.php:41
0.0295 415376 -> Router->__construct() /public_html/vendor/core/Controler.php:44
0.0295 415544 -> Controler->__construct($dir = '/public_html/vendor/router/') /public_html/vendor/core/Routing.php:77
>=> NULL
>=> NULL
0.0295 415712 -> Router->login() /public_html/vendor/core/Controler.php:45
0.0296 416072 -> Controler->__call($name = 'login', $arguments = array ()) /public_html/vendor/core/Controler.php:45
0.0296 416344 -> get_called_class() /public_html/vendor/core/Controler.php:25
>=> 'Router'
0.0296 416424 -> var_dump('Router') /public_html/vendor/core/Controler.php:25
>=> NULL
0.0297 416344 -> file_exists('/public_html/vendor/router/login.php') /public_html/vendor/core/Controler.php:33
>=> TRUE
0.0297 416328 -> Controler->controler_include() /public_html/vendor/core/Controler.php:38
0.0299 420376 -> include(/public_html/vendor/router/login.php) /public_html/vendor/core/Controler.php:48
0.0300 420784 -> reg('view_header_css', class Closure { }) /public_html/vendor/router/login.php:4
0.0300 420968 -> func_get_args() /public_html/vendor/core/Core.php:86
>=> array (0 => 'view_header_css', 1 => class Closure { })
0.0300 420920 -> Core->reg($name = 'view_header_css', $callback = class Closure { }, $order = ???) /public_html/vendor/core/Core.php:86
0.0301 421016 -> is_null(NULL) /public_html/vendor/core/Core.php:45
>=> TRUE
>=> NULL
>=> NULL
0.0301 421384 -> Controler->message() /public_html/vendor/router/login.php:7
0.0302 421568 -> Controler->__call($name = 'message', $arguments = array ()) /public_html/vendor/router/login.php:7
0.0302 421696 -> get_called_class() /public_html/vendor/core/Controler.php:25
>=> 'Router'
0.0302 421776 -> var_dump('Router') /public_html/vendor/core/Controler.php:25
>=> NULL
0.0302 421696 -> file_exists('/public_html/vendor/router/message.php') /public_html/vendor/core/Controler.php:33
>=> FALSE
0.0304 438336 -> EControlerNotFound->__construct($object = class Router { public $dir = '/public_html/vendor/router/'; public $name = 'message'; public $file = '/public_html/vendor/router/message.php' }, $name = 'message', $file = '/public_html/vendor/router/message.php') /public_html/vendor/core/Controler.php:35
0.0308 19352
TRACE END [2017-01-17 00:19:00]
Если я позвоню View :: {‘message’} — все будет хорошо. (Вид — дитя Контролера)
Теперь мой вопрос: кто-нибудь может объяснить, почему PHP выполняет нестатический метод дочернего класса, когда я вызываю статический метод родителя?
Задача ещё не решена.
Других решений пока нет …