obtenido de : http://geekbinario.blogspot.com/2008/08/propiedades-en-php.html
Propiedades en PHP
Si hay algo que identifica a la programación orientada a objetos es la encapsulación de los datos que manejamos. Desde fuera de un objeto no se debe acceder directamente a los datos que maneja dicho objeto. Con esta definición aparece de forma natural el concepto de propiedad.
Una propiedad es una relación entre un valor y dos métodos para acceder a dicho valor desde fuera del objeto. Con uno de dichos métodos guardamos un nuevo valor y con el otro lo rescatamos. De esta forma se posibilita que el objeto tenga total control sobre lo que se hace con sus datos y se simplifica el acceso a ellos desde el exterior.
Este concepto se implementa de forma muy sencilla en Python:
nombre = property (get_Nombre, set_Nombre)
en C#:
public int nombre
{
get { return _nombre; }
set { _nombre = value; }
}
o en Pascal:
property Nombre: String read get_Nombre write set_Nombre;
Aunque se supone que PHP tiene una facilidad parecida no es, ni mucho menos, igual de intuitiva. En PHP cada clase tiene dos métodos mágicos: __set y __get. Estos métodos se llaman cada vez que se intenta acceder a un atributo del que el intérprete de PHP no tiene constancia. Creo que se entenderá mejor con un ejemplo:
<?php
class ejemplo
{
private $propiedad1 = 'Propiedad 1';
private $propiedad2 = 'Propiedad 2';
public function __get ($propiedad)
{
switch ($propiedad)
{
case 'p1':
return $this->propiedad1;
case 'p2':
return $this->propiedad2;
}
}
public function __set ($propiedad, $valor)
{
switch ($propiedad)
{
case 'p1':
$this->propiedad1 = $valor;
case 'p2':
$this->propiedad2 = $valor;
}
}
}
$j = new ejemplo;
echo $j->p1;
echo $j->p2;
$j->p1 = 'Hola';
$j->p2 = 'mundo';
?>
En este ejemplo al intentar acceder a p1 y p2 el interprete buscará en la tabla del objeto ejemplo. Al no encontrarla llamará a la funcion __set o __get con el nombre del atributo al que se intenta acceder. Dentro de esa función podemos hacer lo que consideremos más adecuado.
Esto nos da una gran libertad y flexibilidad. Sin embargo es un poco tedioso tener que escribir una y otra vez estos dos métodos para cada clase que diseñemos. Sería, desde mi punto de vista, mucho más sencillo escribir algo como esto:
private $propiedad1 set setPropiedad1 get getPropiedad1;
Como esto es algo que no creo que se añada en bastante tiempo al lenguaje puedes hacer algo parecido a esto para evitar tener que repetir las mismas funciones una y otra vez.
<?php
class Properties
{
public function __get ($propiedad)
{
if (method_exists ($this, $metodo = 'get_' . ucfirst($propiedad)))
return $this->$metodo();
}
public function __set ($propiedad, $valor)
{
if (method_exists($this, $metodo = 'set_' . ucfirst($propiedad)))
$this->$metodo($valor);
}
}
class Libro extends Properties
{
private $titulo;
public function set_Titulo ($titulo)
{
$this->titulo = $titulo;
}
public function get_Titulo ()
{
return $this->titulo;
}
}
$libro = new Libro;
$libro->titulo = 'El Silmarillion';
echo $libro->titulo;
?>
Propiedades en PHP
Si hay algo que identifica a la programación orientada a objetos es la encapsulación de los datos que manejamos. Desde fuera de un objeto no se debe acceder directamente a los datos que maneja dicho objeto. Con esta definición aparece de forma natural el concepto de propiedad.
Una propiedad es una relación entre un valor y dos métodos para acceder a dicho valor desde fuera del objeto. Con uno de dichos métodos guardamos un nuevo valor y con el otro lo rescatamos. De esta forma se posibilita que el objeto tenga total control sobre lo que se hace con sus datos y se simplifica el acceso a ellos desde el exterior.
Este concepto se implementa de forma muy sencilla en Python:
nombre = property (get_Nombre, set_Nombre)
en C#:
public int nombre
{
get { return _nombre; }
set { _nombre = value; }
}
o en Pascal:
property Nombre: String read get_Nombre write set_Nombre;
Aunque se supone que PHP tiene una facilidad parecida no es, ni mucho menos, igual de intuitiva. En PHP cada clase tiene dos métodos mágicos: __set y __get. Estos métodos se llaman cada vez que se intenta acceder a un atributo del que el intérprete de PHP no tiene constancia. Creo que se entenderá mejor con un ejemplo:
<?php
class ejemplo
{
private $propiedad1 = 'Propiedad 1';
private $propiedad2 = 'Propiedad 2';
public function __get ($propiedad)
{
switch ($propiedad)
{
case 'p1':
return $this->propiedad1;
case 'p2':
return $this->propiedad2;
}
}
public function __set ($propiedad, $valor)
{
switch ($propiedad)
{
case 'p1':
$this->propiedad1 = $valor;
case 'p2':
$this->propiedad2 = $valor;
}
}
}
$j = new ejemplo;
echo $j->p1;
echo $j->p2;
$j->p1 = 'Hola';
$j->p2 = 'mundo';
?>
En este ejemplo al intentar acceder a p1 y p2 el interprete buscará en la tabla del objeto ejemplo. Al no encontrarla llamará a la funcion __set o __get con el nombre del atributo al que se intenta acceder. Dentro de esa función podemos hacer lo que consideremos más adecuado.
Esto nos da una gran libertad y flexibilidad. Sin embargo es un poco tedioso tener que escribir una y otra vez estos dos métodos para cada clase que diseñemos. Sería, desde mi punto de vista, mucho más sencillo escribir algo como esto:
private $propiedad1 set setPropiedad1 get getPropiedad1;
Como esto es algo que no creo que se añada en bastante tiempo al lenguaje puedes hacer algo parecido a esto para evitar tener que repetir las mismas funciones una y otra vez.
<?php
class Properties
{
public function __get ($propiedad)
{
if (method_exists ($this, $metodo = 'get_' . ucfirst($propiedad)))
return $this->$metodo();
}
public function __set ($propiedad, $valor)
{
if (method_exists($this, $metodo = 'set_' . ucfirst($propiedad)))
$this->$metodo($valor);
}
}
class Libro extends Properties
{
private $titulo;
public function set_Titulo ($titulo)
{
$this->titulo = $titulo;
}
public function get_Titulo ()
{
return $this->titulo;
}
}
$libro = new Libro;
$libro->titulo = 'El Silmarillion';
echo $libro->titulo;
?>