ФорумПрограммированиеPHP для идиотов → ПХП 5.4- наконец бл*...

ПХП 5.4- наконец бл*...

  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 13 июня 2012 г. 11:52

    Ахтунг!!!

    Теперь множественная наследование ;)))

    Блин, на сколько удобно то…

    <?php

    /**
    * @author AlexanderC
    */

    trait Singleton {

    /**
    * method called after parent object
    * instantiation with primary input
    * parameters provided
    */
    protected function onAfterConstruct(){ /* extend it */ }

    /**
    * Assure no constructor
    *
    * @return object
    */
    final private function __construct(){ /* do nothing here, extend onAfterConstruct() instead */ }

    /**
    * get class instance
    *
    * @return object
    */
    final public static function getInstance(){
    static $self;

    if(!($self instanceof self)){
    $self = new self;
    call_user_func_array([$self, "onAfterConstruct"], func_get_args());
    }

    return $self;
    }
    }

    // а класс прописываем удобно и просто…

    class Any {
    use Singleton;
    }


    Теперь любой класс который будет юзать данный треит будет синглетоном… а все параметры которые передаются первый раз в ::getInstance() будут при желании переданны в метод onAfterConstruct()


    А самое классное в том что можно реализовать многое, допустим:
    - Cache politics
    - Event driven programming

    итдитп.

    Блин, i love PHP

    Ксттаи ещё очень понравились следующие фишки:
    [] VS array()
    for($key in []) VS foreach(array() as $k => $v)
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 13 июня 2012 г. 12:11, спустя 18 минут 7 секунд

    во-первых - баян, во-вторых синглтон не нужен
  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 13 июня 2012 г. 12:12, спустя 1 минуту 16 секунд

    ;Д, а это с каких то пор не нужен? вот нужен один инстанце на всё время работы приложения, что сделаешь?
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 13 июня 2012 г. 12:16, спустя 3 минуты 59 секунд

    Event driven programming

    что мешает сделать так?

    <?php

    class UserRegistrationService
     public function __construct(EventDispatcherInterface $eventDispatcher )
     {
       $this->eventDispatcher = $eventDispatcher;
     }

     public function registerUser(Request $request)
     {
       $this->eventDispatcher->dispatch('before.registration');

       $user = new User();
       // do validation, persist user

       $this->eventDispatcher->dispatch('after.registration', new AfterRegistrationEvent($user));
     }


    зачем для этого трейты? что они сделают лучше?
  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 13 июня 2012 г. 12:20, спустя 3 минуты 40 секунд

    Дык в том то и дело что ничего не мешает- а представь что писанины будет на много меньше если не каждый раз писать код в каждый класс, а создать треит- на много еффективнее и удобнее при поддержке кода и изменениях
    + как же быть с той задачей что предлогал ранее?
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 13 июня 2012 г. 12:21, спустя 1 минуту 44 секунды

    Cache


    используй АОП.

    <?php

    /**
    * @Cache(expires="tomorrow")
    */
    class BlogController extends Controller
    {
       /**
        * @Cache(expires="+2 days")
        */
       public function indexAction()
       {
       }
    }
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 13 июня 2012 г. 12:24, спустя 2 минуты 49 секунд

    трейты охуени.
    синглетоны гавно.
  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 13 июня 2012 г. 12:29, спустя 5 минут 6 секунд

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

    Вопрос не в том что на данный момент нельзя сделать, а в том что можно сделать легче, и удобнее для будущей поддержки.

    К слову я не сторонник вэй той дизайнерской хрени в апликациях, но некоторые из них(в определённых кругах) реально помогают.

    Да и речь идёт о новый возможностях похапе а ни спор об программерских парадигмах
    Спустя 37 сек.
    ;ДДД все в ту стороны дуют ;ДДД
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 13 июня 2012 г. 12:30, спустя 1 минуту 2 секунды

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

    буду использовать IoC-контейнер

    Дык в том то и дело что ничего не мешает- а представь что писанины будет на много меньше если не каждый раз писать код в каждый класс, а создать треит- на много еффективнее и удобнее при поддержке кода и изменениях

    не могу понять, каким образом трейты уменьшат кол-во кода в приведенном мной примере. Перепиши его с трейтами, я посмотрю как будет.
    Спустя 39 сек.
    но чтение аннотаций требует времени(даже если создавать кэш).

    кодогенерация решает
  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 13 июня 2012 г. 12:35, спустя 5 минут 16 секунд

    Опять же- можно, а почему не юзать код который в итоге приведёт к использованию одной маленькой строчки для этого?
    Спустя 60 сек.
    AlexanderC
    но чтение аннотаций требует времени(даже если создавать кэш).
    кодогенерация решает


    +1 без неё вообще лажа
  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 13 июня 2012 г. 12:56, спустя 20 минут 51 секунду

    не могу понять, каким образом трейты уменьшат кол-во кода в приведенном мной примере. Перепиши его с трейтами, я посмотрю как будет.


    Ну вот допустим (на скорую руку)…


    <?php

    /*
    * @author AlexanderC
    */

    trait EventDriven {

    /**
    * some constants used for
    * event firing
    */
    const EVENT_DRIVEN_DELIMITER = '.';
    const EVENT_DRIVEN_EVENT_BEFORE = 'before';
    const EVENT_DRIVEN_EVENT_AFTER = 'after';

    /**
    * method called after singleton instantiating
    *
    * @return void
    */
    final private function onAfterConstruct(){
    $this->fireEvents();
    }

    /**
    * register and fire events for this class
    *
    * @return void
    */
    final private function fireEvents(){
    $event = $this->__regEventStringInflect(__CLASS__);

    EventDispatcher::getInstance()->dispatch(
    self::EVENT_DRIVEN_EVENT_BEFORE.self::EVENT_DRIVEN_DELIMITER.$event);
    EventDispatcher::getInstance()->dispatch(
    self::EVENT_DRIVEN_EVENT_AFTER.self::EVENT_DRIVEN_DELIMITER.$event,
    $this->getEventObject()
    );
    }

    /**
    * build event string
    *
    * @param string $string
    * @return string
    */
    final private function __regEventStringInflect($string){
    return strtolower(preg_replace('/[A-ZЁ]{1}/u',
    self::EVENT_DRIVEN_DELIMITER, (string) $string));
    }

    /**
    * method called
    *
    * @return \stdClass
    */
    protected function getEventObject(){
    return new \stdClass;
    }
    }


    /**
    * this class will fire such events as
    *
    * before.user.registration
    * after.user.registration [with provided User instance]
    */
    class UserRegistration {
    use EventDriven;
    use Singleton;

    /**
    * get an user instance
    *
    * @return \User
    */
    protected function getEventObject(){
    return new User();
    }
    }

    // UserRegistration::getInstance()

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 13 июня 2012 г. 22:37, спустя 9 часов 40 минут 42 секунды

    ну все позходу рыба обосрался
    Сапожник без сапог
  • indeego

    Сообщения: 125 Репутация: N Группа: Кто попало

    Spritz 14 июня 2012 г. 7:25, спустя 8 часов 47 минут 58 секунд

    Оффтоп, это все отлично. Но скажите мне друзья, ведь вся эта хуйня по сути нужна архитектору приложения. Т.е. люди, которые будут что то создавать новое и великое, возможно новый фреймворк. Я всегда хотел спросить, кем вы работаете что пишете такой код и много ли вам платят? Дайте почитать про Event driven programming.
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 16 июня 2012 г. 1:25, спустя 1 день 17 часов 59 минут

    Traits do not add runtime semantics, they only take part in the process of building a class

    Вот по этому Traits полное гавно - просто какая то ненужная хуйня, которая заставляет прыгать в другой файл. Базара нет, макрос на синглтон явно хуже, но тут тоже черезжопная хуета…

    AlexanderC, конечно, мега функция PHP call_user_func_array - призер гран-при нормер один по вворачиванию костылей - всегда выручает в жопоузких ситуациях. Хотя хули тут - результат то важен, хотя многие бородатые дядьки так не считают
  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 16 июня 2012 г. 12:12, спустя 10 часов 46 минут 58 секунд

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

    А насчёт колл юзер функ аррэй- то как по другому передавать аргументы методы класса/функции в такой форме в которой они были переданы изначальной функции?

    И хули бородатые дядьки не так считают?

Пожалуйста, авторизуйтесь, чтобы написать комментарий!