Tengo una clase:
class FetchMode { const FetchAll = 0; const FetchOne = 1; const FetchRow = 2;}
y una función:
function getRecordSet(FetchMode $FetchMode){ some switch cases }
Me gustaría usar $ FetchMode como criterio de caso de cambio pero recibiendo un error: Error fatal que se puede capturar: el argumento pasado a getRecordSet () debe ser una instancia de FetchMode, dado un entero
Así es como llamo a una función:
getRecordSet(FetchMode::FetchOne);
Me gustaría ofrecer una lista de posibles opciones para llamar a una función. ¿Es posible en php?
Has insinuado a PHP que espere una instancia de FetchMode
(como se indica en el mensaje de error), pero FetchMode::FETCH*
pasa el valor constante. Tendría que usar algún tipo de instancia de Enum (que no tenemos de forma nativa en PHP. (Bueno, hay SplEnum
pero quién usa eso?)) O cambiar la firma del método para excluir el tipo de sugerencia.
Sin embargo, en lugar de un Switch / Case, puede resolverlo más fácilmente a través de Polymorphism y un patrón de Estrategia , por ejemplo, en lugar de hacer algo como
public function getRecordSet($mode) { switch ($mode) { case FetchMode::ALL: // code to do a fetchAll break; case FetchMode::ONE: // code to do a fetchOne break; default: } }
lo que boostá la complejidad cilíntica de su clase y forzará los cambios en esa clase y FetchMode
cada vez que necesite agregar FetchModes adicionales, puede hacer:
public function getRecordSet(FetchMode $fetchModeStrategy) { return $fetchModeStrategy->fetch(); }
y luego tener una interfaz para proteger la variación
interface FetchMode { public function fetch(); }
y agregue clases concretas de FetchMode
para cada FetchMode compatible
class FetchOne implements FetchMode { public function fetch() { // code to fetchOne } } class FetchAll … class FetchRow …
De esta manera, nunca más tendrás que tocar la clase con ese método getRecordSet
, ya que funcionará para cualquier clase que implemente esa interfaz de FetchMode
. Entonces, cuando tenga nuevos FetchModes, simplemente agregue una nueva clase, que es mucho más fácil de mantener a largo plazo.
No se a que te refieres con
le gustaría ofrecer una lista de posibles opciones para llamar a una función. ¿Es posible en php?
pero para la parte de error: imagina que tienes una var, por ejemplo, $foo
. Cuando haces echo $foo
no obtienes el nombre de la var sino su valor. Esto se debe a que una var tiene un nombre y apunta a un valor. Cada acceso a la var básicamente devuelve el valor al que apunta. Es lo mismo con las constantes; Pones el nombre constante allí, pero básicamente estás apuntando a tu valor almacenado. Lo que significa getRecordSet(FetchMode::FetchOne);
y getRecordSet(1);
es el mismo.
Por lo tanto, los getRecordSet(FetchMode $FetchMode)
must be an instance of FetchMode
porque FetchMode::FetchOne
apunta a un entero.
Para solucionar este problema, debe usar getRecordSet(int $FetchMode)
.