Comenzando con la versión 5.3, PHP admite late binding para métodos estáticos. Si bien es una característica indudablemente útil, solo hay varios casos en los que su uso es realmente necesario (por ejemplo, el patrón de registro activo).¿Es posible usar en exceso el enlace estático tardío en PHP?
Considere estos ejemplos:
1. constructores de conveniencia (::create()
)
class SimpleObject
{
public function __construct() { /* ... */ }
public static function create()
{
return new static; // or: return new self;
}
}
Si esta clase se puede extender (sin embargo, no es extendido por cualquier clase en el mismo paquete), debe el enlace estático tardío se usa solo para facilitar la extensión (sin tener que volver a escribir el método ::create()
, y, lo que es más importante, sin tener que acordarse de hacerlo).
Nota: esta expresión idiomática se utiliza para evitar la imposibilidad de llamar a métodos en objetos simplemente construidos: new SimpleObject()->doStuff()
no es válido en PHP.
2. Clase constantes de
class TagMatcher
{
const TAG_PATTERN = '/\<([a-z\-]+?)\>/i';
private $subject;
public function construct($subject) { $this->subject = $subject; }
public function getAllTags()
{
$pattern = static::TAG_PATTERN;
preg_match_all($pattern, $this->subject);
return $pattern[1];
}
}
La razón para utilizar static::
en este ejemplo es similar a la anterior. Se usa solo porque se puede hacer que esta clase coincida con etiquetas formadas de forma diferente simplemente extendiéndola y anulando la constante.
lo tanto, para envolverlo todo, son estos usos (y otras similares) en los últimos tiempos estática de unión se una exageración? ¿Hay algún golpe de rendimiento notable? Además, ¿el uso frecuente de enlace tardío reduce el aumento del rendimiento general otorgado por los cachés de código de operación?
Bueno, el segundo se puede lograr anulando una variable privada y usando '$ this', también, ¿no? ¿O estoy malentendiendo algo? – Franz
Sí, pero simplemente no podría llegar a un mejor ejemplo ... Tenerlo como 'const' significa evitar copiarlo a través de todas las instancias. E incluso si PHP's copy-on-write optimizara esto, ciertamente se ve mejor como una constante de clase, porque en realidad es un valor constante para toda la clase. –
... y por todo eso, quise decir que en este caso el uso de variables de instancia parece una solución, mientras que 'static ::' no. –