2015-06-18 3 views
1

Я создаю PHP OOP MVC Framework для личного использования.Как получить доступ к другим методам классов в классе (PHP)

Я хотел бы знать, если есть способ или правильное выполнение следующих функций:

Будучи в состоянии вызвать метод из «подкласса» (не расширенный) к другому «подкласс». Я имею в виду ... У меня есть класс, который создает новые объекты для каждого подкласса вместо использования наследования. Давайте назовем это MainClass, и имеет 3 "подклассы", как этот

class MainClass { 
    public $db; 
    public $forms; 
    public $pagination; 

    function __construct() { 
     $this->db = new class_db(); 
     $this->forms = new class_forms();  
     $this->utils = new class_utils(); 
    } 
} 

И инициализацию, которая

$MainClass = new MainClass(); 

я могу сделать, например

$MainClass->utils->show_text("Hello World"); 

И работает отлично.

Что бы я хотел сделать ... внутри $ MainClass-> utils-> test() (Другой метод тестирования), должен иметь доступ к $ MainClass-> db без использования глобальных или $ GLOBALS ,

Есть ли альтернативный способ достижения этого? Чтобы иметь доступ к методам и методам MainClass в другом подтеме (доступ к db из utils и с главной страницы, где MainClass инициализирован)? Как это будет? Я хочу иметь доступ ко всем подтекстам, например utils, которые могут обращаться к методу db и forms. а также страницы, которые находятся за пределами MainClass.

Спасибо

+1

Добавить «Dependency Injection» для вашего поиска существующих ответов на некоторые идеи возможно. – ficuscr

+0

Внесите свой экземпляр MainClass в vfw_constructor, используя '$ this-> utils = new vfw_utils ($ this);' когда вы его создаете .... измените конструктор vfw_utils, чтобы установить этот аргумент как свойство, et voilà –

ответ

2

Если utils должен использовать db, вы должны либо передать экземпляр MainClass к утилитам, так что он может позвонить $this->myRefToMain->db или передать экземпляр самого db, так Utils можно назвать $this->db. В любом случае, он не может (разумно) обходить стек вызовов, чтобы найти объект, который его вызвал.

+0

Спасибо. Вот как я это делал, но вместо того, чтобы передавать его конструктору, я сделал еще один метод в вызове loadFramework(), а затем в вызове MainClass loadFramework() всех подклассов. Я не знал, правильно ли это. Но ваш код намного лучше. Спасибо. – luffyff

0

Объект, если ваш класс class_utils может существовать без MainClass. И его метод test() должен получить доступ к некоторому объекту db класса class_db. Это означает, что class_utils зависит от class_db и вы должны вводить объект class_db в конструкторе, например:

class MainClass { 
    public $db; 
    public $forms; 
    public $pagination; 

    function __construct() { 
     $this->db = new class_db(); 
     $this->forms = new class_forms();  
     $this->utils = new class_utils($this->db); 
    } 
} 
Смежные вопросы