Constructores en PHP 5

  • Por
Vamos a ver qué es un constructor y para que sirven, además de un sencillo ejemplo de una clase que define un constructor.

Los constructores se encargan de resumir las acciones de inicialización de los objetos. Cuando se instancia un objeto, se tienen que realizar varios pasos en su inicialización, por ejemplo dar valores a sus atributos y eso es de lo que se encarga el constructor. Los constructores pueden recibir unos datos para inicializar los objetos como se desee en cada caso.

La sintaxis para la creación de constructor varía con respecto a la de PHP 3 y 4, pues debe llamarse con un nombre fijo: __construct(). (Son dos guiones bajos antes de la palabra "construct")

A lo largo de los ejemplos de este manual vamos a ir creando un código para gestión de un videoclub. Vamos a empezar definiendo una clase cliente, que utilizaremos luego en nuestro programa.

class cliente{ 
   	var $nombre; 
   	var $numero; 
   	var $peliculas_alquiladas; 

   	function __construct($nombre,$numero){ 
      	$this->nombre=$nombre; 
      	$this->numero=$numero; 
      	$this->peliculas_alquiladas=array(); 
   	} 

   	function dame_numero(){ 
      	return $this->numero; 
   	} 
}

El constructor en esta clase recibe el nombre y número que asignar al cliente, que introduce luego en sus correspondientes propiedades. Además inicializa el atributo películas_alquiladas como un array, en este caso vacío porque todavía no tiene ninguna película en su poder.

Nota: En programación orientada a objetos $this hace referencia al objeto sobre el que se está ejecutando el método. En este caso, como se trata de un constructor, $this hace referencia al objeto que se está construyendo. Con $this->nombre=$nombre; estamos asignando al atributo “nombre” del objeto que se está construyendo el valor que contiene la variable $nombre, que se ha recibido por parámetro.

Luego hemos creado un método muy sencillo para poder utilizar el objeto. Vamos a ver unas acciones simples para ilustrar el proceso de instanciación y utilización de los objetos.

//instanciamos un par de objetos cliente 
$cliente1 = new cliente("Pepe", 1); 
$cliente2 = new cliente("Roberto", 564); 

//mostramos el numero de cada cliente creado 
echo "El identificador del cliente 1 es: " . $cliente1->dame_numero(); 
echo "El identificador del cliente 2 es: " . $cliente2->dame_numero();

Este ejemplo obtendría esta salida como resultado de su ejecución:

El identificador del cliente 1 es: 1
El identificador del cliente 2 es: 564

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

jurix

18/3/2005
Creo recordar que a la hora de declarar las variables miembro de la clase no se utiliza var (ha quedado desaprobado, creo!!) en php5, sino que directamente el método de acceso public, private, protected $nombreVariable;

public $numero;
private $usuario;

Gustavo

20/11/2007
Quisiera saber si en PHP se puede utilizar más de un constructor como puede hacerse en C++ con distintos tipos de datos de iniciación.

Sidh

27/2/2008
Un apunte q puede ser interesante, y que no se hace referencia en el articulo, sobre todo para novatos es que ademas de "inicializar" propiedades mediante el uso de constructores, en el cuerpo de estos podemos inicializar cualquier propiedad que deseemos como resultado del valor devuelto por un método.
Por poner un ejmplo.
Tengo una clase sencilla cuyo constructor me inicializa algunos valoes de la fecha y en el que ademas quiero verificar si el año actual es un año bisiesto o no.
El constructor seria parecido a este:
class fechas
{
public $mes;
public $dia;
public $año;
public $limite;
public $bisiesto;

function __construct()
{
$fecha=getdate();
$this->mes=$fecha[mon];
$this->dia=$fecha[mday];
$this->año=$fecha[year];
$this->bisiesto=$this->es_bisiesto();
$this->limite=$this->calcula_limite();
}
private function es_bisiesto()
{
if(($this->año%4==0 && $this->año%100!=0)|| $this->año%400==0)
return true;
else
return false;
}
}

De esta forma al llamar al metodo es_bisesto en el constructor de la clase inicializaremos el valor de la propiedad bisiesto a true o false en funcion de si es un año bisiesto o no. Los metodos llamados en el constructor siempre tienen q devolver algun valor a la hora de ser asignados a una propiedad.
Asi cuando en nuestor codigo llamemos a la clase:
$fecha=new fechas() podremos manejar el resultado de la propiedad bisiesto para darle la funcionalidad q deseemos.

alternop

23/7/2009
nota
//instanciamos un par de objetos cliente => en realidad aca no hay instancia sino creacion de objeto.

$cliente1: es la variable de referencia al objeto
new cliente: es la creacion del objeto cliente.
("pepe",1): los parametros actuales oh argumentos, mas bien los atributos del objeto se colocan oh cargan.

$cliente1 = new cliente("Pepe", 1);
$cliente2 = new cliente("Roberto", 564);

-------------------------------------------------------------------------------

//mostramos el numero de cada cliente creado => aca si hay instancia.

$cliente1: es la variable de referencia al objeto cliente.
->: es el operador que me permite acceder a los metodos oh procesos del objeto
dame_numero(): es un proceso invocado oh metodo llamado.

lo pongo asi para saber que esto es una instancia.

echo "El identificador del cliente 1 es: " . $cliente1->dame_numero();
echo "El identificador del cliente 2 es: " . $cliente2->dame_numero();

de todas el tutorial esta fino...

Néstor

28/10/2009
uso de var y nombres de constructor
ya probe en php5 con usar directamente public o private y no funciona. aun se tiene q usar var para las variables. las funciones igual, en ambos casos se pone un underscore antes del nombre de la variable o de la funcion cuando se quieren dejar privadas.

en cuanto al constructor, es opcional -desde php4 ya se usaba- nombrar al funcion constructora __construct. Se puede usar como constructor una funcion con el mismo nombre de la clase. Pero al igual q Gustavo, tambien me asalta la duda de multiples constructores en php.

midesweb

23/3/2010
instaciación y creación
Hola,

alternop comentaba que no hay instanciación sino creación. Totalmente de acuerdo, pero ambas cosas son lo mismo.

Instancia es una mala traducción de instance, pero que en el mundo de la programación orientada a objetos se utiliza, se admite y todo el mundo lo entiende.

Instanciación es la creación de una instancia. Durante el proceso de instanciación se crea un objeto a partir de las especificaciones de una clase. De nuevo es una mala traducción, pero en España es así como lo explican en la universidad, de modo que es un término aceptado académicamente.

victor

29/7/2010
felicidades
este script me sirvio de mucho porque hasta ahora entiendo que es y para que sirve el metodo constructor !!gracias!!

gustavo_carrillo-637788

04/8/2010
duda
Ante todo, muy buen manual.

Mi duda es la siguiente. Para hacer una simple prueba (pues soy novato) escribir este codigo.

class prueba
{
var $a,$b;
var $c;

function __construct($a,$b) {
$this->a=$a;
$this->b=$b;
$this->c=$c;

}
function mostrar(){


echo "el valor de a es $this->a y el valor de b es $this->b";
}
}

$prueba= new prueba(1,5);
$prueba->mostrar();

Pero cuando ejecuto el codigo me dice que en la linea 10 ($this->c=$c;) la variable no ha sido definida. Por que sucede esto? Solo quiero pasarle 2 variables por parametro al constructor y $c quiero que contenga la suma de $a y $b en el metodo pero me da error tambien en el metodo y me dice que la variable no esta definida. Como seria entonces?

jUAn

21/8/2010
RESPUESTA CONSULTA PHP
@gustavo..., al igual que en java no puedes inicializar tres variable en el constructor si estas pasando por referencia solo dos.

si los valores los vas a obtener($a y $b) al crear el objeto, la variable $c, la puedes inicializar en el metodo suma() y retornar $c.

saludos.

antonio

25/8/2010
suma en el constructor
en el constructor prueba con:
$this->c=$a+$b;

wil

20/1/2011
error , ayuda...
hola me esta generando un error , "parse error: syntax error, unexpeted T_VARIABLE, expecting T_FUNCTION" in .. (esta linea > $cliente1 = new cliente("Pepe", 1);)

si alguien me puede hechar un cable?

EL_FIEL

30/4/2011
Felicitaciones...
Muy didactico e ilustrativo, sigan publicando asi... muy bueno para newbies...

eduardo_servin-475711

17/2/2012
Problema en el codigo (para gustavo)
Amigo: te da error en la linea 10 porque la variable $c, que es de ámbito local a la funcion constructora, efectivamente no existe!!!
tenes 2 formas de arreglarlo:
1) hacer la suma , guardar el resultado en $c y luego asignarla
$c = $a + $b;
$this->c=$c;

2) o bien, directamente asignar la suma:
$this->c=($a+$b);

o , mejor aún, para usar propiedades puramente del objeto:
$this->c = $this->a + $this->b;

Probalo y comentá como te fue!

Lester Rodriguez

16/3/2015
Consulta de Objetos
Buenas noches, la consulta es la siguiente, supongase que tengo un metodo de una clase el cual utilizo para hacer consultas en base de datos, dentro de ese metodo recibe el nombre de una clase la cual hara referencia a la tabla con dicho nombre en base de datos, el asunto es que cuanto retorne el arreglo de resultado. Si quisiera instanciar un objeto de esa clase cuyo nombre esta almacenado en el parametro referencia (Para que sea dinamico) con cada valor de la resultado de la consulta lo se puede hacer?.. Dejo parte de la funcion

Function BuscarDb($clase,$campos){

$resultado = $OtraClase->ExecQry($p1,.....,$pn);

if(is_array($resultado) and ! is_null($resultado)){
$arrObjeto=array();
$Clase = $this->tabla;
foreach ($resultado as $unRegistro) {
$arrRegistro = array();
foreach ($unRegistro as $campo => $valor) {
$arrRegistro[$campo] = $valor;
}
$registro = current($arrRegistro);
if($registro){//capturo el valor del campoId de la tabla
if(class_exists($Clase)){//validar que existe la clase
$objeto = new $Clase($registro);
$arrObjeto[] = $objeto;
}
}
}
return $arrObjeto;
}
}

la intencion es retornar un arreglo de objetos en lugar de un array simple

Gracias por su colaboración