У меня было решение в кодовой базе PHP 5.2, которое использовало отражение, чтобы получить константы подкласса от суперкласса, но я бы посоветовал не делать этого, если это не является абсолютно необходимым, потому что отражение - относительно дорогой инструмент в PHP с точки зренияпроизводительности.
PHP 5.3 ввел ключевое слово static как static :: CONST вместо self :: CONST для доступа к статическим членам класса.Я никогда не пробовал, но я верю, что он сможет делать то, что вам нужно.Посмотрите позднюю статическую привязку в руководстве по PHP.
Для записи вот код для метода, который использовал отражение, чтобы получить константу подкласса.
class SomeClass
{
/**
* Get reflection class for item
*
* Get a reflector for this item so that internal constants can be used for the permission checking
* functions. This is necessary because of how static binding works prior to PHP 5.3.
*
* @return ReflectionClass
*/
protected function getRef ()
{
if (!$this -> ref)
{
$this -> ref = new ReflectionClass ($this);
}
return ($this -> ref);
}
/**
* Check that the user has permission to create an item of the type this object represents
*
* @todo Use late static binding instead of reflection once PHP 5.3 becomes available on the server
* @return bool True if OK
*/
public function canCreate ()
{
$ref = $this -> getRef ();
if ($flag = $ref -> getConstant ('USR_FLAG_CREATE'))
{
return (self::$user -> permissions [$flag]);
}
}
}