9 - Parámetros de tipo objeto.


Otra posibilidad que nos presenta el lenguaje PHP es pasar parámetros no solo de tipo primitivo (enteros, reales, cadenas etc.) sino parámetros de tipo objeto.

Vamos a desarrollar un problema que utilice esta característica. Plantearemos una clase Opcion y otra clase Menu. La clase Opcion definirá como atributos el titulo, enlace y color de fondo, los métodos a implementar serán el constructor y el graficar.
Por otro lado la clase Menu administrará un array de objetos de la clase Opcion e implementará un métodos para insertar objetos de la clase Menu y otro para graficar. Al constructor de la clase Menu se le indicará si queremos el menú en forma 'horizontal' o 'vertical'.

El código fuente de las dos clases es (pagina1.php):

<html>
<head>
<title>Pruebas</title>
</head>
<body>
<?php
class Opcion {
  private $titulo;
  private $enlace;
  private $colorFondo;
  public function __construct($tit,$enl,$cfon)
  {
    $this->titulo=$tit;
    $this->enlace=$enl;
    $this->colorFondo=$cfon;
  }
  public function graficar()
  {
    echo '<a style="background-color:'.$this->colorFondo.
         '" href="'.$this->enlace.'">'.$this->titulo.'</a>';
  }
}

class Menu {
  private $opciones=array();
  private $direccion;
  public function __construct($dir)
  {
    $this->direccion=$dir;
  }
  public function insertar($op)
  {
    $this->opciones[]=$op;
  }
  private function graficarHorizontal()
  {
    for($f=0;$f<count($this->opciones);$f++)
    {
      $this->opciones[$f]->graficar();
    }
  }
  private function graficarVertical()
  {
    for($f=0;$f<count($this->opciones);$f++)
    {
      $this->opciones[$f]->graficar();
      echo '<br>';
    }
  }
  public function graficar()
  {
    if (strtolower($this->direccion)=="horizontal")
      $this->graficarHorizontal();
    else
      if (strtolower($this->direccion)=="vertical")
        $this->graficarVertical();
  }
}

$menu1=new Menu('horizontal');
$opcion1=new Opcion('Google','http://www.google.com','#C3D9FF');
$menu1->insertar($opcion1);
$opcion2=new Opcion('Yahoo','http://www.yahoo.com','#CDEB8B');
$menu1->insertar($opcion2);
$opcion3=new Opcion('MSN','http://www.msn.com','#C3D9FF');
$menu1->insertar($opcion3);
$menu1->graficar();
?>
</body>
</html>

La clase Opcion define tres atributos donde se almacenan el título del hipervínculo, direccón y el color de fondo del enlace:

  private $titulo;
  private $enlace;
  private $colorFondo;

En el constructor recibimos los datos con los cuales inicializamos los atributos:

  public function __construct($tit,$enl,$cfon)
  {
    $this->titulo=$tit;
    $this->enlace=$enl;
    $this->colorFondo=$cfon;
  }

Por último en esta clase el método graficar muestra el enlace de acuerdo al contenido de los atributos inicializados previamente en el constructor:

  public function graficar()
  {
    echo '<a style="background-color:'.$this->colorFondo.'" href="'.
          $this->enlace.'">'.$this->titulo.'</a>';
  }

La clase Menu recibe la colaboración de la clase Opcion. En esta clase definimos un array de objetos de la clase Opcion (como vemos podemos definir perfectamente vectores con componente de tipo objeto), además almacena la dirección del menú (horizontal,vertical):

  private $opciones=array();
  private $direccion;

El constructor de la clase Menu recibe la dirección del menú e inicializa el atributo $direccion:

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

Luego tenemos el método donde se encuentra el concepto nuevo:

  public function insertar($op)
  {
    $this->opciones[]=$op;
  }

El método insertar llega un objeto de la clase Opcion (previamente creado) y se almacena en una componente del array. Este método tiene un parámetro de tipo objeto ($op es un objeto de la clase Menu)

Luego la clase Menu define dos métodos privados que tienen por objetivo pedir que se grafique cada una de las opciones:

  private function graficarHorizontal()
  {
    for($f=0;$f<count($this->opciones);$f++)
    {
      $this->opciones[$f]->graficar();
    }
  }
  private function graficarVertical()
  {
    for($f=0;$f<count($this->opciones);$f++)
    {
      $this->opciones[$f]->graficar();
      echo '<br>';
    }
  }

Los algoritmos solo se diferencian en que el método graficarVertical añade el elemento <br> después de cada opción.

Queda en la clase Menú el método público graficar que tiene por objetivo analizar el contenido del atributo $direccion y a partir de ello llamar al método privado que corresponda:

  public function graficar()
  {
    if (strtolower($this->direccion)=="horizontal")
      $this->graficarHorizontal();
    else
      if (strtolower($this->direccion)=="vertical")
        $this->graficarVertical();
  }

El código donde definimos y creamos los objetos es:

$menu1=new Menu('horizontal');
$opcion1=new Opcion('Google','http://www.google.com','#C3D9FF');
$menu1->insertar($opcion1);
$opcion2=new Opcion('Yahoo','http://www.yahoo.com','#CDEB8B');
$menu1->insertar($opcion2);
$opcion3=new Opcion('MSN','http://www.msn.com','#C3D9FF');
$menu1->insertar($opcion3);
$menu1->graficar();

Primero creamos un objeto de la clase Menu y le pasamos al constructor que queremos implementar un menú 'horizontal': $menu1=new Menu('horizontal');

Creamos seguidamente un objeto de la clase Opcion y le pasamos como datos al constructor el titulo, enlace y color de fondo:

$opcion1=new Opcion('Google','http://www.google.com','#C3D9FF');

Seguidamente llamamos al método insertar del objeto menu1 y le pasamos como parámetro un objeto de la clase Menu (es decir pasamos un objeto por lo que el parámetro del método insertar debe recibir la referencia a dicho objeto):

$menu1->insertar($opcion1);

Luego creamos tantos objetos de la clase Opcion como opciones tenga nuestro menú, y llamamos también sucesivamente al método insertar del objeto $menu1. Finalmente llamamos al método graficar del objeto $menu1.

Retornar