Search code examples
phpclassooppdocontrollers

Setting up controller classes the correct way


I will try to explain myself the best way possible. I am trying to start with OOP in PHP. I started this way, i made a "main controller" with a construct where i initiated all my other controllers. I did this because i was hoping to share data along controllers.

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);
    } 
}

So far it looks pretty oke in my opinion. Now the thing is when i am in the class clsSharedUserController which looks like this:

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

I cannot access a function in the clsSharedAdsController. The controller looks like this.

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;
    }

}

I am trying to do access it the following way

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);
    }

}

To be honest i expected to get my 1 echo-ed but i am getting this error:

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

I am using a PDO class for my queries to get data they are set-up the same way as this clsController. I am probally missing some logic for a correct set-up to share my data along all classes without creating new instances all the time. You should be able to just make 1 instance of a class and share it among other classes, not?


Solution

  • If you want to use some clsSharedUserController's method in clsSharedAdsController and use some clsSharedAdsController's method in clsSharedUserController you need to redesign the class

    In 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);
        }
    }
    

    In 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);
        }
    }
    

    In 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
        }
    
    }