Собираются ли поправить ситуацию с атрибутами классов в PHP?

AmdY

Пью пиво
Команда форума
Кто лучше знает состояние дел и разбирается в Zend Engine, может в курсе будут ли делать более функциональными объявление атрибутов класса.
типа
PHP:
protected $delegate = new Delegate(); // создание класса
protected $preActionEvents = [function() { };]; // присвоение замыканий
 

tony2001

TeaM PHPClub
в смысле, можно ли будет использовать выражения в декларациях?
 

AmdY

Пью пиво
Команда форума
tony2001
угу, планируется ли такой функционал. и в чём причина того что этого нет - какие-то технические сложности или отсутствие большой надобности?
 

tony2001

TeaM PHPClub
причины - принципиально-архитектурные.
при декларации работает компилятор, который переводит код в байткод.
когда работает executor, все классы уже объявлены, функции задекларированы и т.п.
это две разные стадии работы.

то, что ты хочешь - это убрать первую и оставить только вторую или же совместить их каким-то образом.
 
  • Like
Реакции: AmdY

fixxxer

К.О.
Партнер клуба
Тони, а не знаешь, код замыканий до сих пор евалится в рантайме (и соответственно опкод кэшеры в пролете)?

Я с тех пор, как обнаружил это в девел-версии 5.3, их боюсь. А по коду что то сходу не пойму.
 

С.

Продвинутый новичок
Хотя я сам лично не испытаваю большой нехватки выражений в декларациях, но интересно, не будет ли просто сделать так, что компилятор неявно эмулирует присвоение в конструкторе?

Например:
PHP:
protected $delegate = new Delegate();
function __construct()
{
   $x= 0;
}
компилируется в:
PHP:
protected $delegate;
function __construct()
{
   $this->delegate = new Delegate();
   $x= 0;
}
 

tony2001

TeaM PHPClub
Тони, а не знаешь, код замыканий до сих пор евалится в рантайме (и соответственно опкод кэшеры в пролете)?

Я с тех пор, как обнаружил это в девел-версии 5.3, их боюсь. А по коду что то сходу не пойму.
Хз, гляну завтра.

Хотя я сам лично не испытаваю большой нехватки выражений в декларациях, но интересно, не будет ли просто сделать так, что компилятор неявно эмулирует присвоение в конструкторе?

Например:
PHP:
protected $delegate = new Delegate();
function __construct()
{
   $x= 0;
}
компилируется в:
PHP:
protected $delegate;
function __construct()
{
   $this->delegate = new Delegate();
   $x= 0;
}
Я считаю, что подобные предложения проще объяснять патчами.
Как можно сэмулировать экзекьютор в компиляторе? Я не знаю, извините.
 

Sender

Новичок
А зачем это надо? Какую проблему это решает? Что улучшает? Можно просто в конструкторе это и делать руками


Как вариант на правах бреда:

делаем phpdoc

@default Delegateblablablaparamsblablabla

в конструкторе считываем этот phpdoc и делаем как нам надо.
 

tony2001

TeaM PHPClub
Тони, а не знаешь, код замыканий до сих пор евалится в рантайме (и соответственно опкод кэшеры в пролете)?

Я с тех пор, как обнаружил это в девел-версии 5.3, их боюсь. А по коду что то сходу не пойму.
Фиксер, ты уверен, что так вообще было?
я вообще никакой связи не вижу между closures и eval.
 

fixxxer

К.О.
Партнер клуба
Уверен, у меня временно стоял (ставил в нехороших целях и забыл убрать) zend_printf в zend_compile_string (или как его), и при каждом выполнении скрипта (с включенными кэшами, ога) я наблюдал сорцы замыканий.
Если связи нет это очень хорошо. Но я повторю, чтоли, икспиримент =)
 

AmdY

Пью пиво
Команда форума
Ещё один вопрос по нейспейсам, ничего в голову не приходит.

Допустим я пишу свой бандл. Соответственно у меня есть директории с моделями и контроллерами
, всё грузится по PSR согласно этому дереву.
Контроллер называется Bundle\News\C\Front, модель Bundle\News\M\News в коде это выглядит так
PHP:
namespace Bundle\News\C; // в нейспейс приходится включать часть "С", вместо Bundle\News

use Kiss\Routing\Controller;
use Bundle\News\M; // лишний раз пишу use

class Front extends Controller // здесь хотелось бы объявить класс C\Front
{
    public function fooAction()
    {
        $model = new M\News();
        $model->find($this->getRoute()->get('id'));
        return $this->getResponseView('foo.html', ['model' => $model]);
    }
}
Хотелось бы нейспейс обявлять уровнем выше, а уже в названии класса-контроллера включать неймспейс контроллера, это бы позволило юзать модели и т.д. без use или полного пути
PHP:
namespace Bundle\News; // чистый неймспейс для всего бандла

use Kiss\Routing\Controller;

class C\Front extends Controller // неймспейс и класс контроллера
{
    public function fooAction()
    {
        $model = new M\News(); // вызов модели из неймспейса бандла.
        $model->find($this->getRoute()->get('id'));
        return $this->getResponseView('foo.html', ['model' => $model]);
    }
}
Или я плохо знаю неймспейсы и так можно делать или такого функционала нет?
 

fixxxer

К.О.
Партнер клуба
Уверен, у меня временно стоял (ставил в нехороших целях и забыл убрать) zend_printf в zend_compile_string (или как его), и при каждом выполнении скрипта (с включенными кэшами, ога) я наблюдал сорцы замыканий.
Если связи нет это очень хорошо. Но я повторю, чтоли, икспиримент =)
Провел, ничего не понял, теперь я там даже обычных евалов не вижу, только create_function-ы. :confused:
Чета там наменять успели (либо я нихрена не понял что такое zend_eval_string).
Но closures явно не евалятся, да.
 
Сверху