Alcance - Public, Private y Protected en PHP

Public, Private y Protected

Cuando trabajamos, leemos o editamos una clase nos encontramos con que las propiedades o métodos tienen una palabra antes, esta puede ser public, private o protected.

Bueno amigos, esto define el alcance... Esto habla de la visibilidad:


Vamos uno a uno y luego con los ejemplos

  • Public: Esto quiere decir que cualquier propiedad o método puede ser leído, accedido o modificado desde cualquier parte del sistema. Es público, es libre sin restricciones.
  • Private: Esta es un poco más interesante, toda propiedad o método establecido como private solo es alcanzable o leído desde la misma clase que se declara. Es decir, no podemos ver ni editar desde afuera de la clase.
  • Protected: protected se parece mucho a private, solo es alcanzable o leído desde la misma clase que se declara... PERO y es un gran pero, las clases que heredan pueden usar estas propiedades y métodos.

Esto puedes encontrarlo también como "encapsulamiento", pero creo que como alcance se entiende mejor, y solo graba esta definición: Es lo que nos permite tener propiedades o métodos visibles o no, es decir, que puedes decidir tener algo accesible y también cosas privadas o protegidas.

La idea es decidir compartir o no tus secretos (propiedades y métodos).

El código no es diferente. Puede que otros quieran usar tus clases y eso está bien, pero no es ideal que toquen cosas que puedan romper su funcionalidad. Podemos ayudar a otros a usar nuestro código de una forma responsable, definiendo el alcance que tienen nuestros métodos y propiedades.

Importante: Desde PHP 7.1.0 una constante puede ser definida como public, protected o private.

Vamos al detalle:

Público (public)

Hasta ahora hemos estado usando var para declarar propiedades de clases y solo function para declarar los métodos. Trabajar de esta manera las hace públicas automáticamente. Y recuerda, una propiedad pública se puede acceder desde fuera de la clase, usando el operador (flechita) -> de objeto. Por ejemplo:

Clase Author.php

<?php

/**
* this class represents a author
*/
class Author
{
    
    public $name;
    public $lastname;

    public function __construct($name, $lastname)
    {
        $this->name = $name;
        $this->lastname = $lastname;
    }
    
    public function greet()
    {
        return 'Hola, cómo estás?';
    }
}

Archivo index.php

<?php

    require 'Author.php';

    $author = new Author('Italo', 'Morales');
    echo "Nombre: {$author->name} <br>";
    echo $author->greet();

Aquí vemos que las propiedades y los métodos públicos pueden ser usados o accedidos mediante el operador (flechita) -> de los objetos. Dado que nuestras propiedades y métodos han sido públicas (public). La verdad es que nadie, ningún programador usará var para declarar propiedades. En vez de eso, usará public.

Privado (private)

En la sección anterior usamos la palabra public para hacer que los métodos y propiedades fueran públicos, accedidos por cualquiera desde cualquier lugar. Vamos a intentar hacerlos privados.

<?php

/**
* this class represents a author
*/
class Author
{
    
    private $name;
    private $lastname;

    public function __construct($name, $lastname)
    {
        $this->name = $name;
        $this->lastname = $lastname;
    }
    
    public function greet()
    {
        return "Hola, cómo estás {$this->name}?";
    }
}

En el ejemplo de arriba, descubrirás que la propiedad $name y $lastname han sido marcada como privada usando la palabra private. Esto automáticamente queda sin poder ser accedido desde afuera (es privado)... Y si heredas, tampoco podrás acceder a la propiedad $name ni $lastname.

Si la propiedad $name y $lastname es privada, ¿entonces cómo el método greet() puede tener acceso? Bueno, el alcance de un método o propiedad solo aplica al acceder o modificar desde afuera de la clase. Los métodos de la clase pueden tener acceso a todas las propiedades y otros métodos sin importar el alcance que tengan.

Acceder desde afuera a una propiedad private retornará un error como este Fatal error: Uncaught Error: Cannot access private property.

Protegidas (protected)

Ya tocamos este tema de forma breve, creo que se entiende bastante bien... Las protected al igual que las private no pueden ser accedidas desde afuera de la clase, no las puedes alcanzar de forma directa. Pero si heredas, puedes tener acceso desde esa nueva clase a las propiedades o métodos protected.

Declarar una propiedad como protected se logra de la siguiente manera: protected $name;

Conseguirás ejemplos de este alcance cuando toquemos el tema de abstracción, y dedicaremos otro post al tema de clases estáticas (static). Todo esto tiene que ver con el alcance.

El código y ejemplos están en Github de Rimorsoft Regálanos estrellas y haz fork.

Adquiere en preventa y aprovecha un gran descuento TDD en Laravel

Comparte en

Creado por: Venezuela Italo Morales

Profesor de #Laravel y #PHP en Rimorsoft Online

Más información


crear un radio button que despliegue msj

hola quisiera saber como puedo crear un radio button que cuando lo seleccione me mande un msj de alerta.

mi codigo es el siguiente

---- en mi vista---- {!! Form::label('oobraexte', 'La Obra es:') !!} {!! Form::radio('oobraexte', 'SI', false, ['class'=>'check', 'id'=>'radio1']) !!} ...

recibir un checkbox en el controlador

como puedo recibir un checkbox en el controlador y si esta seleecionado que haga una accion, y si no esta seleccionado que haga otra?, un saludo y gracias...

Enviar arreglos en un input desde html (blade)

Hola a todos actualemente tengo este fragmento de codigo en html dónde envio informacion de un usuario

<!-- cuando es requerido y de tipo checkbox -->
<div class="form-group">
  <div class="col-md-6">
    <label for="{{$tag->tag_name}}" class="col-md-4 control-label">{{$tag->tag_name}}</label>
    <input type="hidden" class="form-control" value="{{$tag->id}}" n...

Como puedo conectarme a múltiples base de datos con laravel

Hola saludos como puedo conectarme a múltiples base de datos y hacer login con los usuarios de cada una de ellas y acceder a la informacion especifica de cual me encuentro iniciada la sesion

Necesito de sua ayuda y orientacíon sobre el tema muchas gracas....