#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
вместо.