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 ligação.
Na linguagem de computador, existem duas maneiras principais de ligação: A ligação estática e a ligação dinâmica ocorrem entre estruturas de dados e estruturas de dados, antes que o programa seja executado em tempo de compilação, portanto, não pode usar nenhum tempo de execução. informações. Ele tem como alvo chamadas de função e o corpo da função, ou variáveis e blocos na memória. Como o PHP é uma linguagem dinâmica, ele não usa ligação estática, mas pode simular
acesso de ligação dinâmica gerado durante o tempo de execução
.As solicitações usam apenas informações disponíveis em tempo de execução. No código orientado a objetos, a ligação dinâmica significa que a decisão sobre qual método é chamado ou qual propriedade é acessada será baseada na própria classe e não no escopo de acesso
. semelhante às ações de função nas versões anteriores do PHP, usando ligação dinâmica. Isso significa que se um método acessa um membro da classe que é substituído em uma subclasse e é uma instância da subclasse, o membro da subclasse será acessado (em vez de acessar os membros). na classe pai).
Veja a Figura 1. Este código gera "Ei! Eu sou Filho". produzirá o mesmo resultado. A substituição de um método funciona de maneira semelhante. Em Son, a chamada para identificar está vinculada a esse método.
Mesmo em subclasses, o modo de acesso é enfraquecido de protected para public , a ligação dinâmica ainda ocorrerá. princípio de usar métodos de acesso, é impossível aumentar as restrições de acesso aos membros da classe. Portanto, é impossível alterar o método de acesso de público para
protegido
.
classe Pai
{
protegido $salutation = "Olá!"; //Saudações
public function getSalutation()
{
print("$this->saudaçãon");
$this->identificar();
}
função protegida identificar()
{
print("Eu sou 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()
. subclasse O método é vinculado dinamicamente, portanto, chamar o método getSalutation() da instância Son
chamará a saudação do membro e a identificação() na classe Son, em vez da saudação do membro e da identificação() na classe pai
. neles Dentro da classe onde está localizado Diferentemente dos membros públicos e protegidos, o PHP simula a ligação estática. Veja o exemplo na Figura 2. Ele gera "Olá! Eu sou Pai.", mesmo que a subclasse substitua o valor da saudação. O script this->salutation está vinculado à classe atual Pai. Princípios semelhantes se aplicam ao método privado identificador ()
e aos membros privados
<?php.
classe Pai
{
private $salutation = "Olá!";
public function getSalutation()
{
print("$this->saudaçãon");
$this->identificar();
}
função privada identificar()
{
print("Eu sou 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. Veja o exemplo da Figura 3. Devido ao uso da ligação dinâmica, a versão de isAuthorized chamada. em deleteUser pode ser determinado pelo tipo de objeto. Se for um usuário comum, o PHP chamando User::isAuthorized retornará FALSE. Se for uma instância de AuthorizedUser, o PHP chamando AuthorizedUser::isAuthorized permitirá que deleteUser seja executado sem problemas
. haohappy Nota: use Para deixar claro em uma frase, é a ligação de tipos de objetos, métodos e atributos. Ao chamar um método que existe na classe pai e na subclasse ou acessar um atributo, ele primeiro determinará qual tipo de objeto. à qual a instância pertence e, em seguida, chame o método na classe And correspondente.
Benefícios da ligação dinâmica
<?php
.
classe Usuário //usuário
{
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 é mais raro do que você pensa. Em geral, uma boa hierarquia de objetos deve permitir que a maioria das funcionalidades seja especializada, melhorada ou alterada por subclasses. 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.