Páginas

jueves, 30 de diciembre de 2010

Patrón de diseño Singleton PHP


En esta entrada hablaremos sobre el Patrón Singleton, veremos su objetivo e implementación.

Que es el Patrón Singleton??

El Patrón Singleton o instancia única es un método que se encarga de garantizar que una clase solo tenga una sola instancia, esto lo lleva a cabo declarando el constructor de nuestra clase privado de manera que no se pueda acceder directamente a este y creando un método por lo general llamado getInstance(), donde declararemos la instancia de nuestra clase.

 Características del Patrón Singleton:

a) La propia clase es la responsable de crear la única instancia, la cual debe garantizar que no se pueda crear ninguna otra (interceptando todas las peticiones para crear nuevos objetos) y proporcionando un solo punto de acceso a ella.
b) Si no se ha creado anteriormente (o sea, es la primera vez que se usa esta clase) se crea la instancia.
c) Si existe ya anteriormente una instancia (es la segunda o más veces que se usa), se retorna la existente todas las veces que se solicite.
d) El constructor de la clase debe declararse como privado para que la clase no pueda ser instanciada directamente.

Implementación del Patrón Singleton:

class Ejemplo
{
   private static $instancia;
   private $contador;
   

   private function __construct()
   {
      echo "He creado un " . __CLASS__ . "\n";
      $this->contador = 0;
   }

   public static function getInstance()
   {
      if (  !self::$instancia instanceof self)
      {
         self::$instancia = new self;
      }
      return self::$instancia;
   }
   
   public function incrementar()
   {
      return ++$this->contador;
   }
   
   public function disminuir()
   {
      return --$this->contador;
   }
}


Como se indico en la teoría el constructor de la clase Ejemplo es privado, de manera que no se puede instanciar directamente la clase, por lo que declaramos un método que se encargue de instanciar  la clase, en este caso  es el método estático getInstance, este método lo que hace es una verificación de que si ya existe una instancia de la clase, sino existe ninguna se crea la instancia y se guarda en el atributo estático de la clase $instancia, y luego se retorna, pero que pasa si ya existe una instancia?? Sencillamente lo que hace es retornar la instancia que ya existía de la misma, veamos  nuestra clase Ejemplo en ejecución.
$instancia = Ejemplo::getInstance();
echo "instancia (incrementar): " . $instancia->incrementar();
$instancia2 = Ejemplo::getInstance();
echo "instancia2 (incrementar): " . $instancia2 ->incrementar();


El resultado por pantalla sería el siguiente:

He creado un Ejemplo
instancia (incrementar): 1
instancia2 (incrementar): 2

Porque si creamos dos instancias diferentes el contador siguió incrementándose en vez de reiniciarse?? Esto porque como se indico en la teoría el Patrón Singleton solo permite una sola instancia de la clase, al retornar la misma instancia el contador de esta no se reinicia y este sigue incrementándose.

Como nota adicional: Muchos cometemos el “error” de implementarle el patrón singleton a nuestras clases de base de datos, esto en un principio se creía que era bueno ya que te creaba una globalización de la instancia de este tipo de clase, con dudas y manos amigas nos indican que lo mejor para este tipo de clases es el patrón registry.
Bueno espero que el articulo sea del agrado de los lectores de este blog de programación saludos y cualquier comentario, critica es aceptada.

lunes, 27 de diciembre de 2010

Patrón Registry


Para esta entrada hablaremos un poco del Patrón de Diseño Registry,  y expondremos algunos de sus usos.
Primero veamos el código patrón:
/**
 * Registers objects and variables
 *
 * Makes objects and variables available to any level
 * of the application without having to keep track
 * of their existence.  Also useful for objects such
 * as database connectors that are used globaly and
 * not to be duplicated.
 *
 * PHP version 5
 */
 class registry
 {
     /**
      * Registry of variables and objects
      * @access private
      * @var array
      */
     static private $registry = array();
 
     /**
      * Adds an item to the registry
      * @access public
      * @param string item's unique name
      * @param mixed item
      * @return boolean
      */
     public function add($name, $item)
     {
         if (!self::exists($name)) {
             self::$registry[$name] = $item;
             return true;
         } else {
             return false;
         }
     }
 
     /**
      * Returns true if item is registered
      * @access public
      * @param string item's name
      * @return boolean
      */
     public function exists($name)
     {
         if (is_string($name)) {
             return array_key_exists($name, self::$registry);
         } else {
             throw new Exception('Registry item\'s name must be a string');
         }
     }
 
     /**
      * Returns registered item
      * @access public
      * @param string item's name
      * @return mixed (null if name is not in registry)
      */
     public function get($name)
     {
         if (self::exists($name)) {
             $return = self::$registry[$name];
         } else {
             $return = null;
         }
         return $return;
     }
 
     /**
      * Removes a registry entry
      * @access public
      * @param string item's name
      * @return boolean
      */
     public function remove($name)
     {
         if (self::exists($name)) {
             unset(self::$registry[$name]);
         }
         return true;
     }
 
     /**
      * Clears the entire registry
      * @access public
      * @return boolean
      */
     public function clear()
     {
         self::$registry = array();
     }
 }



Si nos fijamos es una clase estática  por lo que podemos acceder a sus métodos sin necesidad de instanciar la clase, dentro de sus métodos los principales son el método add()  y el método get(), mediante estos métodos vamos a llenar la instancia y a mostrar el resultado de la instancia, pero como lo hacemos?? Para crear un valor en el patrón registry usamos el método add este nos pide dos parámetros el primero es el nombre que va a llevar el valor y el segundo es el valor como tal de este veamoslo con un ejemplo:

registry::add('nombre','aca esta el valor que deseamos mostrar');


Sencillamente asignamos a nombre en  esta instancia el valor: aca esta el valor que deseamos mostrar, sencillo no y como utilizamos o se muestra el valor que acabamos de asignar?? Utilizando el método get(),  de esta manera:

echo registry::get('nombre');


El resultado nos mostraría por pantalla “aca esta el valor que deseamos mostrar”, fácil verdad?? Los demás métodos nos sirven para validación de que exista un índice, limpiar e incluso un quitar índice agregado mediante una llamada a este patrón, fácil verdad??
Que nos permite hacer el Patrón Registry??
Sencillamente nos permite mantener y modificar valores e instancias entre clases diferentes e incluso fuera de las mismas (es un concepto personal si alguien tiene objeción la puede realizar y así aprendemos más), a medida que veamos el código se entenderá mas este pequeño concepto,  un pequeño ejemplo:

a.php
class a
{
  public function llenar($valor)
 {
  registry::add('indice',$valor);
 }
}
b.php

class b
{  
 public function mostrar()
 {
  echo registry::get('indice');
 }
}
Index.php
require_once("registry.php");
require_once("a.php");
require_once("b.php");

 $a = new a();
 $b = new b();
 $a->llenar("hola");
 $b->mostrar(); 
Si se fijan en la primera clase asignamos a nuestro patrón registry un valor, en la segunda clase sencillamente mostramos el valor del índice que llenamos en la primera clase sencillo su uso no?? Veamos ahora los demás métodos en acción
b.php
class b
 {  
 public function mostrar($indice)
 {
  if(registry::exists($indice)){
   echo registry::get('indice');
  } 
  else{
   echo "El valor buscado no existe";
  }
 }
 }

re-declaramos la clase b para utilizar más métodos de nuestro patrón registry
index.php
$a = new a();
 $b = new b();
 $a->leer("hola");
 $b->mostrar('indice');
 registry::remove('indice');
 $b->mostrar('indice'); 
Si se fijan usamos el método exists para realizar una validación, y usamos el método remove para eliminar un índice que ya no necesitamos que pasaría si ejecutáramos el código expuesto??  El resultado seria “holaEl valor buscado no existe”, aunque las dos veces la función mostrar indico el mismo “índice“ no nos dio el mismo resultado, esto se debe a que utilizamos el método remove para eliminar un índice que no era más necesario, al volverlo a llamar este no existía y por eso en la validación nos mostró el mensaje de que no existe.
El patrón registry tiene muchos usos, uno de ellos puede ser una clase para conexión, en ese caso especial lo que hace el patrón registry es que solo obtengamos una instancia para un manejador de base de datos, pero a su vez podamos instanciar la clase con otro tipo de manejador.
Espero que el artículo sea de agrado y que haya logrado transmitir su funcionalidad, como siempre digo cualquier crítica o sugerencia es aceptada, hasta una próxima oportunidad saludos.

viernes, 24 de diciembre de 2010

¿Qué hay de nuevo en MySQL 5.5?

Oracle llevará a cabo una presentación online con la que dar a conocer las novedades de la nueva versión final del popular sistema de gestión de bases de datos.

24/12/2010 - Bajo el título Whats New: MySQL 5.5 and MySQL Enterprise Edition, Oracle llevará a cabo un nuevo seminario online gratuito en donde podremos conocer las características de la nueva versión MySQL 5.5 (mejoras en rendimiento y velocidad, mayor escalabilidad, InnoDB como motor de almacenamiento por defecto...)

Whats New: MySQL 5.5 and MySQL Enterprise Edition se llevará a cabo el próximo 18 de enero, tendrá una duración aproximada de una hora, tras la que se abrirá un turno de preguntas y respuestas, y será llevado a cabo íntegramente en inglés.

Aquellos que lo deseen pueden adelantarse a este webseminar de Oracle, accediendo al manual de MySQL 5.5 desde dev.mysql.com.

Interesados pueden encontrar información dacerca del horario, contenido, inscripción.. en Whats New: MySQL 5.5 and MySQL Enterprise Edition desde www.mysql.com.

Fuente: DesarrolloWeb

miércoles, 22 de diciembre de 2010

Clases y métodos abstractos en PHP.

En esta nueva entrada retomando lo que refiere a la Programación Orientada a Objetos hablaremos un poco de las clases y métodos abstractos y cómo trabajar este tipo de clases.
Una clase abstracta: Es aquella a la que no podemos acceder directamente desde ella, sino a través de sus derivados, pero la abstracción va mas allá de eso wikipedia nos indica en resumidas cuenta la abstracción se enfoca mas en que hace que en cómo se hace??. Pero como aplicamos esto a nuestras clases?? En PHP la declaración de una clase abstracta se hace mediante la palabra “abstract” seguido de la palabra “class” y nombre de la clase ejemplo:
abstract class nombreClase

Pero en que nos ayuda una clase abstracta?? Esta permite que utilicemos las características de un objeto para crear nuevos objetos a partir de esta, veámoslo con un ejemplo, suponiendo que tengamos una clase abstracta llamada animales, los atributos o características de esta nos sirven también para clases como mamíferos, o clase ovíparos ya que estos siguen siendo una derivación de los animales, veamos un ejemplo de la implementación con nuestro ejemplo:
Animales.php
abstract class animales
{
 abstract function nacer(); 
}
mamiferos.php
class mamiferos extends animales
{
 public function nacer()
 {
  echo "los mamiferos nacen del parto de la madre";
 }
}
oviparos.php
class oviparos extends animales
{
 public function nacer()
 {
  echo "los oviparos nacen de los huevos";
 }
}
Si nos fijamos la clase abstracta animal tiene un método abstracto llamado nacer, los métodos abstractos al igual que las clases son un servicio que se presta a las clases derivadas, ya que este tipo de clase no limita a una sola característica, es acá cuando vemos el “que hace” y “no como lo hace” que nos indica el autor del articulo de wikipedia, si nos fijamos nuestra clase animales tiene el método abstracto llamado nacer esto es lo que hace, como lo hace?? Esto lo declaramos en sus derivadas que en nuestro caso son mamíferos y ovíparos.
Hasta aca hemos visto un poco la implementación de las clases abstractas, pero al principio indicábamos que una clase abstracta no puede ser accedida directamente, sino a través de sus clases derivadas, entonces que pasaría si intentamos instanciar una clase abstracta??
abstract class animales
{
 abstract function nacer(); 
}

$animales = new animales();


Nos indicaría el siguiente error: “Fatal error: Cannot instantiate abstract class animales”, o que pasaría sino declaramos el método nacer en la clase ovíparos e intentamos acceder directamente al método nacer de la clase animales??

class oviparos extends animales
{
 public function comer()
 {
  /*código del metodo*/
 }
}
$oviparos = new oviparos();
$oviparos->nacer();


Nos indicaría el siguiente error “Fatal error: Class oviparos contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (animales::nacer)”

Si traducimos el error nos indica que la clase ovíparos tiene un método abstracto que debe de ser implementado o sencillamente declarar la clase abstracta.

A pesar de este error no todas los métodos de las clases abstractas deben de ser implementados, incluso hay clases abstracta en la que se declaran métodos públicos para acceder desde sus derivados un ejemplo:

Animales.php

abstract class animales
{
 abstract function nacer();
 public function fauna(){
  echo "los animales pertenecen a la fauna silvestre";
 } 
}


Ovíparos.php
require_once(“aninales.php”);
class oviparos extends animales
{
 public function nacer()
 {
  echo "los oviparos nacen de los huevos";
 }
}
$oviparos = new oviparos();
$oviparos->fauna();

si nos fijamos declaramos un método que es público para todos los animales directamente dentro de la clase abstracta, aunque no se pueda acceder a esta directamente con new animal() se puede acceder a este método sin necesidad de ser implementado en sus derivadas
Las clases abstractas nos dan uno de los principios de la Programación Orientada a Objetos (POO) que es la abstracción de los datos lo cual nos brinda una gran ayuda al momento de realizar nuestros sistemas.
Espero que este artículo sea de utilidad, cualquier corrección o sugerencia no duden en realizarla, saludos

domingo, 19 de diciembre de 2010

Creacion de Graficos en documentos PDF con FPDF y JGRAPH

Para esta nueva entrada realizaremos reportes estadísticos mediante gráficos de torta, utilizando la librería FPDF y JGRAPH.

Materiales necesarios:
-Librería FPDF descargar
-Librería JGRAPG, descargar

Muchas veces al momento de estar realizando nuestros sistemas necesitamos reportes estadísticos en los mismo, mayormente lo que se necesita es un documento con los datos en formato PDF, es ahí donde utilizamos la librería FPDF, esta es una librería formada por una clase cuyos métodos nos ayudan a generar los documentos PDF, para mayor información en su sitio oficial http://www.fpdf.org/. Pero esta librería por sí sola no nos permite generar gráficos estadísticos es ahí donde entra la participación de la librería JGRAP, la cual es una librería que nos permite generar gráficos estadísticos escrita en PHP, para mas información de JGRAPH su sitio oficial es http://jpgraph.net/ .
Pero como trabajar estas librerías juntas??
En esta ocasión realizaremos una clase llamada reporte que extiende de FPDF y dentro de sus métodos utilizaremos uno para generar los gráficos mediante JGRAPH. Vamos a la acción.
Como Se indico lo primero que haremos es crear una clase que extiende FPDF esto para poder acceder a los métodos de esta librería y así crear nuestro documento PDF
class Reporte extends FPDF
{
     public function __construct($orientation='P', $unit='mm', $format='A4')
  {
   parent::__construct($orientation, $unit, $format);
 } 
}
Si nos fijamos el constructor de nuestra clase sobrescribe al constructor de la clase FPDF, de manera que cuando instanciamos nuestra clase si le damos algún parámetro el mismo pasara también a la clase padre.

Luego crearemos un método para generar los gráficos, en este articulo solo trabajaremos con los gráficos de tarta, si es necesario otro tendríamos que hacer algunas modificaciones a nuestro método.
public function gaficoPDF($datos = array(),$nombreGrafico = NULL,$ubicacionTamamo = array(),$titulo = NULL)
 { 
  //construccion de los arrays de los ejes x e y
  if(!is_array($datos) || !is_array($ubicacionTamamo)){
   echo "los datos del grafico y la ubicacion deben de ser arreglos";
  }
  elseif($nombreGrafico == NULL){
   echo "debe indicar el nombre del grafico a crear";
  }
  else{ 
   #obtenemos los datos del grafico  
   foreach ($datos as $key => $value){
    $data[] = $value[0];
    $nombres[] = $key; 
    $color[] = $value[1];
   } 
   $x = $ubicacionTamamo[0];
   $y = $ubicacionTamamo[1]; 
   $ancho = $ubicacionTamamo[2];  
   $altura = $ubicacionTamamo[3];  
   #Creamos un grafico vacio
   $graph = new PieGraph(600,400);
   #indicamos titulo del grafico si lo indicamos como parametro
   if(!empty($titulo)){
    $graph->title->Set($titulo);
   }   
   //Creamos el plot de tipo tarta
   $p1 = new PiePlot3D($data);
   $p1->SetSliceColors($color);
   #indicamos la leyenda para cada porcion de la tarta
   $p1->SetLegends($nombres);
   //Añadirmos el plot al grafico
   $graph->Add($p1);
   //mostramos el grafico en pantalla
   $graph->Stroke("$nombreGrafico.png"); 
   $this->Image("$nombreGrafico.png",$x,$y,$ancho,$altura);  
  } 
 }
Si se fijan dentro de los paramtros de nuestro método tenemos:
$datos: Es un arreglo asociativo con los datos que se desean graficar, para nuestro ejemplo es la cantidad de alumnos aprobados y reprobados de un salón de clase. El arreglo que contendrá los datos debe de tener la siguiente estructura.
Array(‘nombredeldato’=>array(valor,colorEnTarta));
Cada uno de los valores tendrá que ser mediante este formato para obtener el grafico en la manera deseada.
$nombreGrafico: Es el nombre que llevara la imagen del grafico que se creara, el método “gaficoPDF” lo que hace es crear una imagen por medio de la librería JGRAPH y luego llamar a la misma desde FPDF para obtener así el grafico dentro del documento PDF, entonces este parámetro será el nombre con que se guardara nuestra imagen del grafico en nuestro servidor.

$ubicacionTamaño: Este parámetro es un arreglo donde indicaremos el lugar y el tamaño dentro de la página que deseemos que se encuentre nuestro grafico, el formato es el siguiente
array(posicionx,posicionY,ancho,alto);

$titulo: Es la única variable que será opcional, esto por motivado a que muchas veces colocamos el titulo desde FPDF y no es necesario colocárselo al grafico, pero si en algún momento es necesario solo con indicar este parámetro el titulo del grafico sera colocado en nuestra imagen por medio de JGRAPH.
Ahora que conocemos los parámetros que debemos indicarle a nuestro método solo nos queda instanciar la clase y llamar al metodo gaficoPDF de la misma para obtener un documento PDF con un grafico estadístico.
$pdf=new Reporte();//creamos el documento pdf
$pdf->AddPage();//agregamos la pagina
$pdf->SetFont("Arial","B",16);//establecemos propiedades del texto tipo de letra, negrita, tamaño
//$pdf->Cell(40,10,'hola mundo',1);
$pdf->Cell(0,5,"GRAFICO REALIZADO CON FPDF Y JGRAPH",0,0,'C');
$pdf->gaficoPDF(array('aprobados'=>array(1,'red'),'reprobados'=>array(1,'blue')),'Grafico',array(20,40,100,50),'grafico');
$pdf->Output();
Sencillamente en este código instanciamos la clase Reportes y llamamos a varios de los métodos de la librería FPDF para crear el documento PDF y mediante el método creado en este tutorial creamos un grafico de tarta.
Les dejo el código completo del artículo:
/*
clase para reportes 
autor Carlos Belisario
*/

require_once("fpdf/fpdf.php");
require_once('jpgraph/inc/jpgraph.php');
require_once('jpgraph/inc/jpgraph_pie.php');
require_once ("jpgraph/inc/jpgraph_pie3d.php");
class Reporte extends FPDF
{
     public function __construct($orientation='P', $unit='mm', $format='A4')
  {
   parent::__construct($orientation, $unit, $format);
 } 
public function gaficoPDF($datos = array(),$nombreGrafico = NULL,$ubicacionTamamo = array(),$titulo = NULL)
 { 
  //construccion de los arrays de los ejes x e y
  if(!is_array($datos) || !is_array($ubicacionTamamo)){
   echo "los datos del grafico y la ubicacion deben de ser arreglos";
  }
  elseif($nombreGrafico == NULL){
   echo "debe indicar el nombre del grafico a crear";
  }
  else{ 
   #obtenemos los datos del grafico  
   foreach ($datos as $key => $value){
    $data[] = $value[0];
    $nombres[] = $key; 
    $color[] = $value[1];
   } 
   $x = $ubicacionTamamo[0];
   $y = $ubicacionTamamo[1]; 
   $ancho = $ubicacionTamamo[2];  
   $altura = $ubicacionTamamo[3];  
   #Creamos un grafico vacio
   $graph = new PieGraph(600,400);
   #indicamos titulo del grafico si lo indicamos como parametro
   if(!empty($titulo)){
    $graph->title->Set($titulo);
   }   
   //Creamos el plot de tipo tarta
   $p1 = new PiePlot3D($data);
   $p1->SetSliceColors($color);
   #indicamos la leyenda para cada porcion de la tarta
   $p1->SetLegends($nombres);
   //Añadirmos el plot al grafico
   $graph->Add($p1);
   //mostramos el grafico en pantalla
   $graph->Stroke("$nombreGrafico.png"); 
   $this->Image("$nombreGrafico.png",$x,$y,$ancho,$altura);  
  } 
 } 
}
$pdf=new Reporte();//creamos el documento pdf
$pdf->AddPage();//agregamos la pagina
$pdf->SetFont("Arial","B",16);//establecemos propiedades del texto tipo de letra, negrita, tamaño
//$pdf->Cell(40,10,'hola mundo',1);
$pdf->Cell(0,5,"GRAFICO REALIZADO CON FPDF Y JGRAPH",0,0,'C');
$pdf->gaficoPDF(array('aprobados'=>array(1,'red'),'reprobados'=>array(1,'blue')),'Grafico',array(20,40,100,50),'grafico');
$pdf->Output(); 

el resultado seria el siguiente:
Grafica con FPDF y JGRAPH

Espero que le sea de utilidad a alguien cualquier correccion o sugerencia no duden es hacerla saludos

Funciones en PHP

Para esta entrada antes de seguir con lo que respecta a las clases, hablare un poco de las funciones en PHP, esto motivado a que los metodos de las clases se componen por funciones y para los que comenzamos aveces nos es dificil entender el funcionamiento de estas, entonces una funcion que es??

Una funcion es un fragmento de código que utilizamos para realizar una tarea o accion especifica, se declaran mediante la palabra "function" seguido de los parentesis "()", y el código que va dentro de esta se encierra entre corchetes.
ejemplo de declaracion de una funcion:
function nombreDeFuncion()
{
  echo "Este es el codigo de la funcion";
}

Sencillo no?? para utilizar el codigo de esta funcion solo tendriamos que realizar un llamado a la misma, esto lo hacemos colocando el nombre de la funcion seguido de los parentesis ejemplo

function nombreDeFuncion()
{
  echo "Este es el codigo de la funcion";
}
nombreDeFuncion();
si ejecutamos este código como resultado tendriamos el texto que indicamos entre las comillas.

Hasta ahora hemos hablado de las funciones simples, pero las funciones van mas alla de esto ya que a estas podemos ingresarles parametros externos e incluso pedir que nos den un retorno, pero parametos?? retorno?? que es como se usa??.

Un parametro es un valor que le pasamos a la funcion en su llamado, para esto en la declaracion de la funcion debemos de indicar entre los parentesis el nombre de este y cuando llamemos a la misma debemos indicarle en los parentesis cual es el valor del mismo ejemplo:
function saludar($quien)
{
  echo "Hola ".$quien." como estas?
";
}
saludar("carlos");
saludar("pedro");
saludar("juan");
el resultado de estas llamadas nos da como resultado

hola carlos como estas
hola pedro como estas
hola juan como estas

sencillo no?? pero que pasa si no le pasamos ningun parametro al momento de hacer el llamado

saludar();
PHP nos daria el siguiente alerta "Warning: Missing argument 1 for saludar(), called in". Esto lo que nos indica sencillamente es que falta indicar el argumento de la funcion saludar, para evitarnos este tipo de error podemos declarar "parametros por defectos".

Un parametro por defecto es un parametro al cual se le asigna un valor al momento de declarar una funcion, esto nos da como ventaja que si a la funcion no se le pasa parametro este toma el valor que se le indico, por lo que PHP no nos enviaria el Warning que nos mostro al principio, y asi podriamos enviar un mensaje al usuario indicandole que debe indicar el valor veamoslo con un ejemplo
function saludar($quien = "valor por defecto")
{
  if($quien == "valor por defecto"){
    echo "debe indicar un valor a la funcion";
  }
  else{
     echo "Hola ".$quien." como estas?
";
  }
}
si se fijan hicimos un condicional para que si no se pasa ningn valor la funcion se lo indique al usuario, sencillo no??.

Ahora hablaremos un poco sobre el retorno, el retorno de una funcion es un valor que esta regresa despue de la ejecución, declaramos el retorno dentro de la funcion mediante la palabra return seguido del valor que se desea regresar ejemplo.
function sumar($valor1 = 0,$valor2 = 0)
{
  $resultado = $valor1 + $valor2;
  return $resultado;
}
echo sumar(1,1);
si ejecutamos este codigo el resultado sera en la pantalla la suma de los numeros que se pasa como parametro.

OJO: es importante diferenciar entre el retorno de una funcion y mostrar el mensaje de la misma, el retorno de la funcion es un valor que esta retorna al momento de su ejecucion y puede ser almacenado y utilizado en otra parte de nuestro codigo, en cambio el imprimir un mensaje dentro de la funcion solo nos mostrara el mensaje cuando se ejecute la misma, aca dejo un ejemplo que daba en foros del web cuando hacian esta pregunta Diferencia entre echo y return

bueno el uso de la funciones es muy amplio, como dije al principio en la POO se usa para declarar los metodos de nuestras clases, tambien para hacer rutinas de codigo les dejo un pequeño ejemplo:
function calcularEdad($fecha=NULL)
{
   $fe = explode("-",$fecha);    
   if($fe[1] == date("m")){
      $edad = date('Y')-$fe[0]-1;
   }
   elseif($fe[1] == date('m')){
      if($fe[2] < date('d'))
         $edad = date('Y')-$fe[0];
      }
      else{
         $edad = date('Y')-$fe[0]-1;
      }
   }
   else{
       $edad = date('Y')-$fe[0];
   }
   return $edad;
}
//la llamamos con la fecha en formato 'año-mes-dia'
echo calcularEdad('2010-12-20');

esta es una funcion que calcula la edad indicandole la fecha de nacimiento como parametro, la utilidad de la funcion esta en que si necesitamos hacer un registro donde calculemos la edad solo tenemos que llamar a esta funcion, si deseamos tener tambien uun formulario de edicion de registro y cambia la fecha de nacimiento, no tenemos que escribir otra vez este codigo sino que llamar a la funcion, espero que esta entrada sea util, es basico pero enseña algo que es necesario saludos y hasta una proxima entrada

sábado, 18 de diciembre de 2010

Programacion Orientada a Objetos Metodos y Atributos estaticos


Para esta entrada continuando con el tema de la Programación Orientada a Objetos, voy  a hablarles sobre los atributos y métodos estáticos, como acceder a ellos que son, el operador de ámbito, y la funcionalidad de este tipo de metodos.

Cuando declaramos un método estático “static”,  le indicamos que este no puede acceder directamente  a los atributos y métodos de la clase donde fue creado, para declarar un método estático le colocamos la palabra “static delante de la visibilidad del método que se está creando.

<?php
class nombreClase
{
     static public function metodoClase()
    {
        #metodos de la clase
    }
}
?>

Sencillo no?? En el artículo anterior trabajábamos con la variable “$this” para acceder a los atributos y métodos de la clase desde los otros métodos de la misma. Con los métodos estáticos es diferente, ya que si intentamos acceder a un atributo o un método de la clase desde un método estático con la variable $this nos daría un error de contexto veamos un ejemplo:

<?php
class nombreClase
{
     static public function medotoEstatico ()
    {
            $this-> metodoClase ()
    }   
    public function metodoClase()
    {
          echo “Hola como estas”;         
    }
}
nombreClase::medotoEstatico();
?>
Nos daría el siguiente error: “Fatal error: Using $this when not in object context”, esto si traducimos el mensaje lo que nos indica es que no hay un contexto de objeto por usar el $this”, que es como accedemos a los atributos y/o métodos  de la misma clase normalmente, en su lugar cuando trabajamos métodos estáticos debemos usar “self”, la palabra “self” hace referencia a la clase que se está trabajando, a diferencia de $this que hace referencia a la instancia de la clase, entonces para que el ejemplo anterior funcionara la implementación seria de la siguiente manera

<?php
class nombreClase
{
     static public function medotoEstatico ()
    {
           self::metodoClase ();
    }   
    public function metodoClase()
    {
            echo “Hola como estas”;         
    }
}
nombreClase::medotoEstatico();
?>

Ahora si nos daría el resultado que deseamos. Pero que hicimos?? O en qué momento instanciamos la clase??  Una de las ventajas de los métodos estáticos es que no es necesario crear un objeto para acceder a ellos, esto en ocasiones puede ser útil ya que hay veces que solo necesitamos utilizar un método de una clase y no la instancia completa, la manera de acceder a estos es con el nombre de la clase seguido del operador de ámbito “::”.

Antes de ir al ejemplo definiremos el operador de ámbito (::), es aquel que nos permite acceder a los métodos y/o atributos estáticos de una clase, bien sea para referirnos al atributo o método desde afuera de esta, como para llamar a un atributo o método desde un método estático, tambien nos sirve para acceder a metodos de la clase padre mediante la palabra "parent::metodoDelPadre", ahora si vamos al ejemplo que nos muestra tanto el operador de ámbito como el llamado a un método estático.

Ejemplo:

<?php
nombreClase::medotoEstatico();
?>

Si nos fijamos de esta misma manera fue que accedimos al método estático dentro de nuestra clase, con el uso de la palabra self.

Pero como lo uso o en qué momento lo uso??

Una buena muestra de los métodos y atributos estaticos es el patrón de diseño singleton

<?php
class Ejemplo
{
/*atributos de la clase*/

private static $_instances = null;
private function __construct()
{                     
}
/*otros metodos de la clase*/
public static function getInstance()
{
            if( self::$_instances == NULL ) {
                        self::$_instances = new self();
            }
            return self::$_instances;
}
/*otros metodos de la clase*/
           
}
?>

En palabras sencillas ya que el vinculo da una mayor explicación, la implementación del patrón singleton solo nos permite  que  se pueda crear una instancia única de la clase que estamos trabajando, si se fijan el constructor de la clase es privado por lo que no se puede acceder a él desde fuera de la misma, como se implementaría??

<?php
class Ejemplo
{
/*atributos de la clase*/

private static $_instances = null;
private function __construct()
{                     
}
/*otros metodos de la clase*/
public static function getInstance()
{
            if( self::$_instances == NULL ) {
                        self::$_instances = new self();
            }
            return self::$_instances;
}
public function saludar()
{
      echo “Hola como estas”;         
}         
}
$objeto = Ejemplo::getInstance();
$objeto->saludar();

?>
Este es uno de las implementaciones de los métodos estáticos, espero que el artículo sea de su agrado cualquier aporte o critica lo pueden hacer ya que el echo es que aprendamos todos, un saludo y hasta la próxima entrada.

viernes, 17 de diciembre de 2010

Introduccion a la POO en PHP


Buenas en esta nueva entrada se hablara sobre un tema que a los que comenzamos a trabajar con PHP nos cuesta un poco y es la Programación Orientada a Objetos, como muchos cuando comencé con el PHP la manera como me indicaron que se tenía que programar era de forma estructurada,a pesar de que ya existía PHP5+ (para mí una maravilla ya que se me hacia fácil resolver problemas mediante pseudo-códigos estructurados), a medida que me fui interesando por el desarrollo en PHP en mi investigación veía que habían personas que hablaban de Programación Orientada a Objetos, PHP5,  patrones de diseños y demás, entonces surgió la duda en PHP se utiliza la programación orientada a objetos??  Pues luego de varias semanas de lectura me di cuenta lo atrasado que estaba, la mayoría realizando sistemas con POO y yo de manera estructurada en mi forma "tradicional", pues para no quedarme atrás me adentre poco a poco en esto y con lecturas y cometiendo errores y la gente de los foros corrigiéndome me cree un concepto sencillo para mí:

Es una técnica de programación basado en abstracción y polimorfismo de datos, utilizada para el desarrollo de sistemas informáticos (Web en mi caso), ofreciéndonos ventajas como la reutilización de código, la abstracción de datos, herencia entre otras, haciendo mas fácil el mantenimiento de nuestros sistemas y permitiéndonos crear sistemas más complejos.

Pero Como se implementa??.
La Programación Orientada a Objetos como su nombre lo indica trabaja mediante objetos que son creados mediante clases.
Entonces surge la pregunta que es una clase?? Sencillamente es la manera por la crearemos los objetos. un pequeño ejemplo:

<?php
class clase{
//definimos los métodos y atributos la clase
}
?>

y como la instanciamos??

$objeto = new clase();

El ejemplo anterior creamos una clase llamada "clase", luego la instanciamos y la asignamos a la variable "$objeto" convirtiendo esta variable en un objeto de tipo clase y mediante de este acceder a sus atributos y métodos.

Pero atributos, métodos que son y para que se usan??.
Una clase se compone de varios componentes que debemos tomar en cuenta y estos:
-Atributos.
-Métodos.

Un atributo no es más que los datos propios de nuestro objeto, en PHP son definidos como variables y se accede a ellos de la siguiente forma

class clase
{
   public $atributo;  
   public function metodo()
   {
     $this->atributo = "hola";
   }
}

y como accedemos a ellos??

$objeto = new clase();
echo $objeto->atributo;
Como podemos observar los atributos dentro de nuestras clases los definimos con una visibilidad (public, private, protected) y una variable de PHP y los manejamos con la palabra "$this->atributo;", luego para acceder a ellos desde la instancia del objeto solo debemos indicarle al objeto cual deseamos instanciar sencillo no??. Normalmente los atributos son declarados de visibilidad privada "private" para que solo se pueda acceder a ellos mediante los métodos de la misma clase.

Continuando hemos hablado de métodos y colocamos uno en el ejemplo anterior y todavía no definimos que son. Un Método es la acción que deseamos que ejecute nuestro objeto, en PHP se definen por medio de la palabra "function", al igual que los atributos podemos indicarle una visibilidad, si no indicamos ninguna sencillamente tomara visibilidad publica.  Veamos cómo se trabajan.

class clase
{
     private $atributo;
     public function metodo()
     {
         $this->atributo = "hola";
         return $this->atributo;
     }
}

Como se accede a los métodos??

$objeto = new clase;
echo $objeto->metodo();

si se fijan acá estamos indicándole al objeto que ejecute la acción método en este caso sencillamente asignara al atributo la palabra "hola" y luego la retornara mostrando  en la pantalla al hacer el echo de esta acción hola.

Pues ya que conocemos que son los atributos y que son los métodos y que estos tienen una visibilidad vamos a indicar cuáles son las posibles visibilidades que estos pueden tomar:

-Visibilidad Pública: Declaramos un atributo o un método publico antecediendo del nombre del atributo o la declaración del método la palabra public.

public $atributo;#atributo publico
public function metodo()#metodo publico
{
}

Si declaramos un atributo o un método con esta visibilidad pueden ser accedidos desde cualquier lugar de nuestro programa como lo veíamos cuando hablamos de estos anteriormente para poder acceder a alguno de ellos desde la instancia colocábamos la palabra public.

class clase
{
     public $atributo;
     public function metodo()
     {
         $this->atributo = "hola";
         return $this->atributo;
     }
}
$objeto = new clase;
$objeto->metodo();
echo $objeto->atributo;

si colocamos el siguiente código nos mostrara la palabra hola, ya que primero estamos ejecutando el método donde asignamos al atributo esta cadena de texto y luego estamos imprimiendo el atributo, como observamos pudimos acceder tanto al método como al atributo desde la instancia de nuestro objeto ya que estaban con visibilidad publica.

-Visibilidad Privada: Declaramos un atributo o un método privado antecediendo del nombre del atributo o la declaración del método la palabra private.

private $atributo;#atributo privado
private function metodo()#metodo privado
{
}

Cuando declaramos un método privado solo podemos acceder a este mediante un método de nuestro objeto, siguiendo el ejemplo anterior vemos

class clase
{
     private $atributo;
     public function metodo1($texto)
     {
         $this->atributo = $texto;
         $this->metodo2();
         return $this->atributo;
     }
     private function metodo2()
     {              
                         $this->atributo .= " agregando del metodo privado";
     }
}
$objeto = new clase;
echo $objeto->metodo1("hola");


si nos fijamos se creo un método publico para poder acceder al método y atributo privado si hubiéramos echo como en el ejemplo anterior que lo instanciamos de esta manera

$objeto = new clase;
$objeto->metodo2();
echo $objeto->atributo;

nos hubiera salido el siguiente error de sintaxi Fatal error: Call to private method clase::metodo2() from context ''  debido a que estábamos intentando acceder a un atributo o método privado desde la instancia de la clase y la visibilidad privada solo permite acceder a estos desde la misma clase.

-Visibilidad Protegida: cuando declaramos un atributo o método protegido (protected) toma la misma forma que la visibilidad privada con la salvedad de que también se puede acceder a ellos por medio de la herencia, cuando hablemos de la herencia se colocara un ejemplo de este tipo de visibilidad.


Constructores: Los constructores son sencillamente la primera acción que se ejecuta al momento de instanciar una clase, estos se ejecutan de manera automática, es decir cuando realizamos algo como esto

$objeto = new clase();

Automáticamente se ejecuta el constructor de la clase "clase", este tipo de métodos mayormente es utilizado para inicializar los atributos que se van a utilizar dentro de nuestras clases ya que se ejecuta antes que cualquier otro método.

Como declaramos un constructor?? en PHP 4 los constructores se declaraban creando un metodo con el mismo nombre de la clase al estilo "C++", a partir de PHP5+ los constructores se declaran mediante un metodo llamado "__construct" un ejemplo


php4


class clase
{
     function clase()
     {
     }
}

en PHP5+
class clase
{
     public function __construct()
     {
     }
}


muchos autores recomiendan declarar constructores aunque sean vacios, yo personalmente casi siempre los declaro para inicialización de atributos e incluso a veces llamo a funciones privadas desde el constructor.


Continuando con nuestro articulo ahora hablaremos sobre la herencia

La herencia: No es más que el crear una clase a partir de una clase existente, esto se realiza de la siguiente manera:

<?php
class nombre_clase extends clase_padre
{
/*atributos y metodos de la clase*/
}
?>

Sencillamente para crear una clase que herede de otra colocamos el nombre de la clase seguido de la palabra “extends” y el nombre de la clase de la que va a derivar
, como se implementa??
Veamos un ejemplo: supongamos que tenemos un aula de clases, dentro de esta aula tenemos personas, las personas tienen atributos como nombre,apellido,cedula,dirección y ejecutan acciones como saludar, despedirse entre otras, en el aula de clase las personas se dividen en dos tipos los que son alumnos y los que son profesores, los profesores tienes atributos como su nombre, apellido, dirección, materias impartidas y ejecutan acciones como saludar, despedirse, iniciar la clase, aplicar prueba, corregir la prueba, los alumnos también tienen sus atributos como nombre, apellido, dirección, carrera que estudia y ejecutan acciones como saludar, despedirse, realizar prueba, ver notas, por poner un ejemplo, entonces podemos crear dos clases una para alumno y una para profesores con todos sus métodos y atributos cierto?? Diciéndole los atributos y métodos de los alumnos y otra diciéndole todos los atributos y métodos de los profesores?? Pues aunque pudiera hacerse de esa manera y funcionar no es la manera más optima porque en  la POO existe lo que llamamos herencia, entonces de este planteamiento podemos indicar 3 clases una clase PADRE llamada persona esta clase tendremos los atributos y métodos que indicamos que realizan normalmente las personas sin indicar titulo ni nada parecido, atributos(nombre,apellido,direccion) y acciones (saludar y despedirce) estos atributos y estas acciones son comunes para los alumno ya que como persona pueden saludar tanto al otro alumno como a un docente y viceversa, ahora que acciones realiza un docente que un alumno no segun las establecidas?? bueno es ahi donde creamos la clase hijo docente, pero hijo porque?? porque como docentes también tenemos los atributos de persona como son el nombre el apellido, etc, igual pasa con la clase alumno, seria un hijo de persona ya que como alumnos también tenemos un nombre, apellido, etc y tendríamos acciones que se realizan como alumno que como profesor no, bueno espero no haberme hecho un lio. Vamos a la implementación de nuestro pequeño ejemplo dijimos que la solución mas correcta  es crear una clase padre llamada persona para ello creamos un archivo llamado

personas.php

class persona
{
            protected $nombre;
            protected $apellido;
            protected $direccion;
            public function __construct($nombre = NULL,$apellido = NULL,$direccion = NULL)
            {
                        $this->nombre = $nombre;
                        $this->apellido = $apellido;
                        $this->direccion = $direccion;
            }
            public function saludar($quien = "alumnos")
            {
                        $saludar = "Buenos dias ".$quien;
                        return $saludar;
            }
            public function despedirce()
            {
                        $despedirce = "Hasta luego";
                        return $despedirce;
            }
}

que hicimos??
Creamos la clase persona definimos los atributos como protected esto como indicabamos cuando hablamos de la visibilidad para que solo la clase persona y las clases que derive de esta puedan tener acceso a estos atributos. siguiendo con el ejemplo creamos los metodos que son las acciones que va a realizar la clase persona, estas acciones seran simples mensajes que se mostraran un saludo y una despedida, ahora procedemos a crear ahora la clase profesor para esto creamos un archivo llamado profesor.php
<?php
#incluimos la clase padre persona
require_once( "persona.php" );
class profesor extends persona
{
            private $clases_impartidas;      
            public function  __construct($nombre = NULL,$apellido = NULL,$direccion = NULL)
            {
                        parent::__construct($nombre,$apellido,$direccion);                  
            }          
            public function iniciarClase($tema = NULL)
            {
                        $mostrar = $this->saludar("alumnos");              
                        $mostrar .= "<br/>La clase de hoy es sobre ".$tema." atentamente ".$this->nombre;
                        return $mostrar;
            }
            public function realizarPrueba($tema = NULL)
            {
                        $mostrar = $this->saludar("alumnos");  
                        $mostrar .= "<br/>La prueba de hoy es sobre ".$tema." Atentamente ”.$this->nombre;
                        return $mostrar;
            }          
}
$profesor = new profesor();
echo $profesor->realizarPrueba("matematica");
?>

que hicimos??

creamos una clase llamada profesor derivada de la clase persona, esto para acceder a los datos o atributos y acciones o métodos de la clase persona de manera que un profesor pueda indicar sus datos personales o sencillamente saludar o despedirse, si se fijan dentro de la clase profesor accedimos al método “datosPersonales” de personas y además dentro del inicio de clases y la realización de la prueba accedimos al atributo nombre de persona, esto es la grandeza de la herencia poder reutilizar los métodos en diferentes clases ya que al momento de realizar la clase alumno también se podrá acceder a estos métodos ahorrándonos el tiempo de estar escribiendo el mismo código varias veces.

La clase alumno la dejo para que la creen ustedes de manera de práctica ya que con la explicación de la clase profesor se explico los principios de la herencia.

Por este post creo que es todo cualquier observación o corrección la pueden realizar, acepto criticas ya que el blog es tanto para enseñar como para aprender saludos a todos los lectores hasta una próxima oportunidad.