Además de restringir el acceso, el método de acceso también determina qué método llamará la subclase o a qué propiedad accederá la subclase. La relación entre las llamadas a funciones y la función en sí, y la relación entre el acceso de miembros y las direcciones de memoria variables. se llama enlace.
En lenguaje informático, ¿hay dos formas principales de enlace? El enlace estático y el enlace dinámico se producen entre estructuras de datos y estructuras de datos, antes de que se ejecute el programa. información Se dirige a llamadas a funciones y al cuerpo de la función, o variables y bloques en la memoria. Debido a que PHP es un lenguaje dinámico, no utiliza enlaces estáticos. Sin embargo, puede simular
el acceso a objetivos de enlaces estáticos generados durante el tiempo de ejecución
.Las solicitudes solo utilizan información disponible en tiempo de ejecución. En el código orientado a objetos, el enlace dinámico significa que la decisión sobre qué método se llama o a qué propiedad se accede se basará en la clase en sí y no en el alcance de acceso
de los miembros públicos y protegidos
.similar a las acciones de función en versiones anteriores de PHP, usando enlace dinámico. Esto significa que si un método accede a un miembro de la clase que está anulado en una subclase y es una instancia de la subclase, se accederá al miembro de la subclase (en lugar de acceder a los miembros). en la clase principal).
Vea la Figura 1. Este código genera "¡Oye! Soy Hijo". Porque cuando PHP llama a getSalutation, es una instancia de Son, que sobrescribe el saludo en Father. producirá el mismo resultado. La anulación de un método funciona de manera similar. En Son, la llamada a identificar está vinculada a ese método.
Incluso en las subclases, el modo de acceso se debilita de protected a public, el enlace dinámico aún ocurrirá. Principio de uso de métodos de acceso, es imposible mejorar las restricciones de acceso a los miembros de la clase. Por lo tanto, cambiar el método de acceso de público a protegido es
imposible
.
clase padre
{
protected $salutation = "¡Hola!" //Saludos
función pública getSalutation();
{
print("$this->saludon");
$this->identificar();
}
función protegida identificar()
{
print("Soy Padre.n");
}
};
clase Hijo extiende Padre
{
protected $salutation = "¡Oye!"; //el $salutation protegido en la clase principal se sobrescribe
protected function identificar() //el identificador protegido() en la clase principal se sobrescribe
{
print("Soy Hijo.n");
}
};
$obj = nuevo hijo();
$obj->getSalutation(); //Salida ¡Oye!
?>
//Nota: getSalutation() no se anula en la subclase, pero en realidad todavía hay getSalutation() $salutation e identificar() en esta clase
//son los mismos que getSalutation() en la instancia de Son. subclase El método está vinculado dinámicamente, por lo que llamar al método getSalutation () de la instancia de Son
llamará al saludo de miembro e identificar () en la clase Son, en lugar del saludo de miembro e identificar () en la clase principal
. en ellos Dentro de la clase donde se encuentra. A diferencia de los miembros públicos y protegidos, PHP simula el enlace estático. Vea el ejemplo en la Figura 2. Genera "¡Hola! Soy padre", aunque la subclase anula el valor del saludo. El script hará este- >saludo a la clase actual Padre. Se aplican principios similares al método privado identificar()
y a los miembros privados
<?php.
clase padre
{
private $salutation = "¡Hola!"
función pública getSalutation();
{
print("$this->saludon");
$this->identificar();
}
función privada identificar()
{
print("Soy Padre.n");
}
}
clase Hijo extiende Padre
{
saludo privado = "¡Oye!";
función privada identificar()
{
print("Soy Hijo.n");
}
}
$obj = nuevo Hijo();
$obj->getSalutation(); //Salida ¡Hola, soy el padre!
?>
La ventaja del enlace dinámico es que permite que las clases heredadas cambien el comportamiento de la clase principal mientras mantienen la interfaz y las funciones de la clase principal. Consulte el ejemplo de la Figura 3. Debido al uso del enlace dinámico, se llama a la versión isAuthorized. en deleteUser puede Determinado por el tipo de objeto. Si es un usuario normal, PHP que llama a User::isAuthorized devolverá FALSO. Si es una instancia de AuthorizedUser, PHP que llama a AuthorizedUser::isAuthorized permitirá que deleteUser se ejecute sin problemas
. haohappy Nota: uso Para decirlo claramente en una oración, es la vinculación de tipos de objetos, métodos y atributos. Al llamar a un método que existe tanto en la clase principal como en la subclase o acceder a un atributo, primero determinará qué tipo de objeto. pertenece la instancia y luego llama al método en la clase y atributos
correspondientes
.
clase usuario //usuario
{
función protegida isAuthorized() //Si es un usuario autenticado
{
retorno (FALSO);
}
función pública getName() //Obtener el nombre
{
return($este->nombre);
}
función pública eliminarUsuario($nombredeusuario) //Eliminar usuario
{
si(!$this->isAuthorized())
{
print("No estás autorizado.n");
retorno (FALSO);
}
//eliminar el usuario
print("Usuario eliminado.n");
}
}
clase Usuario Autorizado extiende Usuario //Usuario de autenticación
{
función protegida isAuthorized() //sobrescribir isAuthorized()
{
retorno (VERDADERO);
}
}
$usuario = nuevo Usuario;
$admin = nuevo Usuario Autorizado;
//no autorizado
$usuario->deleteUser("Zeev");
//autorizado
$admin->deleteUser("Zeev");
?> ¿
Por qué los miembros de la clase privada simulan un enlace estático? Para responder a esta pregunta, debe recordar por qué necesita tener miembros privados. ¿Cuándo tiene sentido usarlos en lugar de miembros
privados solo si no los desea
?subclases para heredar Se usa solo cuando se cambia o especializa el comportamiento de una clase principal. Esto es más raro de lo que piensas. En general, una buena jerarquía de objetos debería permitir que las subclases especialicen, mejoren o cambien la mayor parte de la funcionalidad. Los fundamentos de la programación orientada a objetos son necesarios en determinadas situaciones, como cuando está seguro de que no desea permitir que una subclase cambie una parte específica de la clase principal.