Re: Enforce a constant in a class.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



'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


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux