Re: Re: Enforce a constant in a class.
| From: | Richard Quadling | Date: | Tue, 26 Jan 2010 10:58:55 +0000 |
| Subject: | Re: Re: Enforce a constant in a class. | ||
| References: | 1 2 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-301467@lists.php.net to get a copy of this message | ||
2010/1/25 Colin Guthrie <gmane@colin.guthr.ie>:
> '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