Além de restringir o acesso, o método de acesso também determina qual método será chamado pela subclasse ou qual propriedade será acessada pela subclasse. O relacionamento entre as chamadas de função e a própria função, e o relacionamento entre o acesso aos membros e os endereços de memória variável, é chamado de vinculação.
Existem dois tipos principais de vinculação em linguagens de computador - vinculação estática e vinculação dinâmica. A ligação estática ocorre entre estruturas de dados e estruturas de dados antes da execução do programa. A ligação estática ocorre em tempo de compilação e, portanto, não pode utilizar nenhuma informação de tempo de execução. Ele tem como alvo chamadas de função e o corpo de uma função, ou variáveis e blocos de memória. Como o PHP é uma linguagem dinâmica, ele não usa ligação estática. Mas a ligação estática pode ser simulada.
A ligação dinâmica usa apenas informações disponíveis em tempo de execução para solicitações de acesso geradas durante o tempo de execução. No código orientado a objetos, a ligação dinâmica significa que a decisão sobre qual método será chamado ou qual propriedade será acessada será baseada na própria classe e não no escopo de acesso.
As ações dos membros públicos e protegidos são semelhantes às ações das funções nas versões anteriores do PHP, usando ligação dinâmica. Isso significa que se um método acessar um membro da classe que foi substituído em uma subclasse e for uma instância da subclasse, o membro da subclasse será acessado (em vez de acessar o membro da classe pai).
Veja o Exemplo 6.10. Este código gera "Ei! Eu sou Filho." Porque quando o PHP chama getSalutation, é uma instância de Filho, que substitui a saudação em Pai. a operação do método substituído é muito semelhante. No Son, as chamadas para identificar estão vinculadas a esse método.
Mesmo que o método de acesso seja enfraquecido de protegido para público em uma subclasse, a ligação dinâmica ainda ocorrerá. De acordo com o princípio do uso de métodos de acesso, é impossível aumentar as restrições de acesso aos membros da classe, alterando assim o método de acesso de público para. protegido não pode prosseguir.
Listagem 6.10 Classe de ligação dinâmica de ligação dinâmica
Pai
{
protegido $salutation = "Olá!"; //Saudações
public function getSalutation()
{
print("$this->saudaçãon");
$this->identificar();
}
função protegida identificar()
{
print("Eu sou o pai.
n");
}
};
classe Filho estende Pai
{
protected $salutation = "Ei!"; //protegido $salutation na classe pai é sobrescrito
protected functionidentifier() //protegido identificador() na classe pai é sobrescrito
{
print("Eu sou filho.
n");
}
};
$obj = novo Filho();
$obj->getSalutation(); //Saída Ei, eu sou filho.
?>
//Nota: getSalutation() não é substituído na subclasse, mas na verdade ainda existe um getSalutation() e $salutation() nesta classe.
//Dinamicamente ligado ao método getSalutation() na instância da subclasse Son, então o método getSalutation() da instância Son é chamado,
//A saudação do membro e a identificação() na classe Son serão chamadas em vez da saudação do membro e a identificação() na classe pai,
os membros privados só existem dentro da classe em que estão localizados. simula ligação estática. Veja o Exemplo 6.11. Ele imprime "Olá! Eu sou o Pai." Embora a subclasse substitua o valor da saudação, o script vincula this->saudação à classe atual Pai. Um princípio semelhante se aplica ao método privado identificar().
Listagem 6.11 Membros vinculativos e privados
da classe Pai
{
private $salutation = "Olá!";
public function getSalutation()
{
print("$this->saudaçãon");
$this->identificar();
}
função privada identificar()
{
print("Eu sou o pai.
n");
}
}
classe Filho estende Pai
{
private $saudação = "Ei!";
função privada identificar()
{
print("Eu sou filho.
n");
}
}
$obj = new Filho();
$obj->getSalutation(); //Saída Olá, eu sou o pai.
?>
A vantagem da ligação dinâmica é que ela permite que classes herdadas alterem o comportamento da classe pai enquanto mantêm a interface e as funções da classe pai. Consulte o Exemplo 6.12. deleteUser pode ser determinado pelo tipo de objeto. Se for um usuário comum, a chamada do PHP User::isAuthorized retornará FALSE. Se for uma instância de AuthorizedUser, a chamada do PHP AuthorizedUser::isAuthorized permitirá que deleteUser seja executado sem problemas.
//haohappy Nota: Para deixar claro em uma frase, é tipo de objeto e método, ligação de atributo Ao chamar um método que existe na classe pai e na subclasse ou acessar um atributo, ele primeiro determinará qual tipo de objeto o.
listagem 6.12 Benefícios da
classe de ligação dinâmica User //User
.
{
função protegida isAuthorized() //Se é um usuário autenticado
{
retornar(FALSO);
}
public function getName() //Obtém o nome
{
return($este->nome);
}
função pública deleteUser($nomedeusuário) //Excluir usuário
{
if(!$this->isAuthorized())
{
print("Você não está autorizado.
n");
retornar(FALSO);
}
//exclui o usuário
print("Usuário excluído.
n");
}
}
class AuthorizedUser estende Usuário //Autenticação do usuário
{
função protegida isAuthorized() //sobrescrever isAuthorized()
{
retornar(VERDADEIRO);
}
}
$usuário = novo usuário;
$admin = new AuthorizedUser;
//não autorizado;
deleteUser
("Zeev");
$admin->deleteUser("Zeev");
?>
Por que membros de classes privadas simulam ligação estática Para responder a esta pergunta, você precisa lembrar por que precisa ter membros privados. Quando faz sentido usá-los em vez de membros
privados apenas se você não quiser
?subclasses a serem herdadas Usado apenas ao alterar ou especializar o comportamento de uma classe pai. Isso é menos comum do que você imagina. De modo geral, uma boa hierarquia de objetos deve permitir que a maioria das funcionalidades seja especializada, melhorada ou alterada por subclasses. dos fundamentos da programação orientada a objetos. Métodos ou variáveis privadas são necessários em determinadas situações, como quando você tem certeza de que não deseja permitir que uma subclasse altere uma parte específica da classe pai.