¿Cuándo y por qué debo usar public
, private
y protected
las funciones y variables dentro de una clase? ¿Cuál es la diferencia entre ellos?
Ejemplos:
// Public
public $variable;
public function doSomething() {
// ...
}
// Private
private $variable;
private function doSomething() {
// ...
}
// Protected
protected $variable;
protected function doSomething() {
// ...
}
Respuestas:
Tu usas:
public
alcance para hacer que esa propiedad / método esté disponible desde cualquier lugar, otras clases e instancias del objeto.private
alcance cuando desea que su propiedad / método sea visible solo en su propia clase.protected
alcance cuando desea que su propiedad / método sea visible en todas las clases que extienden la clase actual, incluida la clase principal.Más: (para información completa)
fuente
protected
alcance cuando desea que su variable / función sea visible en todas las clases que extienden la clase actual Y sus clases principales .http://www.php.net/manual/en/language.oop5.visibility.php#109324
Público:
Cuando declara un método (función) o una propiedad (variable) como
public
, se puede acceder a esos métodos y propiedades mediante:Ejemplo:
Protegido:
Cuando declara un método (función) o una propiedad (variable) como
protected
, se puede acceder a esos métodos y propiedadesLos miembros externos no pueden acceder a esas variables. "Extraños" en el sentido de que no son instancias de objeto de la clase declarada.
Ejemplo:
El error exacto será este:
Privado:
Cuando declara un método (función) o una propiedad (variable) como
private
, se puede acceder a esos métodos y propiedades mediante:Los miembros externos no pueden acceder a esas variables. Extraños en el sentido de que no son instancias de objeto de la clase declarada en sí misma e incluso las clases que heredan la clase declarada.
Ejemplo:
Los mensajes de error exactos serán:
Diseccionando la clase del abuelo usando la reflexión
Este tema no está realmente fuera de alcance, y lo estoy agregando aquí solo para demostrar que la reflexión es realmente poderosa. Como había indicado en lo anterior tres ejemplos,
protected
yprivate
los miembros (propiedades y métodos) no se puede acceder fuera de la clase.¡Sin embargo, con la reflexión puedes hacer lo extraordinario incluso accediendo
protected
yprivate
miembros fuera de la clase!Bueno, ¿qué es la reflexión?
Preámbulo
Tenemos una clase llamada
Grandpas
y decimos que tenemos tres propiedades. Para una fácil comprensión, considere que hay tres abuelos con nombres:Vamos a hacerlos (asignar modificadores)
public
,protected
yprivate
respectivamente. Usted sabe muy bien queprotected
yprivate
los miembros no se puede acceder fuera de la clase. Ahora vamos a contradecir la afirmación usando la reflexión.El código
Salida:
Conceptos erróneos comunes:
No confunda con el siguiente ejemplo. Como todavía puede ver, no se puede acceder a los miembros
private
y fuera de la clase sin usar la reflexiónprotected
Salida:
Funciones de depuración
print_r
,var_export
yvar_dump
son funciones del depurador . Presentan información sobre una variable en una forma legible para humanos. Estas tres funciones revelarán las propiedadesprotected
yprivate
de los objetos con PHP 5. Los miembros de la clase estática no se mostrarán.Más recursos:
fuente
Por lo general, se considera una buena práctica predeterminar la visibilidad más baja requerida, ya que esto promueve la encapsulación de datos y un buen diseño de interfaz. Al considerar la variable de miembro y la visibilidad del método, piense en el papel que desempeña el miembro en la interacción con otros objetos.
Si "codifica para una interfaz en lugar de una implementación", generalmente es bastante sencillo tomar decisiones de visibilidad. En general, las variables deben ser privadas o protegidas a menos que tenga una buena razón para exponerlas. Use accesores públicos (getters / setters) para limitar y regular el acceso a los elementos internos de una clase.
Para usar un automóvil como analogía, cosas como la velocidad, la marcha y la dirección serían variables de instancia privadas. No desea que el conductor manipule directamente cosas como la relación aire / combustible. En cambio, expone un número limitado de acciones como métodos públicos. La interfaz a un coche podría incluir métodos tales como
accelerate()
,deccelerate()
/brake()
,setGear()
,turnLeft()
,turnRight()
, etc.El conductor no sabe ni debería importarle cómo se implementan estas acciones por las partes internas del automóvil, y exponer esa funcionalidad podría ser peligroso para el conductor y otras personas en la carretera. De ahí la buena práctica de diseñar una interfaz pública y encapsular los datos detrás de esa interfaz.
Este enfoque también le permite alterar y mejorar la implementación de los métodos públicos en su clase sin romper el contrato de la interfaz con el código del cliente. Por ejemplo, podría mejorar el
accelerate()
método para que sea más eficiente en el consumo de combustible, pero el uso de ese método seguirá siendo el mismo; el código del cliente no requeriría cambios, pero aun así cosechará los beneficios de su mejora de eficiencia.Editar: Puesto que parece que todavía está en el medio de aprendizaje de conceptos orientados a objetos (que son mucho más difíciles de dominar que la sintaxis de cualquier idioma), me altamente recomiendo recoger una copia de PHP objetos, patrones y Práctica de Matt Zandstra. Este es el libro que primero me enseñó cómo usar OOP de manera efectiva, en lugar de solo enseñarme la sintaxis. Había aprendido la sintaxis años antes, pero eso fue inútil sin entender el "por qué" de la POO.
fuente
private
- se puede acceder desde DENTRO de la clase solamenteprotected
- se puede acceder desde DENTRO de la clase y las clases de HERENCIApublic
- también se puede acceder desde el código FUERA de la claseEsto se aplica tanto a funciones como a variables.
fuente
La diferencia es la siguiente:
Public
:: Una variable o método público puede ser accedido directamente por cualquier usuario de la clase.Protected
:: Los usuarios de la clase no pueden acceder a una variable o método protegido, pero se puede acceder dentro de una subclase que hereda de la clase.Private
:: A una variable o método privado solo se puede acceder internamente desde la clase en la que se define. Esto significa que no se puede llamar a una variable o método privado desde un elemento secundario que extiende la clase.fuente
Ámbitos de visibilidad con ejemplos abstractos :: Facilita la comprensión
Esta visibilidad de una propiedad o método se define mediante la declaración previa de una de las tres palabras clave (pública, protegida y privada)
Público : si una propiedad o método se define como público, significa que puede ser accesible y manipulado por cualquier cosa que pueda referirse a un objeto.
Protegido: cuando la visibilidad de una propiedad o método se establece en miembros protegidos, solo se puede acceder dentro de la propia clase y mediante clases heredadas y heredadas. (Heredado: una clase puede tener todas las propiedades y métodos de otra clase).
Privado: cuando la visibilidad de una propiedad o método se establece en privada, solo la clase que tiene los miembros privados puede acceder a esos métodos y propiedades (Internamente dentro de la clase), a pesar de cualquier relación de clase que exista.
fuente
Extraído de :
http://php.net/manual/en/language.oop5.visibility.php
fuente
PUBLIC
:public
alcance: una variable / función pública está disponible tanto para los objetos como para otras clases.PROTECTED
:protected
alcance: una variable / función protegida está disponible para todas las clases que extienden la clase actual.PRIVATE
:private
alcance: una variable / función privada solo es visible en la clase actual donde se está definiendo.Lea la Visibilidad de un método o variable en el Manual de PHP.
fuente
Considerando ' cuando ':
tiendo a declarar todo como privado inicialmente, si no estoy exactamente seguro. La razón es que, por lo general, es mucho más fácil hacer público un método privado que al revés. Esto se debe a que al menos puede estar seguro de que el método privado no se ha utilizado en ningún otro lugar que no sea en la clase misma. Un método público ya puede estar en uso en todas partes, posiblemente requiriendo una amplia reescritura.
Actualización : ahora uso un valor predeterminado
protected
, porque he descubierto que es lo suficientemente bueno para la encapsulación y no se interpone en el camino cuando estoy extendiendo clases (lo cual trato de evitar de todos modos). Solo si tengo una buena razón para usar los otros dos, lo haré.Una buena razón para un
private
método sería una que implemente algo inherente a ese objeto que incluso una clase que se extiende no debería cambiar (razón objetiva, además de la encapsulación, como la gestión interna del estado). Eventualmente, todavía es bastante fácil rastrear dóndeprotected
se usa un método por lo general, por lo que por defecto lo hagoprotected
hoy en día. Quizás no sea una experiencia 100% objetiva "en las trincheras", lo admito.fuente
private
seguiría siendo "suficientemente bueno" para usar, pero usted no sugiere que, aunque las razones anteriores por las que dio el sonido sigan siendo una "buena razón": la encapsulación.protected
ya lo hace, pero lo mantiene flexible para la extensión / herencia. De nuevo, a menos que tenga una buena razón para hacerloprivate
.protected
realidad se filtra al alcance externo y a menudo está en su camino, ya que admite malas decisiones de diseño, como favorecer implícitamente la herencia, mientras que es mejor favorecer la composición. Es por eso que quedarse con privado a menos que tenga requisitos reales para no hacerlo es a menudo una mejor manera de comenzar a escribir código. Esto también evitará tomar decisiones de diseño demasiado pronto, mientras que en realidad aún no son necesarias.protected
no se filtra al alcance externo (código que llama / accede al método / campo), sino solo al alcance interno (clases extendidas). Hay una diferencia, por pequeña que sea para ti. Es mucho más fácil rastrear el uso de unprotected
campo quepublic
uno.El manual de PHP tiene una buena lectura sobre la pregunta aquí .
fuente
Para mí, esta es la forma más útil de comprender los tres tipos de propiedades:
Público : use esto cuando esté de acuerdo con el acceso directo a esta variable y su cambio desde cualquier parte de su código.
Ejemplo de uso desde fuera de la clase:
Protegido : use esto cuando desee obligar a otros programadores (y a usted mismo) a usar getters / setters fuera de la clase al acceder y establecer variables (pero debe ser coherente y usar los getters y setters dentro de la clase también). Esta o
private
tiende a ser la forma predeterminada en la que debe configurar todas las propiedades de clase.¿Por qué? Porque si decide en algún momento en el futuro (tal vez incluso en unos 5 minutos) que desea manipular el valor que se devuelve para esa propiedad o hacer algo con ella antes de obtener / configurar, puede hacerlo sin refactorizar en todas partes Lo usé en tu proyecto.
Ejemplo de uso desde fuera de la clase:
Privado : las
private
propiedades son muy similares a lasprotected
propiedades. Pero la característica / diferencia distintiva es que hacerloprivate
también lo hace inaccesible para las clases secundarias sin usar el captador o definidor de la clase principal.Básicamente, si está usando getters y setters para una propiedad (o si la clase principal la usa internamente y no está destinada a ser accesible en ningún otro lugar), también podría hacerlo
private
, solo para evitar que alguien intente usarlo directamente e introducir errores .Ejemplo de uso dentro de una clase secundaria (que extiende MyObject):
fuente
Están ahí para permitir diferentes niveles de encapsulación.
fuente
Las variables en PHP se convierten en tres tipos diferentes:
Público: los valores de estos tipos de variables están disponibles en todos los ámbitos y requieren la ejecución de su código. declarar como:
public $examTimeTable;
Privado: los valores de este tipo de variable solo están disponibles solo para la clase a la que pertenece.
private $classRoomComputers;
Protegido: valores de esta clase solo y solo disponibles cuando el Acceso se otorgó en forma de herencia o su clase secundaria. generalmente se usa
::
para otorgar acceso por clase principalprotected $familyWealth;
fuente
Reavivando una vieja pregunta, pero creo que una buena manera de pensar en esto es en términos de la API que está definiendo.
public
- Todo lo marcado como público es parte de la API en la que cualquiera que use su clase / interfaz / otra utilizará y en el que confiará.protected
- No se deje engañar, ¡esto también es parte de la API! Las personas pueden subclasificar, extender su código y usar cualquier cosa marcada como protegida.private
- Las propiedades y métodos privados se pueden cambiar tanto como desee. Nadie más puede usar estos. Estas son las únicas cosas que puede cambiar sin hacer cambios importantes.O en términos de Semver :
Cambios a cualquier cosa
public
oprotected
deben considerarse cambios MAYORES.Cualquier cosa nueva
public
oprotected
debe ser (al menos) MENORSolo nuevos / cambios a cualquier cosa
private
pueden ser PATCHEntonces, en términos de mantenimiento del código, es bueno tener cuidado con las cosas que haces
public
oprotected
porque estas son las cosas que prometes a tus usuarios.fuente
Cuando seguimos php orientado a objetos en nuestro proyecto, debemos seguir algunas reglas para usar modificadores de acceso en php. Hoy vamos a aprender claramente qué es el modificador de acceso y cómo podemos usarlo. Los modificadores de acceso PHP se usan para establecer derechos de acceso con las clases PHP y sus miembros, que son las funciones y variables definidas dentro del alcance de la clase. En php hay tres ámbitos para los miembros de la clase.
Ahora, echemos un vistazo a la siguiente imagen para comprender el nivel de acceso del modificador de acceso
Ahora, echemos un vistazo a la siguiente lista para conocer las posibles palabras clave de PHP utilizadas como modificadores de acceso.
public: - la clase o sus miembros definidos con este modificador de acceso serán accesibles públicamente desde cualquier lugar, incluso desde fuera del alcance de la clase.
privado: se accederá a los miembros de la clase con esta palabra clave dentro de la clase misma. No podemos acceder a datos privados de la subclase. Protege a los miembros del acceso externo a la clase.
protegido: igual que privado, excepto al permitir que las subclases accedan a miembros de la superclase protegidos.
Ahora vea la tabla para comprender el modificador de acceso Lea el artículo completo modificador de acceso php
fuente
Public
: es un estado predeterminado cuando declara una variable o método, cualquier cosa puede acceder directamente al objeto.Protected
: Solo se puede acceder dentro del objeto y las subclases.Private
: Solo se puede hacer referencia a él dentro del objeto, no a las subclases.fuente
Las palabras clave mencionadas son modificadores de acceso y nos ayudan a implementar Encapsulación (u ocultación de información). Le dicen al compilador qué otras clases deberían tener acceso al campo o método que se está definiendo.
privado: solo la clase actual tendrá acceso al campo o método.
protegido: solo la clase y las subclases actuales (y a veces también las clases del mismo paquete) de esta clase tendrán acceso al campo o método.
public - Cualquier clase puede referirse al campo o llamar al método.
fuente