Я хотел бы определить класс постоянное использование конкатенации существующей константы и строки. Я не могу предопределить его, потому что только скаляры позволяются для предопределения констант, таким образом, у меня в настоящее время есть он как часть моего конструктора с определенным () функция, проверяющая, определяется ли это уже. Это решение работы, но моя константа теперь излишне глобально.
Существует ли способ определить класс, постоянный во времени выполнения в php?
Спасибо.
См. Руководство PHP по константам класса
Значение должно быть константным выражением, а не (например) переменной, свойством, результатом математической операции или вызовом функции.
Другими словами, это невозможно. Вы можете сделать это с помощью runkit_constant_add , но подобные исправления для обезьяны категорически не рекомендуются.
Другой вариант - использовать волшебные методы __get () и __set () для отклонения изменений определенных переменных. Это не столько константа, сколько переменная только для чтения (с точки зрения других классов). Примерно так:
// Completely untested, just an idea
// inspired in part from the Zend_Config class in Zend Framework
class Foobar {
private $myconstant;
public function __construct($val) {
$this->myconstant = $val;
}
public function __get($name) {
// this will expose any private variables
// you may want to only allow certain ones to be exposed
return $this->$name;
}
public function __set($name) {
throw new Excpetion("Can't set read-only property");
}
}
Согласно ответу Гордона , вы не можете делать именно то, что хотите. Однако можно сделать что-то подобное. Вы можете установить его только один раз:
class MyClass
{
private static $myFakeConst;
public getMyFakeConst()
{
return self::$myFakeConst;
}
public setMyFakeConst($val)
{
if (!is_null(self::$myFakeConst))
throw new Exception('Cannot change the value of myFakeConst.');
self::$myFakeConst = $val;
}
}