Estoy trabajando en una clase que necesita ser accesible a través de llamadas a funciones estáticas y métodos de objetos. Una cosa que he encontrado es que estoy duplicando la lógica en múltiples funciones.
ejemplo simplificado:
class Configurable{
protected $configurations = array();
protected static $static_configurations = array();
public function configure($name, $value){
// ...lots of validation logic...
$this->configurations[$name] = $value;
}
public static function static_configure($name, $value){
// ...lots of validation logic (repeated)...
self::$static_configurations[$name] = $value;
}
}
he encontrado una solución a este, pero se siente muy sucio:
class Configurable{
protected $configurations = array();
protected static $static_configurations = array();
public function configure($name, $value){
// ...lots of validation logic...
if (isset($this)){
$this->configurations[$name] = $value;
}
else{
self::$static_configurations[$name] = $value;
}
}
}
Necesito la función estática, así por lo que puedo ajustar las configuraciones de largo la aplicación. Además, lo bueno de esta técnica es que puedo usar los mismos nombres de método en ambos ámbitos.
¿Hay algún problema con el alcance de prueba de esta manera? Problemas de rendimiento, problemas de compatibilidad con versiones anteriores, etc. Todo funciona para mí en PHP 5.2 y no necesito admitir < 5.
OK, aparte del estricto error, ¿hay algún problema con el segundo método? Probablemente lo cambie en su consejo de todos modos, pero me gustaría entender los problemas reales con el uso de un código como este. ¿Es una característica que probablemente se eliminará de futuras versiones de PHP o siempre podrá llamar a métodos no estáticos de forma estática? – Rowan
Los errores de "E_STRICT" tienden a ser "Esto parece una muy mala idea, pero vamos a dejar que intentes hacerlo de todos modos". No hay garantías de que algo así siempre funcione, pero probablemente se convertirán en 'E_NOTICE' o' E_WARN' antes de ser completamente obsoletos. – MightyE
Gracias por aclarar que @MightyE – Rowan