2017-01-04 4 views
1

Я постараюсь объяснить себе наилучший путь. Я пытаюсь начать с ООП в PHP. Я начал этот путь, я создал «главный контроллер» с конструкцией, где я инициировал все мои другие контроллеры. Я сделал это, потому что я надеялся поделиться данными по контроллерам.Настройка классов контроллера правильным способом

class clsController{ 
    public function __construct($smarty){    
     if (is_object($smarty)) { 
      $this->o_smarty = $smarty; 
     } else { 
      throw new Exception("Smarty not set!"); 
     } 

     $this->o_clsSharedAdsController = new clsSharedAdsController($this->o_smarty); 
     $this->o_clsSharedUserController = new clsSharedUserController($this->o_smarty); 
    } 
} 

Пока, на мой взгляд, это выглядит довольно оке. Теперь дело в том, когда я нахожусь в классе clsSharedUserController, который выглядит следующим образом:

class clsSharedUserController extends clsController{ 
    // construct 
    public function __construct($smarty) {    
     if (is_object($smarty)) { 
      $this->o_smarty = $smarty; 
     } else { 
      throw new Exception("Smarty not set!"); 
     } 
    } 
} 

Я не могу получить доступ к функции в clsSharedAdsController. Контроллер выглядит так.

class clsSharedAdsController extends clsController{ 
    // construct 
    public function __construct($smarty) {    
     if (is_object($smarty)) { 
      $this->o_smarty = $smarty; 
     } else { 
      throw new Exception("Smarty not set!"); 
     } 
    } 

    // ad details used for messages 
    public function getAdDetailsForMessage($ads_id){ 
     echo $ads_id; 
    } 

} 

Я пытаюсь сделать доступ к нему следующим образом

class clsSharedUserController extends clsController{ 
    // construct 
    public function __construct($smarty) {    
     if (is_object($smarty)) { 
      $this->o_smarty = $smarty; 
     } else { 
      throw new Exception("Smarty not set!"); 
     } 
    } 

    // ad details used for messages 
    public function getUserReviews($userReviews){ 
     $this->o_clsSharedAdsController->getAdDetailsForMessage(1); 
    } 

} 

Чтобы быть честным, я ожидал, чтобы получить мой 1 эхо-е изд, но я получаю эту ошибку:

Fatal error: Uncaught Error: Call to a member function getAdDetailsForMessage() on null in /home/vhosts/gamermarket.nl/httpdocs/includes/controllers/shared/clsSharedUserController.php:124 
Stack trace: 
#0 /home/vhosts/gamermarket.nl/httpdocs/includes/controllers/shared/clsSharedUserController.php(68): clsSharedUserController->getUserReviews(Array) 
#1 /home/vhosts/gamermarket.nl/httpdocs/includes/controllers/clsReviewController.php(17): clsSharedUserController->getUserReviewsFromUsersId('0000000001') 
#2 /home/vhosts/gamermarket.nl/httpdocs/reviews.php(10): clsReviewController->getReviews() 
#3 {main} thrown in /home/vhosts/gamermarket.nl/httpdocs/includes/controllers/shared/clsSharedUserController.php on line 124 

Я использую класс PDO для своих запросов, чтобы получить данные, которые они настроены так же, как этот clsController. Я, вероятно, теряю некоторую логику для правильной настройки для обмена моими данными по всем классам без создания новых экземпляров все время. Вы должны просто сделать один экземпляр класса и поделиться им среди других классов, а не?

+0

Вы не ставим '$ this-> o_clsSharedAdsController' ни к чему в' clsSharedUserController'. Я не знаю, чего вы ожидаете, но если вы не установите/не инициализируете его, у него не будет никаких методов или данных. : P – yivi

+0

Когда я делаю то, что получаю: Неустранимая ошибка: Разрешенный размер памяти 134217728 байт исчерпан (пытался выделить 262144 байт) в /home/vhosts/gamermarket.nl/httpdocs/includes/controllers/shared/clsSharedUserController.php on line 6 – poNgz0r

ответ

0

Если вы хотите использовать метод некоторых clsSharedUserController в clsSharedAdsController и использовать метод некоторых clsSharedAdsController в в clsSharedUserController вам нужно перепроектировать классу

В clsController

class clsController{ 

    protected $o_smarty; 

    public function __construct($smarty){    
     if (is_object($smarty)) { 
      $this->o_smarty = $smarty; 
     } else { 
      throw new Exception("Smarty not set!"); 
     } 
    } 

    public function getSharedUser() 
    { 
     return new clsSharedUserController($this->o_smarty); 
    } 

    public function getSharedAds() 
    { 
     return new clsSharedAdsController($this->o_smarty); 
    } 
} 

В clsSharedUserController

class clsSharedUserController extends clsController{ 

    // construct 
    public function __construct($smarty) {    
     parent::__construct($smarty); 
    } 

    // ad details used for messages 
    public function getUserReviews($userReviews){ 
     $sharedAds = $this->getSharedAds(); 
     $sharedAds->getAdDetailsForMessage(1); 
    } 
} 

В clsSharedAdsController

class clsSharedAdsController extends clsController{ 
    // construct 
    public function __construct($smarty) {    
     parent::__construct($smarty); 
    } 

    // ad details used for messages 
    public function getAdDetailsForMessage($ads_id){ 
     echo $ads_id; 
    } 

    //use the method in share user class 
    public function someMethod(){ 
     $sharedUser = $this->getSharedUser(); 
     //TODO 
    } 

} 
+0

Это работает! Единственное плохо, что я должен реорганизовать много кода. Но эй ничего хорошего чистого кода: D – poNgz0r

0

Я думаю, что ваш главный класс не должен новый дочерний класс внутри построить

В clsSharedUserController

class clsController{ 
    public function __construct($smarty){    
     if (is_object($smarty)) { 
      $this->o_smarty = $smarty; 
     } else { 
      throw new Exception("Smarty not set!"); 
     } 
    } 
} 

В clsSharedUserController

class clsSharedUserController extends clsController{ 

    protected $o_clsSharedAdsController; 

    // construct 
    public function __construct($smarty) {    
     parent::__construct($smarty); 
     $this->o_clsSharedAdsController = new clsSharedAdsController($smarty); 
    } 

    // ad details used for messages 
    public function getUserReviews($userReviews){ 
     $this->o_clsSharedAdsController->getAdDetailsForMessage(1); 
    } 
} 

В clsSharedAdsController

class clsSharedAdsController extends clsController{ 
    // construct 
    public function __construct($smarty) {    
     parent::__construct($smarty); 
    } 

    // ad details used for messages 
    public function getAdDetailsForMessage($ads_id){ 
     echo $ads_id; 
    } 

} 
+0

Oke звучит хорошо, когда я пытаюсь создать новый экземпляр $ this-> o_clsSharedUserController = new clsSharedUserController ($ smarty); in clsSharedAdsController Я получаю Неустранимая ошибка: Допустимый размер памяти 134217728 байт исчерпан (пытался выделить 262144 байта). – poNgz0r

+0

вы застряли в цикле Пример class a Создать b и класс b создать (бесконечный цикл) –

+0

Итак, каков правильный способ совместного использования данных между классами? Как класс A может получать данные из B и B из A без инициирования в обоих классах? – poNgz0r

0

Вы должны создать экземпляр класса clsSharedAdsController, прежде чем сможете использовать его методы.

o_clsSharedAdsController = new clsSharedAdsController($smarty); 
o_clsSharedAdsController->getAdDetailsForMessage(1); 

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

  • Нет связанных вопросов^_^