Autor Zpráva
Hologos
Profil
Zdravím,
nejdříve kus kódu:

class Message
{
	const OK = 'everything is ok';
	const NOT_OK = 'something is wrong';
	const UNABLE_TO_RECEIVE_RESPONSE = 'unable to receive response';
	
	public function send($code)
	{
		// TEST
		sendMessage($code);
	}
}


Problém mám s tím, jak udělat test, zda-li parametr $code je jeden z těch předdefinovaných konstant.
Chtěl bych to nějak elegantně, ale napadlo mě jen toho hnusné:
class Message
{
	const OK = 0;
	const NOT_OK = 1;
	const UNABLE_TO_RECEIVE_RESPONSE = 2;
	
	private $messages = array(
							0 => 'everything is ok',
							1 => 'something is wrong',
							2 => 'unable to receive response'
						);
	
	public function send($code)
	{
		if($code < 0 && $code > 2)
			throw new Exception('...');
		
		sendMessage($code);
	}
}

Jenže je to hůře rozšiřitelné. Když budu chtít přidat/smazat/změnit pořadí, musím si dát pozor na kontrolu rozsahu, prohodit to v tom poli, atp. A to je prostě hnus.
Kdyby to byly proměnné, mohl bych využít get_class_vars(get_class($this)) a to pak porovnat. Ale pro konstanty jsem nic takového nenašel.
Nenapadá někoho něco?
Díky
Majkl578
Profil
Kontrolu existence třídní konstanty by šlo provést pomocí defined:
defined(__CLASS__ . '::' . $name);
Její hodnotu (dynamicky) pak pomocí constant:
constant(__CLASS__ . '::' . $name)

Pro kontrolu, jestli hodnota je rovna některé z hodnot konstant, by se asi hodila Reflexe:
$ref = new ReflectionClass('Foo');
in_array($value, $ref->getConstants());
Hologos
Profil
Budu si muset něco přečíst o reflexi, abych věděl, o čem je řeč.
Zatím použiji to
constant(__CLASS__ . '::' . $name)

Díky moc.

// Tak už vím, o co jde, díky moc.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0