Доброго времени суток. Считается ли дурным тоном делать так? PHP: new parent($data); Встречал кто нибудь в крупных проектах такую запись или лучше создавать объекты через имя класса?
Имеется ввиду, стоит ли указывать в коде имя класса для наглядности и прочего или можно через, парент? PHP: Class Obj {} Class Obj1 extends Obj { public function foo() { return new Obj(); } public function baz() { return new parent(); } } Разницы в функциях нет, но, как будет более этично?
Я опять ничерта не понял. Какую проблему ты пытаешься решить? Типа имеет ли смысл делать метод, возвращающий родительский экземпляр? Нет, не имеет. Дочерний класс де факто является и экземпляром родительского класса, согласно прописанным в родительским классам модификаторам доступа, разумеется.
КАК БУДЕТ БОЛЕЕ ЭТИЧНО С ТОЧКИ ЗРЕНИЯ НАПИСАНИЯ КОДА??? Как в первой функции или как в второй? есть ли плюсы в плане архитектуры приложения, используя тот или иной вариант?
@qtk, а вообще, безумно интересно, зачем ты так делаешь? Запись лишена смысла. Но все же, лучше parent. Несомненный плюс, при рефакторинге ты можешь менять имя родительского класса тем самым не внося изменения в наследники. Опять таки, не вижу смысла создаия экземпляра родителя в наследнике))
Ну, если в 3 словах, то: PHP: class Collection implements \ArrayAccess, \Countable, \IteratorAggregate { protected $data = []; public function __construct($items = []) { $this->replace($items); } public function set($key, $value) { $this->data[$key] = $value; } public function get($key, $default = null) { return $this->has($key) ? $this->data[$key] : $default; } public function replace($items) { foreach ($items as $key => $value) { $this->set($key, $value); } } //другие методы } class Environment extends Collection { public function factory($settings = []): Environment { $data = array_merge([ 'SERVER_PROTOCOL' => 'HTTP/1.1', 'REQUEST_METHOD' => 'GET', 'SCRIPT_NAME' => '', 'REQUEST_TIME' => time(), 'REQUEST_TIME_FLOAT' => microtime(true), ], $settings); return new static($data); } } class Headers extends Collection { public static function factory(Environment $environment = null): HeadersInterface { $environment = $environment ?? new parent($_SERVER); $environment = static::determineAuth($environment); foreach ($environment as $key => $value) { $key = strtoupper($key); if (in_array($key, static::$special) || strpos($key, 'HTTP_') === 0 && $key !== 'HTTP_CONTENT_LENGTH') { $data[$key] = $value; } } return new static($data); } protected static function determineAuth(CollectionInterface $environment): CollectionInterface { $authorization = $environment->get('HTTP_AUTHORIZATION'); if (empty($authorization) && is_callable('getallheaders')) { $headers = getallheaders(); $headers = array_change_key_case($headers, CASE_LOWER); if (isset($headers['authorization'])) { $environment->set('HTTP_AUTHORIZATION', $headers['authorization']); } } return $environment; }
Это не в 3 словах, это простыня, в которую влом вникать. --- Добавлено --- Просто скажи, решением для какой задачи является инстанцирование родителя в потомке?
Да хрен это объяснишь)) не могу точно и кратко мысль сформулировать --- Добавлено --- Упростил код до нельзя PHP: class Collection implements \ArrayAccess, \Countable, \IteratorAggregate { protected $data = []; public function __construct($items = []) { foreach ($items as $key => $value) { $this->data[$key] = $value; } //тут методы set(), get() и прочие } class Environment extends Collection { public function factory(): Environment { $data = [ 'PROTOCOL' => 'HTTP/1.1', 'METHOD' => '' ]; return new static($data); } } class Headers extends Collection { public static function factory(Environment $environment = null): HeadersInterface { $environment = $environment ?? new parent($_SERVER); $method = $environment->get('METHOD'); if (!$method) { $environment->set('METHOD', 'GET'); } return new static($data); } } --- Добавлено --- Всем спасибо за ответы!
Так там у тебя везде new static, а не new parent. new static - применяется иногда, да. new parent не встречал, хотя подозревал, что можною