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


Ayuda con datatables

Hola, acudo a ustedes para ver si pueden orientarme resulta que tengo una tabla que obtiene datos agrupados por nombre de empresa, cada empresa tiene locales en renta y se debe obtener el monto que se debe o que ha sido pagado, segun corresponda tengo algo mas o menos así:

$result = DB::table('espacios') ->select('cuenta_por_cobrars.id','clientes.id as ide...

Obtener Datos de un select en otros input

Buenas estoy intentando que al seleccion un producto me pegue luego en unas cajas de texto los datos.

Mi Controlador:

public function lista(){

$productos = Productos::pluck('Codigo','Descripcion','PVP','id')->prepend('selecciona'); return view ('Productos.NuevoProducto2',compact('productos'));

}

Mi vista:

@extends('admin.plantilla')

@section('content'...

Input que depende del valor seleccionado en Select

Buenas amigos, estoy intentando que al picar en el select me sale el listado de productos por ejemplo y quiero poner en un input el precio.

Por el momento consigo tener mi select lleno de datos, pero no consigo que me envie los datos al input.

Alguna idea o ejemplo para orientarme?

gracias...

componentes

hola amigo italo, buen dia... tengo el siguiente inconveniente... quisiera hacer un select con un componente que me cargue los funcionarios de una empresa y colocarlo en varios formularios en diferentes modales. el componente lo hago correctamente y carga los funcionarios; cuando selecciono el funcionario quisiera cargarlo a una variable VUE que esta en mi instancia principal...