2010/1/25 Colin Guthrie <gmane@xxxxxxxxxxxxxx>: > 'Twas brillig, and Richard Quadling at 22/01/10 11:33 did gyre and gimble: >> Hello, >> >> One of the aspects of an interface is to enforce a public view of a >> class (as I see it). >> >> Within PHP, interfaces are allowed to have constants, but you cannot >> override them in a class implementing that interface. >> >> This seems wrong. >> >> The interface shouldn't define the value, just like it doesn't define >> the content of the method, it only defines its existence and requires >> that a class implementing the interface accurately matches the >> interface. >> >> Is there a reason for this behaviour? >> >> >> >> _OR_ >> >> How do I enforce the presence of a constant in a class? >> >> <?php >> interface SetKillSwitch { >> const KILL_SWITCH_SET = True; >> >> // Produces an error as no definition exists. >> // const KILL_SWITCH_NOTES; >> >> // Cannot override in any class implementing this interface. >> const KILL_SWITCH_DATE = '2010-01-22T11:23:32+0000'; >> } >> >> class KilledClass implements SetKillSwitch { >> // Cannot override as defined in interface SetKillSwitch. >> // const KILL_SWITCH_DATE = '2010-01-22T11:23:32+0000'; >> } >> ?> >> >> I want to enforce that any class implementing SetKillSwitch also has a >> const KILL_SWITCH_DATE and a const KILL_SWITCH_NOTES. >> >> I have to use reflection to see if the constant exists and throw an >> exception when it doesn't. >> >> The interface should only say that x, y and z must exist, not the >> values of x, y and z. > > Forgive the perhaps silly question but why are you requiring to use > constants here. > > I appreciate the desire to use Reflection but why not just define a > method that must be implemented in the interface? > > interface SetKillSwitch { > public function getKillDate(); > public function getKillNotes(); > } > > > By virtue of something impementing the interface, you know the methods > will exist. > > If you want to make implmentation of classes easier, then define and > abstract class with an appropriate constructor and implementation: > > > abstract class SetKillSwitchAbstract { > private $_killDate; > private $_killNotes; > protected function __construct($killDate, $killNotes) > { > $this->_killDate = $killDate; > $this->_killNotes = $killNotes; > } > > public function getKillDate() > { > return $this->_killDate; > } > > public function getKillNotes() > { > return $this->_killNotes; > } > } > > > You can either put your "implements SetKillSwitch" in this class or the > derived classes depending on other methods you want to provide in the > base class. > > > I don't see why constants specifically are needed here. Rather than > using reflection you can just use instanceof or similar to tell if a > given object implements the interface or simply use the interface name > as a type specifier on an argument to another function/method etc. > > > Col > > > -- > > Colin Guthrie > gmane(at)colin.guthr.ie > http://colin.guthr.ie/ > > Day Job: > Tribalogic Limited [http://www.tribalogic.net/] > Open Source: > Mandriva Linux Contributor [http://www.mandriva.com/] > PulseAudio Hacker [http://www.pulseaudio.org/] > Trac Hacker [http://trac.edgewall.org/] > > > -- > PHP General Mailing List (http://www.php.net/) > To unsubscribe, visit: http://www.php.net/unsub.php > > With a constant, PhpDoc will pick up the value of the constant and incorporate it into the documentation. With a method, there is no way to know the return value. The type, sure, but not the value. Setting a constant is by far the simplest way to deal with this. A method to return a constant is one method unneeded. But, as I've said, I completely missed defined(). That's all I needed. If the kill interface is applied to a class, then the parent class can quite happily use defined(get_called_class() . '::KILL_SWITCH_SET') to see if the class is defunct (or whatever). Really. It was just the defined() call I missed. Everything is now working fine. -- ----- Richard Quadling "Standing on the shoulders of some very clever giants!" EE : http://www.experts-exchange.com/M_248814.html EE4Free : http://www.experts-exchange.com/becomeAnExpert.jsp Zend Certified Engineer : http://zend.com/zce.php?c=ZEND002498&r=213474731 ZOPA : http://uk.zopa.com/member/RQuadling -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php