Показать сообщение отдельно

  #1  
Старый 19.01.2017, 20:55
t0ma5
Постоянный
Регистрация: 10.02.2012
Сообщений: 830
С нами: 7502006

Репутация: 90


По умолчанию

Цитата:
Сообщение от crlf  

Затянуло меня это задание, второй день копаюсь
Но скила не хватает, правильно ли я понимаю, что главная фишка в поведении ArrayAccess?
не то слово, я пару дней спать нормально не могу.. забрался далеко, но не достаточно(

всё верно, фишка в ArrayAccess, маппер, который в конструкторе класса User

Код:
public function __construct() {
        parent::__construct($this, array(
            'id'   => array('type' => 'function', 'target' => 'id'),
            'name' => array('type' => 'function', 'target' => 'name')
        ));
    }
определяет какая функцию этого класса будет вызвана, причем передавать параметры в вызов мы не можем, ибо вызов у нас один в файле demo.php

Код:
$name = $user->name; // Getting the current user name
маппер передаётся сериализованным от клиента, другими словами мы можем подделать вызов функции на нужную переопределив вызываемый класс, он хранится в GenericMapper( который отнаследован от ArrayAccess ) $this->realObject

чего я смог добиться... отправляю класс User и класс Debug

в дебаг классе переопределяю переменную debugStateName с _DEBUG на flag, затем вызываю через модифицированный маппер функцию debugStateName( которая в debug классе )

Код:
public function getDebugState() {
        return $GLOBALS[$this->debugStateName];
    }
в итоге мы получаем в $name флаг

Код:
$name = $user->name; // Getting the current user name
но подвох в том что $name нигде не выводится

конечно мы можем вызвать showNice или show из дебаг класса, но вызов то подменить мы можем только один..

в общем я пока сам в тупике, могу скинуть рабочую версию скрипта, если нужно, который прокидывает в $name флаг
 
Ответить с цитированием