Obtención del nombre de la clase a partir de una llamada estática de clase PHP extendida
En la programación orientada a objetos, las clases a menudo extienden las clases base para heredar y ampliar su funcionalidad . Un escenario común implica la necesidad de obtener el nombre de la clase a partir de una llamada a un método estático en una clase extendida, a pesar de que CLASS siempre devuelve el nombre de la clase que la define.
Problema: inaccesibilidad del nombre de la clase en los métodos estáticos principales
Considere un escenario con dos clases, Acción y MiAcción, donde MiAcción extiende Acción. Acción define un método estático, n(), que es inaccesible a través de la constante CLASS dentro de los métodos estáticos principales, lo que da como resultado la CLASS el valor se establece en "Acción" independientemente de la llamada clase.
Soluciones:
1. Enlaces estáticos tardíos (PHP 5.3):
Los enlaces estáticos tardíos le permiten determinar la clase de destino de una llamada a un método estático en tiempo de ejecución en lugar de cuando se define el método. Esto se logra usando la función get_Called_class(), que devuelve el nombre de la clase en la que se llamó el método estático.
Por ejemplo:
class Action {
public static function n() {
return get_called_class();
}
}
class MyAction extends Action {
}
echo MyAction::n(); // Outputs "MyAction"
2. Usando get_class($this) (solo métodos no estáticos):
Si el método en cuestión no es estático, puede usar get_class($this) para obtener la clase nombre desde el cual se llamó el método.
Por ejemplo:
class Action {
public function n() {
echo get_class($this);
}
}
class MyAction extends Action {
}
$foo = new MyAction;
$foo->n(); // Outputs "MyAction"
Conclusión:
Tanto los enlaces estáticos tardíos como get_class($this) ofrecen soluciones para recuperar el nombre de la clase de una llamada a un método estático en un clase extendida. Los enlaces estáticos tardíos son preferibles para métodos estáticos, mientras que get_class($this) es útil para métodos no estáticos.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3