RE: [PHP] Visibility of class constant
| From: | Chris Scott | Date: | Tue, 03 Feb 2009 11:24:29 +0000 |
| Subject: | RE: [PHP] Visibility of class constant | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-287563@lists.php.net to get a copy of this message | ||
> -----Original Message-----
> From: leledumbo [mailto:leledumbo_cool@yahoo.co.id]
> Sent: 03 February 2009 05:03
> To: php-general@lists.php.net
> Subject: [PHP] Visibility of class constant
>
>
> I got a weird behaviour of class constant. Suppose I have
Index_Controller
> and Another_Controller classes, both extending Controller class. I
define
> some constants (let's assume I only have one, call it MY_CONST) in
> Controller class to be used by its descendants. In Index_Controller, I
can
> freely use MY_CONST without parent:: needed. However, this isn't the
case
> with Another_Controller. Without parent:: I got notice Use of
undefined
> constant MY_CONST - assumed 'MY_CONST'. How could this happen and
what's the
> correct behaviour? It's actually nicer to have it without parent::,
assuming
> that constants have protected visibility specifier (which isn't
possible
> AFAIK :-( ).
You cannot access a class constant just by the constant name. See
http://docs.php.net/manual/en/language.oop5.paamayim-nekudotayim.php.
you need to use self::MY_CONST, I guess; your code might make it
clearer.
e.g.
class Controller
{
const CONSTANT = 'foo<br />';
}
class Index_Controller extends Controller
{
public function __construct()
{
echo CONSTANT; echo '<br/>'; // gives warning
echo self::CONSTANT; // foo
echo parent::CONSTANT; // foo
}
}
class Another_Controller extends Controller
{
const CONSTANT = 'bar<br />';
public function __construct()
{
echo self::CONSTANT; // bar
echo parent::CONSTANT; // foo
}
}
new Index_Controller would give you the warning you described for
CONSTANT and return 'foo' for self::CONSTANT and parent::CONSTANT as
CONSTANT was inherited. In Another_Controller CONSTANT is overridden so
self::CONSTANT would be 'bar' and parent::CONSTANT would be 'foo'.