Есть ли какой-либо недостаток в использовании шаблона Ghost Lazy Loading?
О двойном голосовании: этот вопрос о недостатках этого подхода, а не о том, как заставить его работать; Вы можете видеть это следующим образом: этот вопрос спрашивает, как что-то сделать, а ответ говорит что-то полезное, однако я спрашиваю о недостатках ответа.
TL; DR: возникнут ли у меня какие-либо технические трудности при использовании этого класса-обёртки позже? Почему я не видел ничего подобного раньше?
Недавно я экспериментировал с методами обучения для профилирования и обнаружил, что создание экземпляра PDO - это место, которое можно оптимизировать (~5 мс). Мне не нужно использовать его при каждом вызове, однако я создаю его при каждом вызове из структуры моего кода. Итак, я только что составил этот небольшой класс:
<?php
namespace Library;
// Wrapper for \PDO. It only creates the rather expensive instance when needed.
// Use it exactly as you'd use the normal PDO object, except for the creation.
// In that case simply do "new \Library\PDO($args);" with the normal args
class PDO
{
// The actual instance of PDO
private $db;
public function __construct() {
$this->args = func_get_args();
}
public function __call($method, $args)
{
if (empty($this->db))
{
$Ref = new \ReflectionClass('\PDO');
$this->db = $Ref->newInstanceArgs($this->args);
}
return call_user_func_array(array($this->db, $method), $args);
}
}
Чтобы вызвать его, вам нужно всего лишь изменить эту строку:
$DB = new \Library\PDO(/* normal arguments */);
И тип намека, если вы используете его для (\Library\PDO $DB)
,
Работает без нареканий. Он также горит быстро (~0,2 мс), когда не используется объект PDO, и вводит только задержку ~ 0,2 мс при его использовании (совершенно незначительно). Сейчас я все еще узнаю о правильном ООП, пространствах имен и общей структуре кода, поэтому я думаю, что я недостаточно квалифицирован, чтобы отвечать на свой вопрос:
Буду ли я сталкиваться с какими-либо техническими трудностями при использовании этого класса-обёртки позже? Почему я не видел ничего подобного раньше? следовательно, почему это не более распространенное или даже поведение PDO по умолчанию?
Примечание: я намерен расширить его, добавив еще несколько методов.
1 ответ
Чтобы ответить на ваш вопрос: в этом нет ничего плохого. Это общий шаблон оптимизации, известный как отложенная загрузка, как вы также упоминаете в комментариях.
Хотя это может быть реализовано иначе, чем то, что вы сделали здесь, ваш подход выглядит для меня отлично.