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 vinculante.
Hay dos tipos principales de enlace en los lenguajes informáticos: enlace estático y enlace dinámico. El enlace estático ocurre entre estructuras de datos y estructuras de datos antes de que se ejecute el programa. El enlace estático ocurre en el momento de la compilación y, por lo tanto, no puede utilizar ninguna información de tiempo de ejecución. Se dirige a llamadas a funciones y al cuerpo de una función, o variables y bloques de memoria. Debido a que PHP es un lenguaje dinámico, no utiliza enlaces estáticos. Pero se puede simular la vinculación estática.
El enlace dinámico utiliza solo información disponible en tiempo de ejecución para las solicitudes de acceso generadas durante el 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 misma y no en el alcance del acceso.
Las acciones de los miembros públicos y protegidos son similares a las acciones de las funciones en versiones anteriores de PHP, utilizando 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 al miembro de la clase principal).
Mire el Ejemplo 6.10. Este código genera "¡Oye! Soy Hijo". Porque cuando PHP llama a getSalutation, es una instancia de Son, que sobrescribe el saludo en Padre. Si el saludo es público, PHP generará el mismo resultado. El funcionamiento del método anulado es muy similar. En Son, los llamados a identificarse están ligados a ese método.
Incluso si el método de acceso se debilita de protegido a público en una subclase, aún se producirá un enlace dinámico. De acuerdo con el principio de uso de métodos de acceso, es imposible mejorar las restricciones de acceso a los miembros de la clase, por lo que se cambia el método de acceso de público a público. protegido no puede proceder.
Listado 6.10 Clase de enlace dinámico
Padre
{
protected $salutation = "¡Hola!" //Saludos
función pública getSalutation();
{
print("$this->saludon");
$this->identificar();
}
función protegida identificar()
{
print("Yo soy el Padre.
norte");
}
};
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.
norte");
}
};
$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.
// Vinculado dinámicamente al método getSalutation() en la instancia de la subclase Son, por lo que se llama al método getSalutation() de la instancia de Son,
// Se llamará al saludo de miembro e identificar () en la clase Son en lugar del saludo de miembro e identificar () en la clase principal.
Los miembros privados solo existen dentro de la clase en la que se encuentran. A diferencia de los miembros públicos y protegidos, PHP. simula el enlace estático. Consulte el ejemplo 6.11. Imprime "¡Hola! Soy Padre". Aunque la subclase sobrescribe el valor del saludo, el script vincula this->salutation a la clase actual Padre. Un principio similar se aplica al método privado identificar().
Listado 6.11
Clase de miembros vinculantes y privados Padre
{
private $salutation = "¡Hola!"
función pública getSalutation();
{
print("$this->saludon");
$this->identificar();
}
función privada identificar()
{
print("Yo soy el Padre.
norte");
}
}
clase Hijo extiende Padre
{
saludo privado = "¡Oye!";
función privada identificar()
{
print("Soy Hijo.
norte");
}
}
$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 6.12. Debido al uso del enlace dinámico, se llama a la versión isAuthorized. deleteUser puede ser determinado por el tipo de objeto. Si es un usuario normal, PHP llamando a User::isAuthorized devolverá FALSO. Si es una instancia de AuthorizedUser, PHP llamando a AuthorizedUser::isAuthorized permitirá que deleteUser se ejecute sin problemas.
//haohappy Nota: Para decirlo claramente en una oración, es tipo de objeto y método, enlace de atributo. 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 es. pertenece la instancia y luego llama a los métodos y propiedades de la clase correspondiente.
Listado 6.12 Beneficios de la clase de enlace dinámico
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.
norte");
retorno (FALSO);
}
//eliminar el usuario
print("Usuario eliminado.
norte");
}
}
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 menos común de lo que podría pensar. En términos generales, una buena jerarquía de objetos debería permitir que las subclases especialicen, mejoren o cambien la mayor parte de la funcionalidad. de los fundamentos de la programación orientada a objetos. Los métodos o variables privados 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.