Using Recursive Methods in Object-based PHP Applications - Applying recursion in object-oriented programming: creating object-based web page elements (
Page 2 of 4 )
In order to demonstrate how to write recursive methods within an object-oriented application, what I’ll do first is define a set of simple PHP 5 (X)HTML widget classes, geared to creating dynamic web pages via an object-based approach. At a later time, these classes will be integrated within a single page generator class, which will expose a recursive method for programmatically rendering web documents.
So, I’ll start listing some of these PHP 5 (X)HTML widget classes, in conjunction with the abstract base class, which all the classes are derived from:
// define abstract class HTMLElement
abstract class HTMLElement{
protected $attributes;
protected function __construct($attributes){
if(!is_array($attributes)){
throw new Exception('Invalid attribute type');
}
$this->attributes=$attributes;
}
// abstract 'getHTML()' method
abstract protected function getHTML();
}
// define 'Div' class
class Div extends HTMLElement{
private $output='<div ';
private $data;
public function __construct($attributes=array(),$data){
if(!$data instanceof HTMLElement&&!is_string($data)){
throw new Exception('Invalid parameter type');
}
parent::__construct($attributes);
$this->data=$data;
}
// concrete implementation for 'getHTML()' method
public function getHTML(){
foreach($this->attributes as $attribute=>$value){
$this->output.=$attribute.'="'.$value.'" ';
}
$this->output=substr_replace($this->output,'>',-1);
$this->output.=($this->data instanceof HTMLElement)?
$this->data->getHTML():$this->data;
$this->output.='</div>';
return $this->output;
}
}
// define 'Header1' class
class Header1 extends HTMLElement{
private $output='<h1 ';
private $data;
public function __construct($attributes=array(),$data){
if(!$data instanceof HTMLElement&&!is_string($data)){
throw new Exception('Invalid parameter type');
}
parent::__construct($attributes);
$this->data=$data;
}
// concrete implementation for 'getHTML()' method
public function getHTML(){
foreach($this->attributes as $attribute=>$value){
$this->output.=$attribute.'="'.$value.'" ';
}
$this->output=substr_replace($this->output,'>',-1);
$this->output.=($this->data instanceof HTMLElement)?
$this->data->getHTML():$this->data;
$this->output.='</h1>';
return $this->output;
}
}
// define 'Paragraph' class
class Paragraph extends HTMLElement{
private $output='<p ';
private $data;
public function __construct($attributes=array(),$data){
if(!$data instanceof HTMLElement&&!is_string($data)){
throw new Exception('Invalid parameter type');
}
parent::__construct($attributes);
$this->data=$data;
}
// concrete implementation for 'getHTML()' method
public function getHTML(){
foreach($this->attributes as $attribute=>$value){
$this->output.=$attribute.'="'.$value.'" ';
}
$this->output=substr_replace($this->output,'>',-1);
$this->output.=($this->data instanceof HTMLElement)?
$this->data->getHTML():$this->data;
$this->output.='</p>';
return $this->output;
}
}
// define 'UnorderedList' class
class UnorderedList extends HTMLElement{
private $output='<ul ';
private $items=array();
public function __construct($attributes=array(),$items=array
()){
parent::__construct($attributes);
if(!is_array($items)){
throw new Exception('Invalid parameter for list
items');
}
$this->items=$items;
}
// concrete implementation for 'getHTML()' method
public function getHTML(){
foreach($this->attributes as $attribute=>$value){
$this->output.=$attribute.'="'.$value.'" ';
}
$this->output=substr_replace($this->output,'>',-1);
foreach($this->items as $item){
$this->output.=($item instanceof
HTMLElement)?'<li>'.$item->getHTML ().'</li>':'<li>'.$item.'</li>';
}
$this->output.='</ul>';
return $this->output;
}
}
Right, at this point I listed all the (X)HTML widget classes required for constructing a basic web page. Of course, if you’ve been reading some of my previous PHP articles, then these classes should already be familiar to you, since I’ve used them as part of some previous code samples.
Now that you know how the (X)HTML widgets are defined, I’ll create a web page generator class that uses recursion for constructing the corresponding web documents. To see how this class will be defined, please go ahead and read the next section.