Есть ли какой-либо недостаток в использовании шаблона 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 ответ

Чтобы ответить на ваш вопрос: в этом нет ничего плохого. Это общий шаблон оптимизации, известный как отложенная загрузка, как вы также упоминаете в комментариях.

Хотя это может быть реализовано иначе, чем то, что вы сделали здесь, ваш подход выглядит для меня отлично.

Другие вопросы по тегам