Возврат значений из метода класса

#php #class #oop #design-patterns

#php #класс #ооп #шаблоны проектирования

Вопрос:

Я думаю, что это глупый вопрос, но я не могу его полностью понять: (

Предположим, у меня есть вызываемый класс Categories , в котором вызывается функция getCategories()

 class Categories
{

  function __construct()
  {

  }

  function getCategories()
  {
    //sql to get all categories from db 
    return $categories;
  }
}
  

И в других классах я буду делать что-то вроде:

 $cats = new Categories();
$cats->getCategories();
  

Теперь мой вопрос в том, что есть много мест, где мне нужно использовать категории. Так что, если я создал переменную, вызываемую $cats как член categories класса, и загрузил ее в конструктор, и просто передал ее обратно, когда кто-либо вызывал getCategories() :

 class Categories
{
  var $cats; 

  function __construct()
  {
     $this->cats = $this->getCategories(); 
  }

  function getCategories()
  {
    //return loaded class variable instead of running db query again
    return $this->cats;
  }
}
  

Таким образом, мне не нужно обращаться к базе данных каждый раз, когда кто-либо запрашивает категории. Хорош ли этот подход? плохо? Должен ли я делать это или придерживаться запроса к БД каждый раз?

Комментарии:

1. Этот вопрос лучше подходит для проверки кода . Но вкратце: нет, это не очень хорошая идея. var $cats является свойством в стиле PHP4, PHP5 использует модификаторы доступа ( public $cats; или protected $cats; ).

Ответ №1:

Таким образом, мне не нужно обращаться к базе данных каждый раз, когда кто-либо запрашивает категории. Хорош ли этот подход? плохо? Должен ли я делать это или придерживаться запроса к БД каждый раз?

Все это действительно зависит от характера вашего свойства categories . Например, могут ли они измениться после того, как вы их удалили? Если это так, то кэширование при первоначальном создании класса и никогда больше не обращаться к базе данных потенциально может означать работу с устаревшими данными, которые могут быть или не быть проблемой для вас.

С другой стороны, если они довольно статичны и очень редко меняются, то кэширование их при первом доступе может быть лучшей альтернативой, например

 function getCategories()
{
    if (!isset($this->cats)) {
        $this->cats = // load from DB
    }
    return $this->cats;
}
  

Комментарии:

1. спасибо за этот ответ — разве это не должно быть if (!isset($this->cats)) {

2. @open_sourse ой, да, должно быть.

Ответ №2:

Там все хорошо, но var устарело, вы должны использовать public , private или protected вместо.