Hace php 7 de apoyo, tipo de sugerencias para las propiedades de la clase?
Me refiero, no sólo para incubadoras/getters pero para la misma propiedad.
Algo como:
class Foo {
/**
*
* @var Bar
*/
public $bar : Bar;
}
$fooInstance = new Foo();
$fooInstance->bar = new NotBar(); //Error
- No que yo sepa. Sin embargo, en general se habla de ningún tipo de restricciones en el valor de una propiedad deben realizarse a través de un setter de todos modos. Desde el setter puede tener fácilmente un typehint por el «valor» del argumento, usted es bueno ir.
- Muchos marcos por ahí hace uso de atributos protegidos (sobre todo para los controladores). Para aquellos casos en particular, sería muy útil.
PHP 7.4 apoyará escribió propiedades así:
PHP 7.3 y versiones anteriores no son compatibles con este, pero hay algunas alternativas.
Puede hacer que una propiedad privada, que es accesible sólo a través de getters y setters que han declaraciones de tipo:
Usted también puede hacer un público de la propiedad y el uso de un bloque de documentación para proporcionar el tipo de información a la gente que lee el código y el uso de un IDE, pero esto no proporciona ningún tipo en tiempo de ejecución-verificación:
Y, de hecho, se pueden combinar los getters y los setters y un bloque de documentación.
Si eres más aventurero, usted podría hacer un fake de la propiedad con el
__get
,__set
,__isset
y__unset
la magia de los métodos de, y de verificación de los tipos a ti mismo. No estoy seguro de si yo la recomendaría, aunque.array_push($this->foo, $bar)
osort($this->foobar)
sería una gran cosa.(new Person())->dateOfBirth = '2001-01-01';
… Siempredeclare(strict_types=0);
que es. Va a tirar o usar elDateTimeImmutable
constructor? Y si ese es el caso, que tipo de error se produce si la cadena es una fecha no válida?TypeError
?7.4+:
Buena noticia de que será implementado en las nuevas versiones, como @Andrea señaló.
Voy a dejar esta solución aquí en caso de que alguien quiera usarlo antes de 7.4
7.3 o menos
Basadas en las notificaciones me sigue recibiendo de este hilo, creo que mucha gente ahí fuera que tenía/tiene el mismo problema que yo tenía. Mi solución para este caso fue la combinación de incubadoras +
__set
método mágico en el interior de un rasgo con el fin de simular este comportamiento.Aquí está:
Y aquí está la demostración:
Explicación
Primero de todo, definir
bar
como una propiedad privada para PHP elenco__set
automágicamente.__set
comprobará si hay algunos setter declarado en el objeto actual (method_exists($this, $setter)
). De lo contrario es sólo establecer su valor como lo haría normalmente.Declarar un método setter (setBar) que recibe un tipo-insinuó argumento (
setBar(Bar $bar)
).Tan largo como PHP detecta que hay algo que no es
Bar
instancia se pasa a la incubadora, será automáticamente desencadenar un Error Fatal: Uncaught TypeError: Argumento 1 pasa a Foo::setBar() debe ser una instancia de Bar, instancia de NotBar dadoEn realidad no es posible y sólo tiene 4 formas de simular :
Me combinado de todos ellos aquí
Nota de que en realidad se puede escribir la devolución ?Bar desde php 7.1 (que acepta valores null), ya que podría ser null (no disponible en php7.0.)
También puede escribir el retorno nula desde php7.1
Puede utilizar setter
De salida: