2013-03-29 2 views
1

Я попытаюсь объяснить свою ситуацию как можно яснее.Конструирование, повторяющийся код - нужен совет

Я строю каркас. Его система содержит следующие директории:
1) ядро ​​- маршрутизацию, основной класс (автозагрузка, конфига, константу), запрашивает
2) хелперов
3) Библиотеки

В index.php, я установил все наиболее важные конфигурации переменные, такие как базовый url или индексный файл. Я установил их внутри «основного класса».

Эти атрибуты являются частными, потому что я не хочу, чтобы кто-то их менял во время потока запросов.

Таким образом, единственной точкой доступа к этим переменным является метод «основного класса».


Теперь одной из этих переменных является $_base_url.

Я хочу, чтобы пользователи могли получить доступ к base_url из какого-то лучшего места, однако, как и для класса URL (внутри справочника помощника).


Для достижения этой цели, я должен создать два метода - get_base_url() внутри «основной класс», и get_base_url() внутри класса URL-адрес, который будет делать что-то вроде этого:

class Url { 

    public static function get_base_url() { 
     return Main_Class::get_base_url(); 
    } 

} 

Моя проблема: у меня есть пара таких переменных, которые я бы хотел вызвать из разных классов.

У меня будет много повторного кода.

Единственное решение, которое я вижу, просто устанавливает эти переменные в разных классах напрямую, но я бы хотел, чтобы они были централизованы внутри основного класса.

Как я должен справиться с этим?

ответ

0

Вы можете создать другой класс, называемый переменными (или любым другим, что вы предпочитаете), а затем использовать статические переменные с этой клазой, чтобы иметь возможность называть их назад и вперед. Что-то вроде этого:

<?php class Variables { 
    static $_base_url = "http://base_url"; 
} ?> 

Таким образом, вы можете называть переменные, как это:

Variables::$_base_url;

Чтобы расширить свой комментарий:

При наследовании вы можете иметь ситуацию, когда 2 класса имеют разные значения для одной и той же переменной $. В этом примере все экземпляры будут иметь другое значение для $ _base_url;

class ParentClass { 
    protected $_base_url = "SOME VALUE"; 
} 

class SubClassA extends ParentClass { 

    protected __construct() { 
    $this->_base_url = 'VALUE X'; 
    } 
} 

class SubClassB extends ParentClass { 

    protected __construct() { 
    $this->_base_url = 'DIFFERENT VALUE THAN SubClassA'; 
    } 
} 

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

+0

Uh, наследование против централизованного класса для переменных ... один из них лучше здесь, чем другой в моей ситуации, или я должен просто переворачивать монету? : P – user2203484

+0

Это действительно зависит от того, что вы пытаетесь сделать. Наследование позволит вам иметь другое значение для каждого экземпляра. Централизованный класс переменных гарантирует, что независимо от того, какой объект обращается к переменной, он будет иметь только одно значение. – Ares

+0

@ user2203484 Я обновил свой ответ, чтобы объяснить это дальше. – Ares

0

Зачем нужна переменная, вызываемая из имени класса, если классы расширяют ваш MainClass, тогда используйте parent :: get_base_url();

+0

Классы не распространяются на MainClass. Это может решить мою проблему, но я не вижу связи между помощниками/библиотекой и основным классом, поэтому наследования нет. – user2203484