2010-04-22 11 views
6

Si tengo una "persona" clase con un nombre de propiedad $ y su captador (get_name()) y setter métodos (nombre_conjunto()), entonces después de crear instancias de los objetos y establecer la propiedad es decir¿Por qué no se recomienda el acceso directo a la propiedad en OOPs PHP?

$paddy = new person(); 

$paddy->set_name("Padyster Dave"); 

echo "Paddy's full name: ".$paddy->name; //WHY THIS IS NOT RECOMMENDED... 

En el código anterior $paddy->name; ¿Por qué esto no es recomendable

EDITAR

Por encima de código es un código de ejemplo sin asignar ninguna accessifi ers .. Es solo para entender el concepto $ paddy-> name

+0

Una palabra de moda en el contexto de esto: Información oculta http://en.wikipedia.org/wiki/Information_hiding Y lo que usted solicita se aplica a OOP en general, no solo a PHP. –

+0

He usado la sintaxis de php y he etiquetado la pregunta en la sección de PHP por eso he añadido la palabra clave PHP, soy consciente de este hecho que es general para muchos ... Gracias –

Respuesta

6

Debido a que algún día podría deshacerse del miembro $name, reemplazándolo con (por ejemplo) $first_name, $last_name y un método fullname() (no es que eso es una good idea). Por supuesto, con __get and __set, no importa tanto.

En términos más generales, establecer una propiedad puede no ser tan simple como almacenar un valor. Dar acceso directo a los campos de miembros puede dar como resultado otras funciones que causan que un objeto esté en un estado incoherente. Imagine que almacena una matriz que debe permanecer ordenada; si la matriz fuera pública, otra cosa podría asignar una matriz no ordenada al campo.

8

Lo que es raro es que tienes un setter, pero estás dejando la propiedad public. (Suponiendo que no hay magia __get pasando).

Por lo general, desea utilizar getters/setters para tener más control sobre lo que se puede asignar a una propiedad y lo que no. O bien, es posible que desee ejecutar el código cuando se accede o cambia la propiedad. En cualquier caso, debe forzar el uso de getters/setters haciendo la propiedad private o protected, de lo contrario es bastante inútil. Se trata de evitar que usted o los demás usen la clase para no dispararse.

Si el colocador en su ejemplo solo establece el valor sin hacer nada más, es superfluo. Si hace algo más que se requiere cada vez que se establece el valor, tiene un defecto en el diseño de su clase, ya que es posible cambiar el valor sin usar el colocador.


class Foo { 
    public $bar = 0; // is only allowed to contain numeric values 
    public function setBar($val) { 
     if (is_numeric($val)) { 
      $this->bar = $val; 
     } 
    } 
} 

$obj = new Foo(); 
$obj->bar = 'some value'; // set a string, which is not allowed 

Si desea hacer $barprotected, eso no sería posible.

+0

"Si hace algo más que se requiere siempre que el valor sea establecido, usted tiene un defecto en el diseño de su clase ya que es posible cambiar el valor sin usar el colocador ". ¿Puede U elaborar esto? plss –

+0

@Parth See updated answer. – deceze

+0

@Parth Si lo hace 'protected $ bar = 0;', '$ obj-> bar' no está permitido y lanzará una advertencia. Lea esto: http://php.net/manual/en/language.oop5.visibility.php – deceze

3

La exposición de campos públicos sería una mala habit.From un good artical acerca principio OO en PHP

Si nada cambia con el objeto, cualquier código que utiliza tiene que cambiar también. Por ejemplo, si la persona, la familia y otros nombres se encapsularan en un objeto PersonName, necesitaría modificar todo su código para acomodar el cambio.

0

Obviamente también estoy haciendo cosas 'malas' ya que uso este tipo de código todo el tiempo.

Pero lo que si $ this-> nombre (o como lo haría $ this-> nameFormatted) se construye como:

protected var $name; 
$this->name = $this->getSalutation() . ' ' . $this->nameFirst . ' ' . $this->nameLast; 

o algo por el estilo.

Está utilizando $ this-> name out en el contexto público, pero todavía está construido en la clase y si está protegido no se sobrescribirá.

¿O me está faltando el punto y lo "malo" es realmente establecer el nombre en el ámbito público?

Cuestiones relacionadas