En PHP , todas y cada una de las propiedades de una clase deben tener uno de los tres niveles de visibilidad, conocidos como public , private y protected .
- Público: Cualquier código puede acceder a las propiedades públicas, ya sea que ese código esté dentro o fuera de la clase. Si una propiedad se declara pública, su valor se puede leer o cambiar desde cualquier parte de su secuencia de comandos.
- Privado: solo se puede acceder a las propiedades privadas de una clase mediante el código dentro de la clase. Entonces, si creamos una propiedad que se declara privada, solo los métodos y objetos dentro de la misma clase pueden acceder a su contenido.
- Protegido: las propiedades de la clase protegida son un poco como las propiedades privadas en el sentido de que no se puede acceder a ellas mediante un código fuera de la clase, pero hay una pequeña diferencia en cualquier clase que herede de la clase, es decir, la clase base también puede acceder a las propiedades.
En términos generales, es una buena idea evitar crear propiedades públicas siempre que sea posible. En cambio, es más seguro crear propiedades privadas y luego crear métodos que permitan que el código fuera de la clase acceda a esas propiedades. Esto significa que podemos controlar exactamente cómo se accede a las propiedades de nuestra clase.
Nota: si intentamos acceder a la propiedad fuera de la clase, PHP genera un error fatal.
Viabilidad de PHP Access Specifier con Class, Sub Class y Outside World:
Especificador de acceso de miembro de clase | Acceso desde clase propia | Accesible desde la clase derivada | Accesible por Objeto |
---|---|---|---|
Privado | Sí | No | No |
Protegido | Sí | Sí | No |
Público | Sí | Sí | Sí |
Los siguientes ejemplos ilustran el Especificador de acceso de PHP:
- Ejemplo 1: En este ejemplo, veremos el Especificador de acceso público.
php
<?php class GeeksForGeeks { public $x = 100 ; # public attributes public $y = 50 ; function add() { echo $a = $this->x + $this->y ; echo " "; } } class child extends GeeksForGeeks { function sub() { echo $s = $this->x - $this->y ; } } $obj = new child; // It will return the addition result $obj->add() ; // It's a derived class of the main class, // which has a public object and therefore can be // accessed, returning the subtracted result. $obj->sub() ; ?>
- Producción:
150 50
- Ejemplo 2: En este ejemplo, veremos el Especificador de acceso privado
php
<?php class GeeksForGeeks { private $a = 75 ; # private attributes private $b = 5 ; private function div() # private member function { echo $d = $this->a / $this->b ; echo " "; } } class child extends GeeksForGeeks { function mul() { echo $m = $this->a * $this->b ; } } $obj= new child; // It's supposed to return the division result // but since the data and function are private // they can't be accessed by a derived class // which will lead to fatal error . $obj->div(); // It's a derived class of the main class, // which's accessing the private data // which again will lead to fatal error . $obj->mul(); ?>
- Producción:
PHP Fatal error: Uncaught Error: Call to private method GeeksForGeeks::div() from context '' in /home/cg/root/8030907/ main.php:22 Stack trace:#0 {main} thrown in /home/cg/root/8030907/ main.php on line 22
- Ejemplo 3: En este ejemplo, veremos el Especificador de acceso protegido.
php
<?php class GeeksForGeeks { protected $x = 1000 ; # protected attributes protected $y = 100 ; function div() { echo $d = $this->x / $this->y ; echo " "; } } class child extends GeeksForGeeks { function sub() { echo $s = $this->x - $this->y ; } } class derived # Outside Class { function mul() { echo $m = $this->x * $this->y ; } } $obj= new child; // It will return the division result $obj->div(); // Since it's a derived class of the main class, $obj->sub(); // Since it's an outside class, therefore it // will produce a fatal error . $obj->mul(); ?>
- Producción :
10 900 Fatal error: Uncaught Error: Call to undefined method child::mul() in /home/cg/root/8030907/main.php:32