Object Interfaces and Object Iteration PDF Print E-mail
User Rating: / 0
PoorBest 
Monday, 16 March 2009
HTML clipboard

Object Interfaces

Object interfaces allow you to create code which specifies which methods a class must implement, without having to define how these methods are handled.

Interfaces are defined using the interface keyword, in the same way as a standard class, but without any of the methods having their contents defined.

All methods declared in an interface must be public, this is the nature of an interface.

implements

To implement an interface, the implements operator is used. All methods in the interface must be implemented within a class; failure to do so will result in a fatal error. Classes may implement more than one interface if desired by separating each interface with a comma.

Note: A class cannot implement two interfaces that share function names, since it would cause ambiguity.
 

Examples

Example #1 Interface example
<?php
// Declare the interface 'iTemplate'
interface iTemplate
{
  
public function setVariable($name, $var);
  
public function getHtml($template);
}

// Implement the interface
// This will work
class Template implements iTemplate
{
  
private $vars = array();
 
  
public function setVariable($name, $var)
   {
      
$this->vars[$name] = $var;
   }
 
  
public function getHtml($template)
   {
       foreach(
$this->vars as $name => $value) {
          
$template = str_replace('{' . $name . '}', $value, $template);
       }
 
       return
$template;
   }
}

// This will not work
// Fatal error: Class BadTemplate contains 1 abstract methods
// and must therefore be declared abstract (iTemplate::getHtml)
class BadTemplate implements iTemplate
{
  
private $vars = array();
 
  
public function setVariable($name, $var)
   {
      
$this->vars[$name] = $var;
   }
}

?>
 
HTML clipboard

Object Iteration

PHP 5 provides a way for objects to be defined so it is possible to iterate through a list of items, with, for example a foreach statement. By default, all visible properties will be used for the iteration.

Example #1 Simple Object Iteration
<?php
class MyClass
{
  
public $var1 = 'value 1';
  
public $var2 = 'value 2';
  
public $var3 = 'value 3';

  
protected $protected = 'protected var';
  
private  $private  = 'private var';

   function
iterateVisible() {
       echo
"MyClass::iterateVisible:\n";
       foreach(
$this as $key => $value) {
           print
"$key => $value\n";
       }
   }
}

$class = new MyClass();

foreach(
$class as $key => $value) {
   print
"$key => $value\n";
}
echo
"\n";


$class->iterateVisible();

?>
 
The above example will output:
var1 => value 1
var2 => value 2
var3 => value 3
MyClass::iterateVisible:
var1 => value 1
var2 => value 2
var3 => value 3
protected => protected var
private => private var

As the output shows, the foreach iterated through all visible variables that can be accessed. To take it a step further you can implement one of PHP 5's internal interface named Iterator. This allows the object to decide what and how the object will be iterated.

Example #2 Object Iteration implementing Iterator
<?php
class MyIterator implements Iterator
{
  
private $var = array();

  
public function __construct($array)
   {
       if (
is_array($array)) {
          
$this->var = $array;
       }
   }

  
public function rewind() {
       echo
"rewinding\n";
      
reset($this->var);
   }

  
public function current() {
      
$var = current($this->var);
       echo
"current: $var\n";
       return
$var;
   }

  
public function key() {
      
$var = key($this->var);
       echo
"key: $var\n";
       return
$var;
   }

  
public function next() {
      
$var = next($this->var);
       echo
"next: $var\n";
       return
$var;
   }

  
public function valid() {
      
$var = $this->current() !== false;
       echo
"valid: {$var}\n";
       return
$var;
   }
}

$values = array(1,2,3);
$it = new MyIterator($values);

foreach (
$it as $a => $b) {
   print
"$a: $b\n";
}
?>
 
The above example will output:
rewinding
current: 1
valid: 1
current: 1
key: 0
0: 1
next: 2
current: 2
valid: 1
current: 2
key: 1
1: 2
next: 3
current: 3
valid: 1
current: 3
key: 2
2: 3
next:
current:
valid:

You can also define your class so that it doesn't have to define all the Iterator functions by simply implementing the PHP 5 IteratorAggregate interface.

Example #3 Object Iteration implementing IteratorAggregate
<?php
class MyCollection implements IteratorAggregate
{
  
private $items = array();
  
private $count = 0;

  
// Required definition of interface IteratorAggregate
  
public function getIterator() {
       return new
MyIterator($this->items);
   }

  
public function add($value) {
      
$this->items[$this->count++] = $value;
   }
}

$coll = new MyCollection();
$coll->add('value 1');
$coll->add('value 2');
$coll->add('value 3');

foreach (
$coll as $key => $val) {
   echo
"key/value: [$key -> $val]\n\n";
}
?>
 
The above example will output:
rewinding
current: value 1
valid: 1
current: value 1
key: 0
key/value: [0 -> value 1]
next: value 2
current: value 2
valid: 1
current: value 2
key: 1
key/value: [1 -> value 2]
next: value 3
current: value 3
valid: 1
current: value 3
key: 2
key/value: [2 -> value 3]
next:
current:
valid:
 
Last Updated ( Monday, 16 March 2009 )
 
< Prev   Next >
School Joomla Templates and Joomla Tutorials