Archivos para junio, 2010

Encapsulamiento

Publicado: junio 19, 2010 en POO

Encapsulamiento
El encapsulamiento nos permite tener una visibilidad de los datos o métodos de una clase.

Modificadores Es visible en
Clase Subclase afuera
public SI SI SI
protected SI SI NO
private SI NO NO

Los modificadores de acceso son tanto para las varíales como los métodos de una clase.
Por ejemplo:

<?php
abstract class AbstractCoche{
	private $velocidadMaxima=200;
    public  $varPublica="es una variable publica";
	protected function encender(){
	   $this->encendido=true;
	   echo "<br>$this->modelo encendido";
	}
	function velocidadMaximaDentroClaseAbstractCoche(){
	   return $this->velocidadMaxima;
	}
	
}

class Carro extends AbstractCoche{
	var $marca="";     //marca del carro
    var $modelo="";    //modelo del carro
    var $velocidad=0;  //velocidad actual del carro
    var $encendido =false ;  //true si esta encendido l false si esta apagado el carro
	
	function velocidadMaximaClaseCarro(){
	   return $this->velocidadMaxima;
	}
	
	function Carro($marca,$modelo){
		$this->marca=$marca;
		$this->modelo=$modelo;
	}

	function apagar(){
		$this->encendido=false;
		echo "<br>$this->modelo apagado";
	}

	function aumentarVelocidad($velocidad=2){
		$this->velocidad=$this->velocidad+$velocidad;
		echo "<br>$this->modelo corriendo a $this->velocidad km (aumentando velocidad)";
	}

	function disminuirVelocidad($velocidad=2){
		$this->velocidad=$this->velocidad-$velocidad;
		echo "<br>$this->modelo corriendo a $this->velocidad km (disminuyendo velocidad)" ;
	}

	function frenar(){ //preguntar a la clase
		$this->velocidad=$this->velocidad-2;
		echo "<br>$this->modelo a frenado con velocidad a $this->velocidad km";
	}
	
	function encenderClaseAbstractCoche(){
	   $this->encender();
	}
	
}

	echo "<br>-------------------  FORD - MUSTANG   --------------------";

	$carro1=new Carro("FORD","MUSTANG");
//la linea de abajo marcaria error ya que velocidadMaxima es visible solo en la clase abtracta privata
//	echo "<br>velocidad maxima=".$carro1->velocidadMaxima;
// tampoco se peude acceder desde la clase derivada con la linea de abajo
//	echo "<br>velocidad maxima=".$carro1->velocidadMaximaClaseCarro();
// solo se puede acceder con un metodo que este dentro de la clase abstracta
echo "<br>velocidad maxima=".$carro1->velocidadMaximaDentroClaseAbstractCoche()  ;


echo "<br>varPublica=".$carro1->varPublica;  //en todo lugar es visible la variable
//la linea de abajo marcaria error ya que el metodo encender es visible solo hasta las clases que se derivan	
//	$carro1->encender();
//por lo tanto hacemos un metodo en la clase derivada el cual llame al metodo encender
$carro1->encenderClaseAbstractCoche();



?>

Interface en php

Publicado: junio 19, 2010 en POO

Interfaces

Las interfaces son aun más abstractas que una clase abstracta ya que una interface no dice que métodos debe llevar una clase. Dentro de una interface no se pueden declarar variables o implementar métodos ya que macaría un error.
Por ejemplo:

<?php
interface interfaceCoche{
	function encender();
	function apagar();
	function aumentarVelocidad($velocidad=2);
	function disminuirVelocidad($velocidad=2);
	function frenar();
}

class Carro implements interfaceCoche{
	var $marca="";     //marca del carro
    var $modelo="";    //modelo del carro
    var $velocidad=0;  //velocidad actual del carro
	var $velocidadMaxima=200;
    var $encendido =false ;  //true si esta encendido l false si esta apagado el carro
	
	function encender(){
	   $this->encendido=true;
	   echo "<br>$this->modelo encendido";
	}
	
	function Carro($marca,$modelo){
		$this->marca=$marca;
		$this->modelo=$modelo;
	}

	function apagar(){
		$this->encendido=false;
		echo "<br>$this->modelo apagado";
	}

	function aumentarVelocidad($velocidad=2){
		$this->velocidad=$this->velocidad+$velocidad;
		echo "<br>$this->modelo corriendo a $this->velocidad km (aumentando velocidad)";
	}

	function disminuirVelocidad($velocidad=2){
		$this->velocidad=$this->velocidad-$velocidad;
		echo "<br>$this->modelo corriendo a $this->velocidad km (disminuyendo velocidad)" ;
	}

	function frenar(){ //preguntar a la clase
		$this->velocidad=$this->velocidad-2;
		echo "<br>$this->modelo a frenado con velocidad a $this->velocidad km";
	}
}

	echo "<br>-------------------  FORD - MUSTANG   --------------------";

	$carro1=new Carro("FORD","MUSTANG");
	echo "<br>velocidad maxima=".$carro1->velocidadMaxima;
	$carro1->encender();

	for($i=1 ; $i<=5 ;$i++)
	   $carro1->aumentarVelocidad();

	$carro1->aumentarVelocidad(50);

	for($i=1 ; $i<=5 ;$i++)
	   $carro1->disminuirVelocidad();
	$carro1->disminuirVelocidad(50);

	$carro1->apagar();

?>

Debemos implementar todos los métodos que nos indica la interface

Clases abstractas II

Publicado: junio 19, 2010 en POO

Clases abstractas II
En las clases abstractas podemos tener métodos abstractos lo que significa que la clase que derive de ella debe de implementarse de lo contrario habrá un error.
Por ejemplo:

 
<?php
abstract class AbstractCoche{
	var $velocidadMaxima=200;  //velocidad maxima del carro
	
	function encender(){
	   $this->encendido=true;
	   echo "<br>$this->modelo encendido";
	}
	abstract	function apagar();
	abstract	function aumentarVelocidad($velocidad=2);
	abstract	function disminuirVelocidad($velocidad=2);
	abstract	function frenar();
	
}

class Carro extends AbstractCoche{
	var $marca="";     //marca del carro
    var $modelo="";    //modelo del carro
    var $velocidad=0;  //velocidad actual del carro
    
    var $encendido =false ;  //true si esta encendido l false si esta apagado el carro

	function Carro($marca,$modelo){
		$this->marca=$marca;
		$this->modelo=$modelo;
	}

	function apagar(){
		$this->encendido=false;
		echo "<br>$this->modelo apagado";
	}

	function aumentarVelocidad($velocidad=2){
		$this->velocidad=$this->velocidad+$velocidad;
		echo "<br>$this->modelo corriendo a $this->velocidad km (aumentando velocidad)";
	}

	function disminuirVelocidad($velocidad=2){
		$this->velocidad=$this->velocidad-$velocidad;
		echo "<br>$this->modelo corriendo a $this->velocidad km (disminuyendo velocidad)" ;
	}

	function frenar(){ //preguntar a la clase
		$this->velocidad=$this->velocidad-2;
		echo "<br>$this->modelo a frenado con velocidad a $this->velocidad km";
	}	
}

	echo "<br>-------------------  FORD - MUSTANG   --------------------";
	
	$carro1=new Carro("FORD","MUSTANG");
	echo "<br>velocidad maxima=".$carro1->velocidadMaxima;
	$carro1->encender();

	for($i=1 ; $i<=5 ;$i++)
	   $carro1->aumentarVelocidad();

	$carro1->aumentarVelocidad(50);

	for($i=1 ; $i<=5 ;$i++)
	   $carro1->disminuirVelocidad();
	$carro1->disminuirVelocidad(50);

	$carro1->apagar();

?>

Si en la clase Carro no hubiéramos implementado todos los métodos de la clase abstracta nos hubiera marcado un error.

En una clase abstracta podemos tener variables, métodos abstractos y métodos implementados como el método encender ().

Clase abstracta

Publicado: junio 12, 2010 en POO

Clase abstracta

A diferencia de las clases, en una clase abstracta no podemos crear objetos ya que contiene una abstracción muy general, en pocas palabras una clase abstracta puede generalizar clases.

Tomemos el ejemplo de la clase carro, ¿habrá alguna forma de generalizar esta clase?
La respuesta es que ¡si! , se acuerdan que un coche, una moto y una bicicleta tenían comportamientos semejantes es por ello que podemos generalizar una clase (abstracta) en la cual la clase coche derive de ella. Por cierto incluso una clase abstracta puede derivar de otra clase abstracta.

El siguiente organigrama nos muestra un ejemplo de cómo pueden estar organizados los vehículos (para el ejemplo expandimos mas la raíz que lleva al automóvil).
organigrama automovil

En la imagen anterior en la última parte del organigrama se puede ver claramente que carro es de tipo terrestre y sabemos que un carro es un vehículo.

De este organigrama podemos ver que la clase Carro deriva de de la clase Terrestre y este a su vez deriva de la clase Vehículo. La clase Terrestre y Vehículo son clases abstractas por lo que No se pueden instanciar para crear objetos.

En una clase abstracta podemos implementar comportamientos y también características o estados pero recuerden que deben de ser generales por ejemplo: la clase abstracta Vehículo puede tener como característica la velocidad actual ya que cualquier vehículo puede tener una velocidad y como comportamiento puede tener: aumentarVelocidad (). Ahora para la clase Terrestre podemos tener la característica tipoDeSuelo en donde podemos poner: suelo montañoso, suelo firme, etc y como comportamiento podemos poner PasarBache() jeje suena sacado de la manga verdad , pero quien no ha tenido este problema cuando va manejando ya sea en un carro o una bicicleta jejeje también podemos poner el funcionamiento de frenar(). Y por ultimo como característica en un carro tenemos el número de puertas y como comportamiento podemos poner encender ().

Como ejemplo de todo lo anterior implementemos La Clase Carro que deriva (extiende) de la clase Terrestre y que a su vez extiende de la clase vehículo.
todos los archivos estan en una misma carpeta
Vehiculo.php

<?
//---------------------
//Clase abstracta vehiculo
abstract class Vehiculo{
	var $velocidad=0;  //velocidad actual del carro
    var $velocidadMaxima=0;
	
	function Vehiculo(){}
	
	function aumentarVelocidad($velocidad=2){
		$this->velocidad=$this->velocidad+$velocidad;
		echo "<br>$this->modelo corriendo a $this->velocidad km (aumentando velocidad)";
	}
	
	function disminuirVelocidad($velocidad=2){
		$this->velocidad=$this->velocidad-$velocidad;
		echo "<br>$this->modelo corriendo a $this->velocidad km (disminuyendo velocidad)" ;
	}
	
	function velocidadMaxima($velocidad){
		$this->velocidadMaxima=$velocidad;
		echo "<br> velocidad maxima=$this->velocidadMaxima";
	}
	
	
}
?>
    

Terrestre.php

<?
include_once("Vehiculo.php");

abstract class Terrestre extends Vehiculo{
	var $tipoDeSuelo="";  //velocidad actual del carro
    
	
	function Vehiculo($suelo){
		$this->tipoDeSuelo=$suelo;
	}
	    
	function PasarBache(){
		echo "<br>Pasando un bache";
	} 
	
	function frenar(){
		echo "<br>se puso el freno ";
	}
}
?>
    

Carro.php

<?php
include_once("Terrestre.php");

class Carro extends Terrestre{
	var $marca="";     //marca del carro
    var $modelo="";    //modelo del carro
    var $encendido =false ;  //true si esta encendido l false si esta apagado el carro
    var $numeroDePuertas=2;

	function Carro($marca,$modelo,$suelo){  
		$this->marca=$marca;
		$this->modelo=$modelo;
		parent::Terrestre($suelo);
		$this->velocidadMaxima(200);
	}
	
	function encender(){
	   $this->encendido=true;
	   echo "<br>$this->modelo encendido";
	}
	
	function apagar(){
		$this->encendido=false;
		echo "<br>$this->modelo apagado";
	}
	

}

?>
    

Moto.php

<?php
include_once("Terrestre.php");

class Moto extends Terrestre{
	var $marca="";     //marca del carro
    var $modelo="";    //modelo del carro
    var $encendido =false ;  //true si esta encendido l false si esta apagado el carro
    

	function Moto($marca,$modelo,$suelo){  
		$this->marca=$marca;
		$this->modelo=$modelo;
		parent::Terrestre($suelo);
		$this->velocidadMaxima(180);
	}
	
	function encender(){
	   $this->encendido=true;
	   echo "<br>$this->modelo encendido";
	}
	
	function apagar(){
		$this->encendido=false;
		echo "<br>$this->modelo apagado";
	}
	

}

?>
    

Bicicleta.php

<?php
include_once("Terrestre.php");

class Bicicleta extends Terrestre{
	var $marca="";     //marca del carro
    var $modelo="";    //modelo del carro
    var $pedaleando=false;

	function Bicicleta($marca,$modelo,$suelo){  
		$this->marca=$marca;
		$this->modelo=$modelo;
		parent::Terrestre($suelo);
		$this->velocidadMaxima(70);
	}
	
	function empezarApedalear(){
		$this->pedaleando=true;
		echo "<br>empezando a pedalear";
	}
	
	function dejarDepedalear(){
		$this->pedaleando=false;
		echo "<br>Dejando de pedalear";
	}

}

?>
    

index.php

<?php
//---------- Corre igual que la clase Coche del ejemplo anterior
	include_once("Carro.php");
	echo "<br>-------------------  FORD - MUSTANG   --------------------";
	$carro1=new Carro("FORD","MUSTANG","suelo firme");
	$carro1->encender();
	
	for($i=1 ; $i<=5 ;$i++)
	   $carro1->aumentarVelocidad();
	   
	$carro1->aumentarVelocidad(50);
	
	for($i=1 ; $i<=5 ;$i++)
	   $carro1->disminuirVelocidad();
	$carro1->disminuirVelocidad(50);
	$carro1->apagar();

	   
echo "<br>-------------------  OTRAS CARACTERISTICAS  De un carro --------------------";

   $carro3=new Carro("carro FORD","MUSTANG","suelo firme");
   $carro3->encender();
   $carro3->aumentarVelocidad(50);
   $carro3->disminuirVelocidad(30);
   $carro3->PasarBache();
   for($i=1 ; $i<=4 ;$i++)
     $carro3->disminuirVelocidad(5);
   $carro3->frenar();
   $carro3->apagar();  

echo "<br>-------------------  PROBANDO UNA MOTOCICLETA   --------------------";
   include_once("MOTO.php");
   $moto=new Moto("HONDA","MOTO CBR 1000 RR Fireblade 2010","suelo firme");
   $moto->encender();
   $moto->aumentarVelocidad(50);
   $moto->disminuirVelocidad(30);
   $moto->PasarBache();
   for($i=1 ; $i<=4 ;$i++)
     $moto->disminuirVelocidad(5);
   $moto->frenar();
   $moto->apagar();  
echo "<br>-------------------  Caracteristicas de una bicicleta --------------------";
include_once("Bicicleta.php");
   $bicicleta=new Bicicleta("KMC","bicicleta K710 Kool Chain","montaña");
   $bicicleta->empezarApedalear();
   $bicicleta->aumentarVelocidad(50);
   $bicicleta->disminuirVelocidad(30);
   $bicicleta->PasarBache();
   for($i=1 ; $i<=4 ;$i++)
     $bicicleta->disminuirVelocidad(5);
   $bicicleta->dejarDepedalear();
   
?>
    

visualizen el index.php en su buscador y veran las similitudes de los tres vehiculos terrestres

Objetos y clases

Publicado: junio 12, 2010 en POO

POO PHP

En POO un objeto trata de representar de alguna forma una entidad de la vida real, por ejemplo:

Un objeto en la vida real seria un coche Pontiac, una motocicleta Honda, una bicicleta de montaña, etc. Así como en la vida real cada objeto tiene estados; un coche puede estar apagado o encendido al igual que una motocicleta en cambio una bicicleta no puede estar encendida o apagada ya que no tiene motor pero si podemos decir que los tres vehículos tienen comportamientos semejantes como , aumentar la velocidad, disminuir la velocidad, frenar, etc. Pero, ¿Quien nos dice como es el objeto y como se debe de comportar?

Cuando alguien habla de un árbol, automáticamente nos imaginamos que tiene ramas, posiblemente tiene frutos, he incluso nos imaginamos de un árbol en especial como un roble, un Pirul, etc. Podemos pensar que el árbol se está secando o están retoñando las hojas ya que es un comportamiento de los árboles. ¡Espero que te hayas dado cuenta!, todo lo anterior lo imaginamos al momento de que hablamos de árbol, en POO a esto se le llama clase.

Clase.

Podemos decir que una clase es una plantilla o molde el cual contiene los elementos necesarios para crear una instancia (objeto).

Dentro de la clase tenemos que definir como se debe comportar el objeto y lo necesario para definir su estado o características del objeto. Así un árbol es una clase, el cual tiene los comportamientos: secar árbol, retoñar hojas y en su característica o estado podemos saber si está seco, si es un pirul o un roble.
La forma de declarar una clase es:

class MiClase{
function MiClase ($parametros){ } //constructor
}
El constructor se llama igual que la clase y es el método que nos ayuda a tener una instancia o a crear un objeto de tipo MiClase.

Métodos:
Los métodos se definen dentro de la clase, es aquí donde definimos el comportamiento del objeto.

Estado o características:
Dentro de la clase debemos definir variables correspondientes a la clase, lo cual nos ayuda definir un estado o características del objeto.

Ejemplo.
Vamos a representar un carro el cual podemos tener las siguientes características:
-marca
-modelo
-velocidad
-velocidadMaxima
– encendido

Con los siguientes comportamientos:
-encender ()
-apagar ()
-aumentarVelocidad();
-disminuirVelocidad();
-frenar ()

Clase Coche:
Los archivos están en una misma carpeta.
Coche.php

<?php
//-----------------------------------------------------------------------------------
//Clase      :  Carro
//descripción:  Nos ayuda a crear objetos de tipo carro 
//Metodos    
//  -encender()          : enciende el carro
//	-apagar()            : apaga el carro
//	-aumentarVelocidad() :aumenta la velocidad a 2 km
//	-disminuirVelocidad():disminuye la velocidad la velocidad a 2 km
//	-frenar()            :frena el carro
//-----------------------------------------------------------------------------------
class Carro{
	//caracteristicas o estado del objeto
	var $marca="";     //marca del carro
    var $modelo="";    //modelo del carro
    var $velocidad=0;  //velocidad actual del carro
    var $velocidadMaxima=200;  //velocidad maxima del carro
    var $encendido =false ;  //true si esta encendido l false si esta apagado el carro

//------------------------------------------------------------------------------------
//Constructor
//parametros:
//  $marca :marca del carro
//  $modelo : modelo del carro
//-----------------------------------------------------------------------------------
	function Carro($marca,$modelo){  
		$this->marca=$marca;
		$this->modelo=$modelo;
	}
	
	
	function encender(){
	   $this->encendido=true;
	   echo "<br>$this->modelo encendido";
	}
	
	function apagar(){
		$this->encendido=false;
		echo "<br>$this->modelo apagado";
	}
	
	function aumentarVelocidad($velocidad=2){
		$this->velocidad=$this->velocidad+$velocidad;
		echo "<br>$this->modelo corriendo a $this->velocidad km (aumentando velocidad)";
	}
	
	function disminuirVelocidad($velocidad=2){
		$this->velocidad=$this->velocidad-$velocidad;
		echo "<br>$this->modelo corriendo a $this->velocidad km (disminuyendo velocidad)" ;
	}

	function frenar(){ //preguntar a la clase
		$this->velocidad=$this->velocidad-2;
		echo "<br>$this->modelo a frenado con velocidad a $this->velocidad km";
	}	

}

?>

index.php

<?php
	include_once("Coche.php");
	echo "<br>-------------------  FORD - MUSTANG   --------------------";
	$carro1=new Carro("FORD","MUSTANG");
	$carro1->encender();
	
	for($i=1 ; $i<=5 ;$i++)
	   $carro1->aumentarVelocidad();
	   
	$carro1->aumentarVelocidad(50);
	
	for($i=1 ; $i<=5 ;$i++)
	   $carro1->disminuirVelocidad();
	$carro1->disminuirVelocidad(50);
	
	$carro1->apagar();
	
	echo "<br>-------------------  FORD - FIESTA   --------------------";
	$carro2=new Carro("FORD","FIESTA");
	$carro2->encender();
	
	for($i=1 ; $i<=5 ;$i++)
	   $carro2->aumentarVelocidad();
	   
	$carro2->aumentarVelocidad(20);
	
	for($i=1 ; $i<=5 ;$i++)
	   $carro2->disminuirVelocidad();
	$carro2->disminuirVelocidad(20);
	
	$carro2->apagar();
	   
?>

Para la clase anterior validar el comportamiento de un carro por ejemplo:

  • un carro no puede aumentar o disminuir si este está apagado.
  • Un carro no puede superar su velocidad máxima.
  • Si disminuye su velocidad no puede pasar de cero.
  • Un carro puede ir en reversa pero su velocidad no es negativa.
  • Si un auto tiene una velocidad mayor a cero y este frena ¿Qué le pasa al carro?

Etc.