¿Cómo usar la constante de clase como una definición de argumento en la función php?

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) .