Type de conseils de propriétés en PHP 7?
N'php 7 type de support les conseils de propriétés de la classe?
Je veux dire, pas juste pour setters/getters mais pour le bien lui-même.
Quelque chose comme:
class Foo {
/**
*
* @var Bar
*/
public $bar : Bar;
}
$fooInstance = new Foo();
$fooInstance->bar = new NotBar(); //Error
- Non pas que je suis au courant de. Cependant, en général toutes les contraintes sur une valeur de la propriété doit être fait par le biais d'un poseur de toute façon. Depuis le setter peut facilement avoir un typehint de la "valeur" d'argument, vous êtes bon pour aller.
- De nombreux cadres de là-bas fait d'utiliser des attributs protégés (surtout pour les contrôleurs). Pour ces cas, en particulier, il serait très utile.
Vous devez vous connecter pour publier un commentaire.
PHP 7.4 soutiendra des propriétés typées comme suit:
PHP 7.3 et versions antérieures ne prennent pas en charge cela, mais il ya quelques solutions de rechange.
Vous pouvez faire une propriété privée qui est accessible uniquement par le biais des getters et setters qui ont les déclarations de type:
Vous pouvez aussi faire un bien public et d'utiliser un docblock de fournir des informations de type pour les gens à lire le code et l'utilisation d'un IDE, mais cela ne fournit aucune exécution vérification de type:
Et en effet, vous pouvez combiner les getters et les setters et un docblock.
Si vous êtes plus aventureux, vous pourriez faire un faux bien avec le
__get
,__set
,__isset
et__unset
méthodes magiques, et de vérifier les types de vous-même. Je ne suis pas sûr si je le recommande, cependant.array_push($this->foo, $bar)
ousort($this->foobar)
serait une grosse affaire.(new Person())->dateOfBirth = '2001-01-01';
... à Condition dedeclare(strict_types=0);
qui est. Il va les jeter ou de l'utilisation de laDateTimeImmutable
constructeur? Et si c'est le cas, quel type d'erreur sera levée si la chaîne est une date non valide?TypeError
?7.4+:
Bonne nouvelle qu'il sera mis en œuvre dans les nouvelles versions, comme @Andrea souligné.
Je vais juste laisser cette solution ici au cas où quelqu'un veut l'utiliser avant de 7,4
7.3 ou moins
Sur la base de notifications que je reçois encore de ce fil, je crois que beaucoup de gens y avaient/ont le même problème que j'ai eu. Ma solution pour ce cas a été la combinaison setters +
__set
méthode magique à l'intérieur d'un trait afin de simuler ce comportement.Ici, il est:
Et voici la démonstration:
Explication
Tout d'abord, définir
bar
comme une propriété privée afin de PHP sera jeté__set
automatiquement.__set
va vérifier si il y a un setter déclaré dans l'objet courant (method_exists($this, $setter)
). Sinon, il ne définissez sa valeur comme il le ferait normalement.Déclarer une méthode de définition (setBar) qui reçoit un type allusion argument (
setBar(Bar $bar)
).Tant que PHP détecte que quelque chose qui n'est pas
Bar
instance est passé pour le setter, il va automatiquement déclencher une Erreur Fatale: Uncaught TypeError: Argument 1 passé à Toto::setBar() doit être une instance de Bar, de l'instance de NotBar donnéIl n'est pas réellement possible et vous n'avez 4 possibilités pour réellement simuler :
J'ai combiné tous ici
Notez que vous pouvez réellement type de la déclaration, comme ?Bar depuis la version 7.1 (nullable), car il pourrait être null (non disponible dans php7.0.)
Vous pouvez également le type de retour void depuis php7.1
Vous pouvez utiliser setter
De sortie: