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


989

¿Cuándo y por qué debo usar public, privatey protectedlas funciones y variables dentro de una clase? ¿Cuál es la diferencia entre ellos?

Ejemplos:

// Public
public $variable;
public function doSomething() {
  // ...
}

// Private
private $variable;
private function doSomething() {
  // ...
}

// Protected
protected $variable;
protected function doSomething() {
  // ...
}

59
Creo que esta pregunta también se beneficiaría de las respuestas con ejemplos prácticos del uso de cada una, en lugar de proporcionar la definición literal de lo que hace cada palabra clave.
Mateo

70
Realmente creo que esta pregunta debería ser pública, no protegida.
dotancohen

Respuestas:


1261

Tu usas:

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

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

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

Más: (para información completa)


79
protectedalcance cuando desea que su variable / función sea visible en todas las clases que extienden la clase actual Y sus clases principales .
Shahid

44
@ Shahid - No entiendo tu punto. Cualquier clase que extiende la clase A también extiende la clase padre de A, ¿no?
JDelage

44
@JDelage - Por favor vea el enlacehttp://www.php.net/manual/en/language.oop5.visibility.php#109324
Shahid

44
@Growler ¿Por qué molestarse en usar objetos?
J.Steve

27
@Growler, una respuesta más útil sería que es bueno ocultar la mayor parte posible del funcionamiento interno de un objeto. De esa manera es menos probable que se rompa. Si hace que todo sea público, entonces otro programador podría alterar una variable que no desea que se modifique por otra cosa que no sea el funcionamiento interno de su objeto.
Relajarse en Chipre

1176

dd

Público:

Cuando declara 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 anterior.
  • Cualquier elemento extraño fuera de esta clase también puede acceder a esas cosas.

Ejemplo:

<?php

class GrandPa
{
    public $name='Mark Henry';  // A public variable
}

class Daddy extends GrandPa // Inherited class
{
    function displayGrandPaName()
    {
        return $this->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 declara un método (función) o una propiedad (variable) como protected, se puede acceder a esos métodos y propiedades

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

Los miembros externos no pueden acceder a esas variables. "Extraños" en el sentido de que no son instancias de objeto de la clase declarada.

Ejemplo:

<?php

class GrandPa
{
    protected $name = 'Mark Henry';
}

class Daddy extends GrandPa
{
    function displayGrandPaName()
    {
        return $this->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 declara 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. Extraños en el sentido de que no son instancias de objeto de la clase declarada en sí misma e incluso las clases que heredan la clase declarada.

Ejemplo:

<?php

class GrandPa
{
    private $name = 'Mark Henry';
}

class Daddy extends GrandPa
{
    function displayGrandPaName()
    {
        return $this->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
no definida : Daddy :: $ name Error grave: No se puede acceder a la propiedad privada GrandPa :: $ name


Diseccionando la clase del abuelo usando la reflexión

Este tema no está realmente fuera de alcance, y lo estoy agregando aquí solo para demostrar que la reflexión es realmente poderosa. Como había indicado en lo anterior tres ejemplos, protectedy privatelos miembros (propiedades y métodos) no se puede acceder fuera de la clase.

¡Sin embargo, con la reflexión puedes hacer lo extraordinario incluso accediendo protectedy privatemiembros fuera de la clase!

Bueno, ¿qué es la reflexión?

Reflection agrega la capacidad de realizar ingeniería inversa en 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 Grandpasy decimos que tenemos tres propiedades. Para una fácil comprensión, considere que hay tres abuelos con nombres:

  • Mark Henry
  • John Clash
  • Will Jones

Vamos a hacerlos (asignar modificadores) public, protectedy privaterespectivamente. Usted sabe muy bien que protectedy privatelos miembros no se puede acceder fuera de la clase. Ahora vamos a contradecir la afirmación usando la reflexión.

El código

<?php

class GrandPas   // The Grandfather's class
{
    public     $name1 = 'Mark Henry';  // This grandpa is mapped to a public modifier
    protected  $name2 = 'John Clash';  // This grandpa is mapped to a protected  modifier
    private    $name3 = 'Will Jones';  // This grandpa is mapped to a private modifier
}


# Scenario 1: without reflection
$granpaWithoutReflection = new GrandPas;

# Normal looping to print all the members of this class
echo "#Scenario 1: Without reflection<br>";
echo "Printing members the usual way.. (without reflection)<br>";
foreach($granpaWithoutReflection as $k=>$v)
{
    echo "The name of grandpa is $v and he resides in the variable $k<br>";
}

echo "<br>";

#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<br>";
echo "Printing members the 'reflect' way..<br>";

foreach($granpaNames as $k=>$v)
{
    echo "The name of grandpa is $v and he resides in the variable $k<br>";
}

Salida:

#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 confunda con el siguiente ejemplo. Como todavía puede ver, no se puede acceder a los miembros privatey fuera de la clase sin usar la reflexiónprotected

<?php

class GrandPas   // The Grandfather's class
{
    public     $name1 = 'Mark Henry';  // This grandpa is mapped to a public modifier
    protected  $name2 = 'John Clash';  // This grandpa is mapped to a protected modifier
    private    $name3 = 'Will Jones';  // This grandpa is mapped to a private modifier
}

$granpaWithoutReflections = new GrandPas;
print_r($granpaWithoutReflections);

Salida:

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

Funciones de depuración

print_r, var_exporty var_dumpson funciones del depurador . Presentan información sobre una variable en una forma legible para humanos. Estas tres funciones revelarán las propiedades protectedy privatede los objetos con PHP 5. Los miembros de la clase estática no se mostrarán.


Más recursos:



disculpas por el retraso agregar a esta convo. ¿Puedes decirme por qué alguien usaría estos? Usted ha explicado perfectamente cómo funcionan, etc. Me gustaría saber los beneficios del uso de cada uno de estos. Gracias
JamesG

@JamesG está un poco explicado en el otro comentario anterior. stackoverflow.com/questions/4361553/…
cjmling

No sé por qué tal vez está un poco fuera de esta cuestión, pero nadie mencionó que en PHP hay otros dos modificadores de acceso: abstracto y final, esta palabra clave solo se puede usar para las clases de PHP, pero aún accede a los modificadores
bxN5

1
Le sugiero que lea la explicación sobre abstracción proporcionada por Dhairya Lakhera aquí: stackoverflow.com/questions/2558559/… . Es un complemento perfecto para las explicaciones de Shankar Damodaran.
Julio Marchi

83

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

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

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

El conductor no sabe ni debería importarle cómo se implementan estas acciones por las partes internas 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 el accelerate()método para que sea más eficiente en el consumo de combustible, pero el uso de ese método seguirá siendo el mismo; el código del cliente no requeriría cambios, pero aun así cosechará los beneficios de su mejora de eficiencia.

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


3
El libro recomendado en la edición de esta publicación es realmente muy excelente. La parte que hasta ahora me ha resultado bastante esclarecedora. Los primeros capítulos respondieron a la mayoría de mis preguntas relacionadas con la clase.
Josiah

Los libros que me permitieron comprender realmente los objetos, sin desplazar mi pensamiento con detalles innecesarios, como ejemplos en Smalltalk, fueron de David A Taylor, siendo Tecnología Orientada a Objetos: Una Guía del Gerente e Ingeniería de Negocios con Object Teechnology . Ambas son solo 100 páginas, y cada una es bastante fácil de leer en una tarde. Por supuesto, existen los Patrones de diseño de Gamma et al. , Aunque el enfoque básico se puede describir simplemente mediante 'subclase de lo que desea variar'.
Patanjali

Una muy buena analogía. ¿Tiene uno para protegido frente a privado?
Jānis Elmeris

79

private - se puede acceder desde DENTRO de la clase solamente

protected - se puede acceder desde DENTRO de la clase y las clases de HERENCIA

public - también se puede acceder desde el código FUERA de la clase

Esto se aplica tanto a funciones como a variables.


No estoy seguro de si la definición protegida es correcta aquí, de la respuesta seleccionada real parece, Protegido: solo se puede acceder desde la clase heredada en adelante y no desde la clase original / principal. Decir "DENTRO de la clase" puede ser un poco confuso.
pal4life

77
No lo creo, de hecho parece que la respuesta seleccionada es la que es confusa aquí. Ver comentario de Shahids. En mi humilde opinión, se puede acceder muy bien a un método protegido desde la clase original.
Olaf

¿Puede una clase acceder al público de otra clase?
Serjas

1
@Serjas: No, solo otro objeto, a menos que sean métodos / campos estáticos.
DanMan

No sé si esto se aplica a todos los lenguajes de programación, pero en PHP se puede acceder a las propiedades / métodos "protegidos" en la clase en la que se ha declarado o en las clases que heredan de la clase que define la propiedad / método.
John Slegers

25

La diferencia es la siguiente:

Public :: Una variable o método público puede ser accedido directamente por cualquier usuario de la clase.

Protected :: Los usuarios de la clase no pueden acceder a una variable o método protegido, pero se puede acceder dentro de una subclase que hereda de la clase.

Private :: A una variable o método privado solo se puede acceder internamente desde la clase en la que se define. Esto significa que no se puede llamar a una variable o método privado desde un elemento secundario que extiende la clase.


17

Ámbitos de visibilidad con ejemplos abstractos :: Facilita la comprensión

Esta visibilidad de una propiedad o método se define mediante la declaración previa de una de las tres palabras clave (pública, protegida y privada)

Público : si una propiedad o método se define como público, significa que puede ser accesible y manipulado por cualquier cosa que pueda referirse a un objeto.

  • Resumen ej. Piense en el alcance de la visibilidad pública como un "picnic público" al que cualquiera puede acudir.

Protegido: cuando la visibilidad de una propiedad o método se establece en miembros protegidos, solo se puede acceder dentro de la propia clase y mediante clases heredadas y heredadas. (Heredado: una clase puede tener todas las propiedades y métodos de otra clase).

  • Piense como un alcance de visibilidad protegido como "picnic de la compañía" donde los miembros de la compañía y sus familiares no pueden acceder al público. Es la restricción de alcance más común.

Privado: cuando la visibilidad de una propiedad o método se establece en privada, solo la clase que tiene los miembros privados puede acceder a esos métodos y propiedades (Internamente dentro de la clase), a pesar de cualquier relación de clase que exista.

  • con la analogía del picnic, piense como un "picnic de la compañía donde solo los miembros de la compañía tienen permitido" en el picnic. No se permiten familiares ni público en general.

15
/**
 * Define MyClass
 */
class MyClass
{
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj = new MyClass();
echo $obj->public; // Works
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Shows Public, Protected and Private


/**
 * Define MyClass2
 */
class MyClass2 extends MyClass
{
    // We can redeclare the public and protected method, but not private
    protected $protected = 'Protected2';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj2 = new MyClass2();
echo $obj2->public; // Works
echo $obj2->private; // Undefined
echo $obj2->protected; // Fatal Error
$obj2->printHello(); // Shows Public, Protected2, Undefined

Extraído de :

http://php.net/manual/en/language.oop5.visibility.php


12

⚡️ Aquí está una manera fácil de recordar el alcance de public, protectedy private.

PUBLIC:

  • public alcance: una variable / función pública está disponible tanto para los objetos como para otras clases.

PROTECTED:

  • protected alcance: una variable / función protegida está disponible para todas las clases que extienden la clase actual.
  • ¡No! Los objetos no pueden acceder a este alcance

PRIVATE:

  • private alcance: una variable / función privada solo es visible en la clase actual donde se está definiendo.
  • ¡No! La clase que amplía la clase actual no puede acceder a este ámbito.
  • ¡No! Los objetos no pueden acceder a este ámbito.

Lea la Visibilidad de un método o variable en el Manual de PHP.


9

Considerando ' cuando ':
tiendo a declarar todo como privado inicialmente, si no estoy exactamente seguro. La razón es que, por lo general, es mucho más fácil hacer público un método privado que al revés. Esto se debe a que al menos puede estar seguro de que el método privado no se ha utilizado en ningún otro lugar que no sea en la clase misma. Un método público ya puede estar en uso en todas partes, posiblemente requiriendo una amplia reescritura.

Actualización : ahora uso un valor predeterminado protected, porque he descubierto que es lo suficientemente bueno para la encapsulación y no se interpone en el camino cuando estoy extendiendo clases (lo cual trato de evitar de todos modos). Solo si tengo una buena razón para usar los otros dos, lo haré.

Una buena razón para un privatemétodo sería una que implemente algo inherente a ese objeto que incluso una clase que se extiende no debería cambiar (razón objetiva, además de la encapsulación, como la gestión interna del estado). Eventualmente, todavía es bastante fácil rastrear dónde protectedse usa un método por lo general, por lo que por defecto lo hago protectedhoy en día. Quizás no sea una experiencia 100% objetiva "en las trincheras", lo admito.


3
Con su actualización: ¿Puede dejar más claro cómo "lo suficientemente bueno" y "buena razón" van de la mano aquí? Por ejemplo, el uso privateseguiría siendo "suficientemente bueno" para usar, pero usted no sugiere que, aunque las razones anteriores por las que dio el sonido sigan siendo una "buena razón": la encapsulación.
Hakre

@hakre: La razón por la que debemos esforzarnos por encapsular es evitar el estado de fuga en el alcance externo. protectedya lo hace, pero lo mantiene flexible para la extensión / herencia. De nuevo, a menos que tenga una buena razón para hacerlo private.
DanMan

Bueno, ese es probablemente el punto en el que no estamos de acuerdo: en protectedrealidad se filtra al alcance externo y a menudo está en su camino, ya que admite malas decisiones de diseño, como favorecer implícitamente la herencia, mientras que es mejor favorecer la composición. Es por eso que quedarse con privado a menos que tenga requisitos reales para no hacerlo es a menudo una mejor manera de comenzar a escribir código. Esto también evitará tomar decisiones de diseño demasiado pronto, mientras que en realidad aún no son necesarias.
Hakre

No discutiré con su punto general, porque es lo suficientemente justo, pero protectedno se filtra al alcance externo (código que llama / accede al método / campo), sino solo al alcance interno (clases extendidas). Hay una diferencia, por pequeña que sea para ti. Es mucho más fácil rastrear el uso de un protectedcampo que publicuno.
DanMan

6

El manual de PHP tiene una buena lectura sobre la pregunta aquí .

La visibilidad de una propiedad o método se puede definir prefijando la declaración con las palabras clave public, protected o private. Se puede acceder a los miembros de la clase declarados públicos desde cualquier lugar. Solo se puede acceder a los miembros declarados protegidos dentro de la propia clase y mediante clases heredadas y primarias. Los miembros declarados como privados solo pueden ser accedidos por la clase que define al miembro.


6

Para mí, esta es la forma más útil de comprender los tres tipos de propiedades:

Público : use esto cuando esté de acuerdo con el acceso directo a esta variable y su cambio desde cualquier parte de su código.

Ejemplo de uso desde fuera de la clase:

$myObject = new MyObject()
$myObject->publicVar = 'newvalue';
$pubVar = $myObject->publicVar;

Protegido : use esto cuando desee obligar a otros programadores (y a usted mismo) a usar getters / setters fuera de la clase al acceder y establecer variables (pero debe ser coherente y usar los getters y setters dentro de la clase también). Esta o privatetiende a ser la forma predeterminada en la que debe configurar todas las propiedades de clase.

¿Por qué? Porque si decide en algún momento en el futuro (tal vez incluso en unos 5 minutos) que desea manipular el valor que se devuelve para esa propiedad o hacer algo con ella antes de obtener / configurar, puede hacerlo sin refactorizar en todas partes Lo usé en tu proyecto.

Ejemplo de uso desde fuera de la clase:

$myObject = new MyObject()
$myObject->setProtectedVar('newvalue');
$protectedVar = $myObject->getProtectedVar();

Privado : las privatepropiedades son muy similares a las protectedpropiedades. Pero la característica / diferencia distintiva es que hacerloprivate también lo hace inaccesible para las clases secundarias sin usar el captador o definidor de la clase principal.

Básicamente, si está usando getters y setters para una propiedad (o si la clase principal la usa internamente y no está destinada a ser accesible en ningún otro lugar), también podría hacerlo private, solo para evitar que alguien intente usarlo directamente e introducir errores .

Ejemplo de uso dentro de una clase secundaria (que extiende MyObject):

$this->setPrivateVar('newvalue');
$privateVar = $this->getPrivateVar();


4

Las variables en PHP se convierten en tres tipos diferentes:

Público: los valores de estos tipos de variables están disponibles en todos los ámbitos y requieren la ejecución de su código. declarar como:public $examTimeTable;

Privado: los valores de este tipo de variable solo están disponibles solo para la clase a la que pertenece. private $classRoomComputers;

Protegido: valores de esta clase solo y solo disponibles cuando el Acceso se otorgó en forma de herencia o su clase secundaria. generalmente se usa ::para otorgar acceso por clase principal

protected $familyWealth;


3

Reavivando una vieja pregunta, pero creo que una buena manera de pensar en esto es en términos de la API que está definiendo.

  • public - Todo lo marcado como público es parte de la API en la que cualquiera que use su clase / interfaz / otra utilizará y en el que confiará.

  • protected- No se deje engañar, ¡esto también es parte de la API! Las personas pueden subclasificar, extender su código y usar cualquier cosa marcada como protegida.

  • private- Las propiedades y métodos privados se pueden cambiar tanto como desee. Nadie más puede usar estos. Estas son las únicas cosas que puede cambiar sin hacer cambios importantes.

O en términos de Semver :

  • Cambios a cualquier cosa publico protecteddeben considerarse cambios MAYORES.

  • Cualquier cosa nueva publico protecteddebe ser (al menos) MENOR

  • Solo nuevos / cambios a cualquier cosa privatepueden ser PATCH

Entonces, en términos de mantenimiento del código, es bueno tener cuidado con las cosas que haces publico protectedporque estas son las cosas que prometes a tus usuarios.


1

Cuando seguimos php orientado a objetos en nuestro proyecto, debemos seguir algunas reglas para usar modificadores de acceso en php. Hoy vamos a aprender claramente qué es el modificador de acceso y cómo podemos usarlo. Los modificadores de acceso PHP se usan para establecer derechos de acceso con las clases PHP y sus miembros, que son las funciones y variables definidas dentro del alcance de la clase. En php hay tres ámbitos para los miembros de la clase.

  1. PÚBLICO
  2. PRIVADO
  3. PROTEGIDO

Ahora, echemos un vistazo a la siguiente imagen para comprender el nivel de acceso del modificador de acceso ingrese la descripción de la imagen aquí

Ahora, echemos un vistazo a la siguiente lista para conocer las posibles palabras clave de PHP utilizadas como modificadores de acceso.

public: - la clase o sus miembros definidos con este modificador de acceso serán accesibles públicamente desde cualquier lugar, incluso desde fuera del alcance de la clase.

privado: se accederá a los miembros de la clase con esta palabra clave dentro de la clase misma. No podemos acceder a datos privados de la subclase. Protege a los miembros del acceso externo a la clase.

protegido: igual que privado, excepto al permitir que las subclases accedan a miembros de la superclase protegidos.

Ahora vea la tabla para comprender el modificador de acceso Lea el artículo completo modificador de acceso php


1

Public: es un estado predeterminado cuando declara una variable o método, cualquier cosa puede acceder directamente al objeto.

Protected: Solo se puede acceder dentro del objeto y las subclases.

Private: Solo se puede hacer referencia a él dentro del objeto, no a las subclases.


0

Las palabras clave mencionadas son modificadores de acceso y nos ayudan a implementar Encapsulación (u ocultación de información). Le dicen al compilador qué otras clases deberían tener acceso al campo o método que se está definiendo.

privado: solo la clase actual tendrá acceso al campo o método.

protegido: solo la clase y las subclases actuales (y a veces también las clases del mismo paquete) de esta clase tendrán acceso al campo o método.

public - Cualquier clase puede referirse al campo o llamar al método.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.