2015-11-29 3 views
0

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

Некоторые примеры:

define("SITE_ID", $site_id); // $site_id is pulled from a field in the database 
define("SITE_NAME", $site_name); 
// pulled from a field in the same row as the above 
define("STOCK_IDS", $stock_ids); 
//computed array of stock id integers from a different query. 
//I perform logic on the array after the query before putting it in the definition 
define("ANALYTICS_ENABLED", false); 
// this is something I define myself and isnt "pulled" from a database 

Теперь у меня есть много функций на сайте. Одна примерная функция - get_stock_info. И он ссылается на константу STOCK_IDS.

Что я хочу сделать, это иметь класс, который имеет в нем указанные выше константы и функцию get_stock_info.

Будет ли лучший подход иметь пустой класс «сайт», создать экземпляр его, а затем определить статические переменные выше одного за другим? Или это не очень хороший способ, и я должен переместить всю свою логику, которая вытаскивает из базы данных, и вместо этого вычисляет SITE_ID, STOCK_IDS, ANALYTICS_ENABLED и т. Д. В конструкторе?

В конечном итоге я хочу, чтобы класс содержал всю указанную выше информацию, а затем я мог бы использовать методы класса, такие как site :: get_stock_info(), и эти методы будут иметь доступ к константам через self :: или this.

Есть намного больше, чем я хочу сделать, но это даст мне достаточно, чтобы понять остальное.

ответ

1

Я думаю, что этот подход не самый лучший. Вы не должны использовать константы, поскольку ваши значения не являются постоянными. Для вашего случая лучше иметь класс с классическими методами getters.

Что-то вроде этого:

class SiteInfo 
{ 
    private $siteId; 
    private $siteName; 
    private $stockIds; 
    private $analyticsEnabled; 

    public function __construct() 
    { 
     // Results from the database 
     $results = $query->execute(); 

     $this->siteId = $results['siteId']; 
     $this->siteName = $results['siteName']; 
     $this->stockIds = $results['stockIds']; 
     $this->analyticsEnabled = $results['analyticsEnabled']; 
    } 

    public function getSiteId() 
    { 
     return $this->siteId; 
    } 

    public function getSiteName() 
    { 
     return $this->siteName; 
    } 

    public function getStockIds() 
    { 
     return $this->stockIds; 
    } 

    public function isAnalyticsEnabled() 
    { 
     return $this->analyticsEnabled; 
    } 
} 
+0

Спасибо. Upvoted. У меня есть два вопроса. Эти частные переменные класса постоянны в течение всего срока действия скрипта. Будет ли это приемлемым иметь их в качестве констант? Кроме того, у меня есть второй класс, который я хочу расширить из класса SiteInfo/я хочу, чтобы он мог получить доступ к переменным экземпляра класса. Достаточно ли объявлять защищенные переменные? Я знаю, как расширения работают для статических классов, но если экземпляр класса создается и использует этот конструктор, он все равно будет работать так же, когда экземплярное расширение может получить доступ к переменным родителя? –

+0

Я думаю, вы неправильно поняли концепцию константы: они являются значениями, которые EVER постоянны. Например, у вас есть класс, который выполняет добавление, и каждый раз, когда выполняется операция, он добавляет 1: в этом случае вы можете установить значение 1 в константу, потому что оно всегда одно и то же. Что-то действительно близко к значению конфигурации. Но то, что вы делаете, - это создание объекта, который представляет SiteInfo: в этом случае свойства являются одинаковыми, но их значения CHANGE каждый раз, поэтому они не являются константами, а являются свойствами. – Aerendir

+0

Вам не следует напрямую обращаться к свойствам, объявляющим их защищенные (но да, достаточно их получить и изменить). Лучший способ сделать это - использовать методы 'get *'. Если вы хотите изменить их значения, вы должны добавить 'set *' методы. Таким образом, вы когда-либо контролируете, какое свойство имеет ценность. Например, если вы хотите, чтобы свойство 'isAnalyticsEnabled' было EVER логическим значением, вы можете написать метод, который устанавливает значение' isAnalyticsEnabled' и проверяет, что это действительно логическое значение. Этот метод находится в родительском классе, который имеет свойство 'isAnalyticsEnabled'. – Aerendir

Смежные вопросы