Рассмотрите ситуацию, когда есть несколько классов, все из которых должны иметь доступ к механизму хранения конфигурации, но не могут быть расширены из базового класса из-за архитектуры структуры. В дополнение к этому я хотел, чтобы механизм хранения был гибким (можно позже переключить сервер хранения).Можно ли вызвать статическую функцию из свойства вне класса?
Я чувствовал, что это имело бы смысл создать черт, которая делает реальную экономию и использовать эти функции внутри всех классов (для примера я использую $_SESSION
в качестве системы хранения):
trait MyTrait {
function setting_enabled() {
return !empty($_SESSION['setting']) ? TRUE : FALSE;
}
function enable_setting() {
$_SESSION['setting'] = TRUE;
}
function disable_setting() {
$_SESSION['setting'] = FALSE;
}
}
Это прекрасно работает из классов , Однако есть и один файл, который не является классом, но представляет собой простой PHP, для которого мне также нужно знать, включен ли параметр.
Я попытался объявить функцию static
:
trait MyTrait {
static function setting_enabled() { // Declared as static function
return !empty($_SESSION['setting']) ? TRUE : FALSE;
}
...
}
И затем вызвать статическую функцию от признака, который работал хорошо.
if (MyTrait::setting_enabled()) {
...
}
Он, однако, чувствует себя не совсем правильно. С другой стороны, создание нового пустого класса, использующего черту и создающего экземпляр, чтобы получить значение, кажется большим количеством накладных расходов.
Могу ли я сделать это (начиная с PHP 5.6, но также учитывая будущее с PHP 7.x)?
Очень хорошо работает в классах. И я действительно мог бы создать класс, который использует черту. Фактический вопрос заключается в том, что мне разрешено использовать 'MyTrait :: setting_enabled()' вне класса. Он работает, но я не смог найти документацию о том, является ли это ошибкой или функцией. – Neograph734
Я думаю, что это не ошибка. Определение на [php.net] (http://php.net/manual/en/language.oop5.traits.php) звучит так: «A Trait похож на класс, но предназначен только для группировки функциональности в порядке -годовалый и последовательный путь ». Вы не можете создать черту, но поскольку она похожа на класс во всех других функциях, черта должна обрабатывать все другие действия сама по себе. И еще раз, идея угла, если вы можете скопировать и вставить код из одного класса в другой, то у вас есть кандидат на предмет. –
Спасибо, я полагаю, что это полезно для использования. – Neograph734