На моем сайте в начале каждого скрипта я включаю скрипт «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.
Есть намного больше, чем я хочу сделать, но это даст мне достаточно, чтобы понять остальное.
Спасибо. Upvoted. У меня есть два вопроса. Эти частные переменные класса постоянны в течение всего срока действия скрипта. Будет ли это приемлемым иметь их в качестве констант? Кроме того, у меня есть второй класс, который я хочу расширить из класса SiteInfo/я хочу, чтобы он мог получить доступ к переменным экземпляра класса. Достаточно ли объявлять защищенные переменные? Я знаю, как расширения работают для статических классов, но если экземпляр класса создается и использует этот конструктор, он все равно будет работать так же, когда экземплярное расширение может получить доступ к переменным родителя? –
Я думаю, вы неправильно поняли концепцию константы: они являются значениями, которые EVER постоянны. Например, у вас есть класс, который выполняет добавление, и каждый раз, когда выполняется операция, он добавляет 1: в этом случае вы можете установить значение 1 в константу, потому что оно всегда одно и то же. Что-то действительно близко к значению конфигурации. Но то, что вы делаете, - это создание объекта, который представляет SiteInfo: в этом случае свойства являются одинаковыми, но их значения CHANGE каждый раз, поэтому они не являются константами, а являются свойствами. – Aerendir
Вам не следует напрямую обращаться к свойствам, объявляющим их защищенные (но да, достаточно их получить и изменить). Лучший способ сделать это - использовать методы 'get *'. Если вы хотите изменить их значения, вы должны добавить 'set *' методы. Таким образом, вы когда-либо контролируете, какое свойство имеет ценность. Например, если вы хотите, чтобы свойство 'isAnalyticsEnabled' было EVER логическим значением, вы можете написать метод, который устанавливает значение' isAnalyticsEnabled' и проверяет, что это действительно логическое значение. Этот метод находится в родительском классе, который имеет свойство 'isAnalyticsEnabled'. – Aerendir