За последние 24 часа нас посетили 20688 программистов и 1711 роботов. Сейчас ищут 1470 программистов ...

Как вы относитесь к созданию объектов таким способом new parent()

Тема в разделе "PHP для профи", создана пользователем qtk, 21 сен 2017.

  1. qtk

    qtk Активный пользователь

    С нами с:
    18 дек 2013
    Сообщения:
    29
    Симпатии:
    0
    Доброго времени суток. Считается ли дурным тоном делать так?
    PHP:
    1. new parent($data);
    Встречал кто нибудь в крупных проектах такую запись или лучше создавать объекты через имя класса?
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    ЯННП. А сейчас ты создаешь не через имя класса?
     
  3. qtk

    qtk Активный пользователь

    С нами с:
    18 дек 2013
    Сообщения:
    29
    Симпатии:
    0
    Имеется ввиду, стоит ли указывать в коде имя класса для наглядности и прочего или можно через, парент?
    PHP:
    1. Class Obj {}
    2. Class Obj1 extends Obj
    3. {
    4.     public function foo()
    5.     {
    6.         return new Obj();
    7.     }
    8.  
    9.     public function baz()
    10.     {
    11.         return new parent();
    12.     }
    13. }
    Разницы в функциях нет, но, как будет более этично?
     
    #3 qtk, 21 сен 2017
    Последнее редактирование: 21 сен 2017
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Я опять ничерта не понял. Какую проблему ты пытаешься решить?
    Типа имеет ли смысл делать метод, возвращающий родительский экземпляр? Нет, не имеет. Дочерний класс де факто является и экземпляром родительского класса, согласно прописанным в родительским классам модификаторам доступа, разумеется.
     
  5. qtk

    qtk Активный пользователь

    С нами с:
    18 дек 2013
    Сообщения:
    29
    Симпатии:
    0
    КАК БУДЕТ БОЛЕЕ ЭТИЧНО С ТОЧКИ ЗРЕНИЯ НАПИСАНИЯ КОДА??? Как в первой функции или как в второй? есть ли плюсы в плане архитектуры приложения, используя тот или иной вариант?
     
  6. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    parent
     
  7. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @qtk, а вообще, безумно интересно, зачем ты так делаешь? Запись лишена смысла.
    Но все же, лучше parent.
    Несомненный плюс, при рефакторинге ты можешь менять имя родительского класса тем самым не внося изменения в наследники.

    Опять таки, не вижу смысла создаия экземпляра родителя в наследнике))
     
    Fell-x27 нравится это.
  8. qtk

    qtk Активный пользователь

    С нами с:
    18 дек 2013
    Сообщения:
    29
    Симпатии:
    0
    Ну, если в 3 словах, то:
    PHP:
    1. class Collection implements \ArrayAccess, \Countable, \IteratorAggregate
    2. {
    3.     protected $data = [];
    4.  
    5.     public function __construct($items = [])
    6.     {
    7.         $this->replace($items);
    8.     }
    9.  
    10.     public function set($key, $value)
    11.     {
    12.         $this->data[$key] = $value;
    13.     }
    14.  
    15.     public function get($key, $default = null)
    16.     {
    17.         return $this->has($key) ? $this->data[$key] : $default;
    18.     }
    19.  
    20.     public function replace($items)
    21.     {
    22.         foreach ($items as $key => $value) {
    23.             $this->set($key, $value);
    24.         }
    25.     }
    26.    //другие методы
    27. }
    28.  
    29. class Environment extends Collection
    30. {
    31.     public function factory($settings = []): Environment
    32.     {
    33.         $data = array_merge([
    34.             'SERVER_PROTOCOL'      => 'HTTP/1.1',
    35.             'REQUEST_METHOD'       => 'GET',
    36.             'SCRIPT_NAME'          => '',
    37.             'REQUEST_TIME'         => time(),
    38.             'REQUEST_TIME_FLOAT'   => microtime(true),
    39.         ], $settings);
    40.      
    41.         return new static($data);
    42.     }
    43. }
    44.  
    45. class Headers extends Collection
    46. {
    47.     public static function factory(Environment $environment = null): HeadersInterface
    48.     {
    49.         $environment = $environment ?? new parent($_SERVER);
    50.      
    51.         $environment = static::determineAuth($environment);
    52.      
    53.         foreach ($environment as $key => $value) {
    54.             $key = strtoupper($key);
    55.          
    56.             if (in_array($key, static::$special) || strpos($key, 'HTTP_') === 0 && $key !== 'HTTP_CONTENT_LENGTH') {
    57.                 $data[$key] =  $value;
    58.             }
    59.         }
    60.      
    61.         return new static($data);
    62.     }
    63.  
    64.     protected static function determineAuth(CollectionInterface $environment): CollectionInterface
    65.     {
    66.         $authorization = $environment->get('HTTP_AUTHORIZATION');
    67.      
    68.         if (empty($authorization) && is_callable('getallheaders')) {
    69.             $headers = getallheaders();
    70.             $headers = array_change_key_case($headers, CASE_LOWER);
    71.  
    72.             if (isset($headers['authorization'])) {
    73.                 $environment->set('HTTP_AUTHORIZATION', $headers['authorization']);
    74.             }
    75.         }
    76.      
    77.         return $environment;
    78.     }
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Это не в 3 словах, это простыня, в которую влом вникать.
    --- Добавлено ---
    Просто скажи, решением для какой задачи является инстанцирование родителя в потомке?
     
  10. qtk

    qtk Активный пользователь

    С нами с:
    18 дек 2013
    Сообщения:
    29
    Симпатии:
    0
    Да хрен это объяснишь)) не могу точно и кратко мысль сформулировать
    --- Добавлено ---
    Упростил код до нельзя
    PHP:
    1. class Collection implements \ArrayAccess, \Countable, \IteratorAggregate
    2. {
    3.     protected $data = [];
    4.     public function __construct($items = [])
    5.     {
    6.         foreach ($items as $key => $value) {
    7.             $this->data[$key]  = $value;
    8.         }
    9.     //тут методы set(), get() и прочие
    10.     }
    11.  
    12. class Environment extends Collection
    13. {
    14.     public function factory(): Environment
    15.     {
    16.         $data = [
    17.             'PROTOCOL'     => 'HTTP/1.1',
    18.             'METHOD'     => ''
    19.          ];
    20.          return new static($data);
    21.     }
    22. }
    23.  
    24. class Headers extends Collection
    25. {
    26.     public static function factory(Environment $environment = null): HeadersInterface
    27.     {
    28.         $environment = $environment ?? new parent($_SERVER);
    29.         $method = $environment->get('METHOD');
    30.         if (!$method) {
    31.             $environment->set('METHOD', 'GET');
    32.         }
    33.         return new static($data);
    34.      }
    35. }
    --- Добавлено ---
    Всем спасибо за ответы!
     
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Ты кодишь то, что не понимаешь? Окей, лимит в 3 слова - метафора. Напиши столько слов, сколько надо.
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.584
    Симпатии:
    1.762
    Так там у тебя везде new static, а не new parent. new static - применяется иногда, да. new parent не встречал, хотя подозревал, что можною