Jump to content

Extending PHP Class


kirk112

Recommended Posts

Hi

 

Not sure if I am on the right track here but what I am trying to do is set a variable in the parent class and for this to be accessible in the child.

 


class layout {

 public $site_id;

 function __construct($site_id) {

	$this->site_id = $site_id;
         }

function get_flags() {
	return new flags($this);	
}

function top_nav() {
	return new top_nav($this);	
}

}

class top_nav extends layout  {



function __construct(){

}

       function display_site_id() {

             echo $this->site_id;
        }


}

class flags extends layout { 


        function __construct(){

}

        function display_site_id() {

             echo $this->site_id;
        }

}


$site_id = 1;


$layout  = new layout($site_id);
$flags  = $layout->get_flags();
$nav  = $layout->top_nav();


var_dump($layout);
var_dump($flags);
var_dump($nav);


 

This gives me the following output

 


object(layout)#1 (1) { ["site_id"]=> int(1) } 
object(flags)#2 (1) { ["site_id"]=> NULL } 
object(top_nav)#3 (1) { ["site_id"]=> NULL }

 

 

Where I would have expected

 


object(layout)#1 (1) { ["site_id"]=> int(1) } 
object(flags)#2 (1) { ["site_id"]=>  int(1) } 
object(top_nav)#3 (1) { ["site_id"]=>  int(1) }

 

 

but I am new to OOP and might be doing things completely wrong

 

Thanks for your help

 

Regards

 

Link to comment
https://forums.phpfreaks.com/topic/223686-extending-php-class/
Share on other sites

You're confused about inheritance.  Just because you pass a layout object to a child object's constructor, that doesn't mean things will automatically be linked up.  Walk through the process:

 

1. You create a new layout with a $site_id of 1.

2. You create a new flags object by calling layout::get_flags();

  2. a. get_flags() passes an instance of the existing layout to the new flags object, but then does nothing with it.  The layout object is destroyed.

3. You create a new top_nav object by calling layout::top_nav();

  3. a. the same thing as 2. a. happens - the existing layout object is passed into the new top_nav object, and then immediately discarded.

 

Try:

 

class layout
{
   protected $site_id;

   public function __construct($site_id)
   {
      $this->site_id = $site_id;
   }

   public function get_flags()
   {
      return new flags($this->site_id);
   }

   public function top_nav()
   {
      return new top_nav($this->site_id);
   }
}

class flags extends layout
{
   public function __construct($site_id)
   {
      parent::__construct($site_id);
   }
}

class top_nav extends layout
{
   public function __construct($site_id)
   {
      parent::__construct($site_id);
   }
}

$layout = new layout(1);
$flags = $layout->get_flags();
$nav = $layout->top_nav();

Link to comment
https://forums.phpfreaks.com/topic/223686-extending-php-class/#findComment-1156287
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.