Saltar al contenido

¿Cuál es la diferencia entre público, privado y protegido?

Este equipo redactor ha estado largas horas buscando para darle soluciones a tus interrogantes, te dejamos la respuesta por esto deseamos que te resulte de gran apoyo.

Solución:

Tu usas:

  • public alcance para que esa propiedad / método esté disponible desde cualquier lugar, otras clases e instancias del objeto.

  • private alcance cuando desee que su propiedad / método sea visible solo en su propia clase.

  • protected alcance cuando desee que su propiedad / método sea visible en todas las clases que amplían la clase actual, incluida la clase principal.

Si no usa ningún modificador de visibilidad, la propiedad / método será público.

Más: (Para obtener información completa)

  • Manual de PHP – Visibilidad

dd

Público:

Cuando declaras un método (función) o una propiedad (variable) como public, se puede acceder a esos métodos y propiedades mediante:

  • La misma clase que lo declaró.
  • Las clases que heredan la clase declarada anteriormente.
  • Cualquier elemento extraño fuera de esta clase también puede acceder a esas cosas.

Ejemplo:

name; // The public variable will be available to the inherited class
    



// Inherited class Daddy wants to know Grandpas Name
$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'

// Public variables can also be accessed outside of the class!
$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Prints 'Mark Henry'

Protegido:

Cuando declaras un método (función) o una propiedad (variable) como protected, se puede acceder a esos métodos y propiedades mediante

  • La misma clase que lo declaró.
  • Las clases que heredan la clase declarada anteriormente.

Los miembros externos no pueden acceder a esas variables. “Forasteros” en el sentido de que no son instancias de objeto de la propia clase declarada.

Ejemplo:

name;
    



$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'

$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error

El error exacto será este:

Error fatal de PHP: no se puede acceder a la propiedad protegida GrandPa :: $ name


Privado:

Cuando declaras un método (función) o una propiedad (variable) como private, se puede acceder a esos métodos y propiedades mediante:

  • La misma clase que lo declaró.

Los miembros externos no pueden acceder a esas variables. Forasteros en el sentido de que no son instancias de objeto de la propia clase declarada e incluso las clases que heredar la clase declarada.

Ejemplo:

name;
    



$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Results in a Notice 

$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error

Los mensajes de error exactos serán:

Aviso: Propiedad indefinida: Papá :: $ nombre
Error fatal: no se puede acceder a la propiedad privada GrandPa :: $ name


Diseccionando la clase del abuelo usando Reflexión

Este tema no está realmente fuera de alcance, y lo agrego aquí solo para demostrar que la reflexión es realmente poderosa. Como dije en los tres ejemplos anteriores, protected y private no se puede acceder a los miembros (propiedades y métodos) fuera de la clase.

Sin embargo, con la reflexin puedes hacer el extraordinario incluso accediendo protected y private miembros fuera de la clase!

Bueno, ¿qué es la reflexión?

Reflection agrega la capacidad de aplicar ingeniería inversa a clases, interfaces, funciones, métodos y extensiones. Además, ofrecen formas de recuperar comentarios de documentos para funciones, clases y métodos.

Preámbulo

Tenemos una clase llamada Grandpas y digamos que tenemos tres propiedades. Para una mejor comprensión, considere que hay tres abuelos con nombres:

  • Mark Henry
  • John Choque
  • Will Jones

Hagámoslos (asignar modificadores) public, protected y private respectivamente. Tu sabes muy bien que protected y private no se puede acceder a los miembros fuera de la clase. Ahora contradigamos la afirmación usando la reflexión.

El código

";
echo "Printing members the usual way.. (without reflection)
"; foreach($granpaWithoutReflection as $k=>$v) echo "The name of grandpa is $v and he resides in the variable $k
"; echo "
"; #Scenario 2: Using reflection $granpa = new ReflectionClass('GrandPas'); // Pass the Grandpas class as the input for the Reflection class $granpaNames=$granpa->getDefaultProperties(); // Gets all the properties of the Grandpas class (Even though it is a protected or private) echo "#Scenario 2: With reflection
"; echo "Printing members the 'reflect' way..
"; foreach($granpaNames as $k=>$v) echo "The name of grandpa is $v and he resides in the variable $k
";

Producción:

#Scenario 1: Without reflection
Printing members the usual way.. (Without reflection)
The name of grandpa is Mark Henry and he resides in the variable name1

#Scenario 2: With reflection
Printing members the 'reflect' way..
The name of grandpa is Mark Henry and he resides in the variable name1
The name of grandpa is John Clash and he resides in the variable name2
The name of grandpa is Will Jones and he resides in the variable name3

Conceptos erróneos comunes:

No lo confunda con el siguiente ejemplo. Como todavía puede ver, el private y protected no se puede acceder a los miembros fuera de de la clase sin usar la reflexión

Producción:

GrandPas Object
(
    [name1] => Mark Henry
    [name2:protected] => John Clash
    [name3:GrandPas:private] => Will Jones
)

Funciones de depuración

print_r, var_export y var_dump son funciones de depuración. Presentan información sobre una variable en una forma legible por humanos. Estas tres funciones revelarán la protected y private propiedades de objetos con PHP 5. Los miembros de la clase estática no ser mostrado.


Más recursos:

  • El manual de PHP - Propiedades de programación orientada a objetos
  • El manual de PHP - Visibilidad OOP
  • Techflirt.com - Visibilidad en clases PHP
  • Jordizle.com - Público, Privado, Protegido en PHP 5

Por lo general, se considera una buena práctica establecer de forma predeterminada 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 visibilidad del método y la variable miembro, piense en el papel que desempeña el miembro en la interacción con otros objetos.

Si "codifica en una interfaz en lugar de una implementación", generalmente es bastante sencillo tomar decisiones de visibilidad. En general, las variables deben ser privadas o estar protegidas a menos que tenga una buena razón para exponerlas. Utilice accesores públicos (captadores / definidores) en su lugar para limitar y regular el acceso a los componentes internos de una clase.

Para usar un automóvil como analogía, cosas como la velocidad, el cambio 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 de un automóvil puede incluir métodos como accelerate(), deccelerate()/brake(), setGear(), turnLeft(), turnRight()etc.

El conductor no sabe ni debería importarle cómo implementan estas acciones los componentes internos 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 la accelerate() método para ser más eficiente en el consumo de combustible, sin embargo, el uso de ese método seguirá siendo el mismo; el código del cliente no requeriría cambios, pero aún así obtendría los beneficios de la mejora de su eficiencia.

Editar: Como parece que todavía estás aprendiendo conceptos orientados a objetos (que son mucho más difíciles de dominar que la sintaxis de cualquier idioma), muy recomiendo recoger una copia de Objetos, patrones y práctica de PHP por Matt Zandstra. Este es el libro que primero me enseñó cómo para usar OOP de manera efectiva, en lugar de solo enseñarme la sintaxis. Había aprendido la sintaxis años antes, pero eso era inútil sin entender el "por qué" de la programación orientada a objetos.

Reseñas y puntuaciones

Puedes confirmar nuestra publicación ejecutando un comentario y valorándolo te estamos eternamente agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *