¿Qué es el alcance en programación orientada a objetos?
Entender el alcance en programación es clave para cualquier desarrollador que busque crear aplicaciones robustas y seguras. El alcance define la accesibilidad de propiedades y métodos dentro de una clase, asegurando la integridad de los datos y evitando modificaciones no autorizadas. Este concepto se relaciona estrechamente con el encapsulamiento, también conocido como el principio de ocultación. Veamos cómo se implementa en PHP.
¿Cómo se definen los tipos de alcance?
En PHP, existen tres tipos principales de alcance:
Público: Los elementos definidos como públicos son accesibles desde cualquier punto del código. Esto significa que tanto las clases como otros archivos pueden acceder a estos elementos.
Protegido: Estos elementos solo pueden ser accedidos por la clase que los define y sus subclases. Es una forma efectiva de permitir que las clases derivadas interactúen con ciertos datos sin exponerlos completamente.
Privado: Los elementos privados son accesibles exclusivamente dentro de la clase que los declara. Ni siquiera las subclases pueden acceder a estos métodos o propiedades.
Un ejemplo concreto sería definir diferentes alcances para las propiedades y constantes dentro de una clase de usuario:
El encapsulamiento es un pilar de la programación orientada a objetos que busca proteger los datos y funciones de una clase de su modificación externa. Al definir propiedades y métodos con diferentes niveles de acceso, logramos un control preciso sobre cómo y dónde pueden ser utilizados esos elementos. Veamos cómo podríamos utilizar este concepto en una clase:
classUser{public$username;protected$email;private$password;publicfunctionobtenerNombreDeUsuario(){// Código para obtener el nombre de usuario}}
¿Por qué es importante la definición del alcance?
Definir correctamente el alcance es crucial por varias razones:
Integridad de los datos: Al restringir el acceso a ciertos datos, podemos evitar modificaciones no autorizadas que podrían llevar a inconsistencias o errores en el sistema.
Seguridad: Elementos como contraseñas deben estar protegidos (o privatizados) para que no puedan ser alterados directamente desde fuera del sistema.
Mantenimiento: Un código con un buen uso del encapsulamiento es más fácil de mantener y entender, ya que limita la complejidad al ocultar detalles innecesarios para otras partes del sistema.
¿Cuándo usar cada tipo de alcance?
El uso de alcances depende de las necesidades específicas del sistema y el diseño del software:
Usa public cuando necesites que una propiedad o método sea accesible desde cualquier parte.
Opta por protected cuando quieras que la funcionalidad sea visible y modificable por clases derivadas, pero no por clases externas.
Elige private cuando el atributo o método no deba ser visto ni alterado más que dentro de su propia clase.
En resumen, comprender el alcance y el encapsulamiento es fundamental para cualquier programador que desee escribir código limpio, eficiente y seguro. Elegir adecuadamente el tipo de acceso correcto puede marcar la diferencia entre una aplicación vulnerable y una aplicación auditada y estable.
En lo personal, pienso que el tema de herencia debió de haber sido el primer tema a explicar antes de meternos con el resto de temas porque muchas cosas hacen referencia de alguna manera a la herencia. Pero trataré de explicarlo de una mejor manera:
public: Es una propiedad publica, a la cual puedo acceder desde cualquier parte de mi código y puedo modificarla sin problemas:
Esto es posible porque $name es una propiedad publica, por tanto, puedo acceder desde fuera de la clase, la clase abarca desde la llave de apertura hasta la llave de cierre de la clase.
protected: Esta propiedad es exclusiva de PHP, basicamente, hace que esta propiedad NO pueda ser accedida desde fuera de mi clase, pero SI puede ser accedida desde cualquier otra clase que herede a mi clase, ¿Qué es herencia? No te preocupes, ya casi llegamos a ese tema, pero que el nombre te vaya dando una idea, por tanto, este ejemplo:
Si funcionaría, pues las clases que heredan de mi clase SI pueden acceder.
private: Este nos indica que nada, absolutamente nada que NO esté dentro de mi clase va a poder acceder a esa propiedad o método, ni aunque la heredes, esa propiedad va a estar disponible única y estrictamente dentro de mi clase, por lo que el ejemplo anterior daría error (Si hubiésemos puesto private $name), pero el siguiente ejemplo funcionaría a la perfección:
public -> Cualquiera puede acceder a estos elementos.
protected -> Solo la clase padre e hijos pueden acceder a estos elementos.
private -> Solo la clase padre puede acceder a estos elementos.
👍
Veo que PHP maneja los mismos conceptos de Java en muchas de sus estructuras.
¿Los elementos encapsulados con Protected pueden ser accedidos por clases al mismo nivel, ósea dentro del mismo paquete o solo a través de herencia?
Abstracción y alcance, resuelve muchos problemas de seguridad en los login
La verdad batalle mucho con el tema de constantes dándoles diferentes tipos de alcance :(
Comparto mi apunte de la clase de hoy con los resultados comentados.
.
Base
<?php/*
El alcance o encapsulamiento define la visibilidad que tendra una propiedad, constante o método de una clase...
Dependera del alcance para que algo pueda ser accedido desde uno u otro lugar por ejemplo, otro archivo, clase heredada o misma clase.
Los tipos de alcances son:
- public: Si se usa un alcance de este tipo, la propiedad, constante o método podra ser leído, accedido o modificado desde cualquier parte de nuestro sistema.
- private: Si se usa este tipo de alcance, la propiedad, constante o método solo podra ser leído desde la misma clase donde se esta declarando, es decir, no se podra editar desde fuera de la clase.
- protected: Si se usa este tipo de alcance, es muy similar al 'private' ya que solo puede ser accedido desde la misma clase PERO, si una clase hereda de la clase principal, esta clase hija podra acceder a las propiedades, constantes y métodos de la clase.
*/// Declarando una clase con propiedades, constantes y métodos de un alcance diferenteclassBasee{// Definiendo propiedades y constantespublic$namePublic="Joel Publico";private$namePrivate="Joel Private";protected$nameProtected="Joel Protected";publicconstagePublic=22;privateconstagePrivate=32;protectedconstageProtected=42;// Definiendo métodosfunctionsaludarProtected(){echo"¡Hola, mi nombre protected es: $this->nameProtected y mi edad protected es: ".$this::ageProtected;}}?>
.
Cached
<?phpinclude_once('Basee.php');// Creando una clase que herede de 'Base'classCachedextendsBasee{publicfunctionsaludarCached(){echo"Hola, estoy desde cached!";}}// Creando una instancia de la clase 'cached'$cached1=newCached;// Accediendo a propiedades del la clase heredada 'Basee'echo$cached1->namePublic."\n";// Joel Publicoecho$cached1->namePrivate."\n";// Notice: Undefined property: Cached::$namePrivateecho$cached1->nameProtected."\n";// Fatal error: Uncaught Error: Cannot access protected property Cached::$nameProtected// Accediendo a constantes de la clase heredada 'Base'echo $cached1::agePublic."\n";// 22echo $cached1::agePrivate."\n";// Fatal error: Uncaught Error: Undefined class constant 'agePrivate'echo $cached1::ageProtected."\n";// Fatal error: Uncaught Error: Cannot access protected const Cached::ageProtected// Accediendo a los métodos de la clase heredada 'Base'$cached1->saludarProtected();// ¡Hola, mi nombre protected es: Joel Protected y mi edad protected es: 42echo"\n";// Accediendo al método de la clase 'Cached'$cached1->saludarCached();// Hola, estoy desde cached!echo"\n";?>
Alcance/Encapsulamiento es limitar quienes tienen permitido interactuar con el contenido(propiedades, métodos) de nuestras clases.
Al alcance o encapsulamiento también se le conoce como SCOPE y si, el scope puede definirse como un lugar desde el que puedes acceder a un espacio.
Es correcto, generalmente se usa mas escope, este por ser un curso en espanol supongo que por eso uso alcance
Si este es del curso de POO, bien
Aquí les dejo una breve explicación sobre el alcance:
El alcance o encapsulamiento es una técnica que permite
restringir el acceso a ciertos atributos y métodos.
Por ejemplo:
public: permite el acceso a todos los elementos de una clase
protected: atributos o métodos que pueden ser usados si tienen herencia padre e hijo.
private: Impide el acceso a los métodos o atributos a otras clases.
Alcance o Encapsulamiento
Hace referencia al encapsulamiento o principio de oculatación.
Nos ayuda cuando trabajamos con la herencia, para esto tenemos:
Public: Los elementos públicos son aquellos que se pueden acceder a lo largo de todo el sistema
Protected: Solo pueden acceder los elementos de las clases que se heredan
Private: Solo puede ser accedido a través de la misma clase.
Con lo anterior se garantiza la integridad de los datos.
Cuando escribimos el encapsulamiento garantizamos la integridad de los datos.
Para ilustrar el concepto de encapsulamiento y alcance en PHP, aquí tienes un ejemplo complejo que utiliza las visibilidades pública, protegida y privada:
En este ejemplo, nombre es público y accesible desde cualquier instancia, email es protegido y solo accesible en la clase Usuario y sus subclases, mientras que contraseña es privada y solo accesible desde la clase Usuario.
El encapsulamiento en PHP se refiere a la restricción del acceso a los datos de una clase, garantizando la integridad de estos. Se definen tres niveles de acceso:
Público: Accesible desde cualquier parte del código.
Protegido: Solo accesible dentro de la clase y sus subclases.
Privado: Solo accesible dentro de la propia clase.
Esto permite ocultar detalles de implementación y proteger la información sensible, como contraseñas, asegurando que solo métodos internos puedan modificar datos críticos.