Um dos recursos mais discutidos do PHP 8.4 são os Property Hooks. Os ganchos de propriedade nos permitem juntar um comportamento específico a uma única propriedade, ao mesmo tempo que permitem que esse comportamento não interfira nos aspectos existentes do PHP.
Isso será uma viradela de jogo para nós, desenvolvedores de PHP. Neste item, discutiremos porquê usar os ganchos de propriedades do PHP.
O que são ganchos de propriedade PHP?
Em um nível superior, os ganchos de propriedade permitem juntar lógica personalizada diretamente às propriedades da classe. Isso significa que você pode interagir com propriedades porquê $user->fullName
porquê se fosse um getter ou
função setter sem precisar de métodos separados porquê $user->getFullName()
ou $user->setFullName()
.
Definimos ganchos de propriedade definindo um set
e get
operação que será executada ao configurar ou obter uma propriedade.
Acho que esta seção do RFC para ganchos de propriedade ajuda a ilustrar o caso de uso de ganchos de propriedade.
Um caso de uso principal para ganchos é, na verdade, não usá-los, mas manter a capacidade de fazê-lo no horizonte, caso seja necessário. Em privado, os desenvolvedores geralmente implementam métodos getFoo/setFoo em uma propriedade não porque sejam necessários, mas porque podem se tornar necessários em um horizonte hipotético, e mudar de uma propriedade para um método nesse ponto se torna uma mudança de API.
Criando um gancho “get”
O get
hook é usado para definir o que acontece quando uma propriedade é lida.
Por exemplo, se tivermos um User
classe onde rastreamos o nome e o sobrenome do usuário, mas precisamos obter rapidamente seu “nome completo”. Podemos definir a primeira e a última propriedades usando a promoção da propriedade do construtor e logo definir um fullName
imóvel que terá get
gancho de propriedade. Portanto podemos facilmente gerar o fullName
.
Nota: peguei isso da RFC e modifiquei um pouco, pois é um ótimo exemplo!
"{$this->first} {$this->last}";
}
}
$user = new User("Scott", "Keck-Warren");
// output:
// Scott Keck-Warren
echo $user->fullName, PHP_EOL;
Criando um gancho “conjunto”
O set
hook é usado para definir o que acontece quando atribuímos uma propriedade.
Se voltarmos ao nosso User
classe, podemos juntar umset
gancho para o nosso fullName
propriedade que iráexplode
o valor que passamos para ele.
first, $this->last] = explode(" ", $value, 2);
}
}
}
$user = new User("Scott", "Keck-Warren");
$user->fullName = "Joe Keck-Warren";
// output:
// Joe
// Keck-Warren
echo $user->first, PHP_EOL;
echo $user->last, PHP_EOL;
Readonly
eWriteonly
Propriedades
Uma das características interessantes dos ganchos de propriedade é que não precisamos definir tanto o get
e set
operações para que possamos fabricar alguns comportamentos interessantes.
Se definirmos unicamente o get
gancho de propriedade, criaremos uma propriedade somente leitura.
"{$this->first} {$this->last}";
}
}
$user = new User("Scott", "Keck-Warren");
// Uncaught Error: Property Sua visita nos ajuda a continuar oferecendo o melhor para você! is read-only in /app/test.php:13
$user->fullName = "Junk Value";
Se definirmos unicamente o set
gancho de propriedade, criaremos uma propriedade somente gravação.
first, $this->last] = explode(" ", $value, 2);
}
}
}
$user = new User("Scott", "Keck-Warren");
// output:
// Property User::$fullName is write-only
echo $user->fullName, PHP_EOL;
A incrível emprego disso é que podemos usá-lo para fabricar uma propriedade que criptografa ou faz hash de um valor, mantendo o valor hash seguro externamente, tornando-o privado.
hashedPassword = password_hash($value, PASSWORD_DEFAULT);
}
}
private string $hashedPassword;
}
$user = new User();
$user->password = "CorrectHorseBatteryStaple";
// Uncaught Error: Cannot access private property
echo $user->hashedPassword, PHP_EOL;
// Uncaught Error: Property User::$password is write-only
echo $user->password, PHP_EOL;
Uma das discussões sobre isso on-line é que isso facilita a geração de código “confuso” porque, embora esperemos que a propriedade unicamente defina o valor, ela está fazendo Sua visita nos ajuda a continuar oferecendo o melhor para você! tanto nos bastidores. Isso não é
dissemelhante de ter um setPassword()
isso faz a mesma coisa.
Visibilidade Assimétrica
Outro recurso adicionado ao PHP 8.4 porquê segmento da funcionalidade de ganchos de propriedade é a capacidade de definir propriedades que possuem Visibilidade Assimétrica (https://wiki.php.net/rfc/ametric-visibility-v2). Isso significa que podemos definir uma propriedade que pode ser “obtida” publicamente, mas só pode ser “definida” pela classe (private
) ou seus filhos (protected
).
Fazemos isso declarando a propriedade porquê public
porquê normal, mas depois adicionando private(set)
ou protected(set)
antes de digitarem porquê o código inferior. Agora receberemos um erro se tentarmos acessá-lo.
hashedPassword = password_hash("CorrectHorseBatteryStaple", PASSWORD_DEFAULT);
Agora podemos definir uma classe filha que pode modificar a propriedade.
class StandardUser extends User
{
public function setHashedPassword(string $value): void
{
$this->hashedPassword = password_hash($value, PASSWORD_DEFAULT);
}
}
$user = new StandardUser();
$user->setHashedPassword("CorrectHorseBatteryStaple");
Idealmente, a classe filha entende porquê mourejar “corretamente” com isso, para que não atrapalhe o que os pais estão fazendo. É realmente uma soma incrível;
Interfaces
Outra funcionalidade que estamos obtendo com ganchos de propriedade é a capacidade de definir ganchos de propriedade dentro de nossas interfaces para que nossas classes sejam forçadas a implementá-los.
O que é realmente poderoso é que podemos definir propriedades dentro de nossa interface porquê readonly
incluindo{ get; }
depois ou leia e escreva usando{ get; set;}
logo podemos usar a promoção da propriedade do construtor para definir a propriedade.
O que você precisa saber
- Property hooks são um recurso adicionado ao PHP 8.4
- Os ganchos de propriedade nos permitem “substituir” o padrão get e set
operações em propriedades - Defina propriedades com visibilidade assimétrica
- Também pode definir propriedades em interfaces
Tags:
Crédito: Manadeira Original