Как реализовать «обратный» порядок вызова методов класса PHP?
А какова цель? Получить более естественный, легко читаемый код?
Чем не нравится конструкция типа: $this->template('templateName')->withData($array)->render()
Есть еще вариантик - перекрыть в Template метод __toString():
В render устанавливаете имя шаблона, в withData параметры.
В __toString вызываете непосредственно render с установленными ранее именем шаблона и параметрами.
Тогда весь вызов будет как (string)$tpl->render('templateName')->withData($dataArray)
Так или иначе, вам придется определять какой-то терминальный метод. Просто во втором случае он неявно вызывается, в том числе и в конструкциях типа $html = "<some html code>$tpl</some html code>"
$cookie = Cookie::make('name', 'value');
return Response::make($content)->withCookie($cookie);
Тот, кто получит Response, сам отправит данные в браузер. Попробуйте их схему применить в случае, если make($content) непосредственно отправляет контент в браузер - не получится.
Потому что вы данные отправите в браузер, а заголовок уже не сможете, так как перед этим отправлены данные.
Это все называется fluent interface или текучий интерфейс.
Но он был придуман не для того, чтобы выполнять методы в произвольном порядке, а для того, что бы писать более компактный и читаемый код.
Но я вот еще что придумал, пример (могут быть ошибки, не запускал)class SomeFreakyEntity {
    var param1, param2;
    public function terminalMethod(){
    // Этот метод всегда выполняет некое действие с настроенным объектом, конец текучего интерфейса
        var_dump($this);     
    }
    public function withSomeParams1($value){
        $this->param1 = $value;
        return $this;
    }
    public function withSomeParams2($value){
        $this->param2 = $value;
        return $this;
    }
    // Ловим любой вызов необъявленного статического метода
    public static function __callStatic($method, $arguments){
        $o = new __CLASS__;
        return call_user_func_array(array($o, $method), $arguments)        
    }
}
Теперь можно писать как-то так:SomeFreakyEntity::terminalMethod();
SomeFreakyEntity::withSomeParams1('blabla')->terminalMethod();
SomeFreakyEntity::withSomeParams2('blabla')->terminalMethod();
SomeFreakyEntity::withSomeParams2('blabla')->withSomeParams1('blabla')->terminalMethod();
SomeFreakyEntity::withSomeParams1('blabla')->withSomeParams2('blabla')->terminalMethod();
А в вашем случае Template::withData($dataArray)->render('templateName')