2017-02-05 7 views
1

Рассмотрите ситуацию, когда есть несколько классов, все из которых должны иметь доступ к механизму хранения конфигурации, но не могут быть расширены из базового класса из-за архитектуры структуры. В дополнение к этому я хотел, чтобы механизм хранения был гибким (можно позже переключить сервер хранения).Можно ли вызвать статическую функцию из свойства вне класса?

Я чувствовал, что это имело бы смысл создать черт, которая делает реальную экономию и использовать эти функции внутри всех классов (для примера я использую $_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)?

ответ

0

Если у вас есть черта, вы решили сделать множественное наследование один раз, возможно, для нескольких классов. В противном случае это избыточное объявление, и вы должны использовать класс. Фактически, и существующий признак означает его использование.

Если у вас есть статическая функция внутри черты, то почему вы не можете использовать ее из класса, в котором вы использовали черту?

trait MyTrait { 
static myFunc() {} 
} 

class ThatUsingMyTrait { 
use MyTrait; 
} 

// pretend below a code where you want to use the trait. 
if(ThatUsingMyTrait::myFunc()) { 
// do something 
} 

Код также может быть классом, который вы хотите реализовать без признаков напрямую.

Надеюсь, я понимаю идею с пониманием.

+0

Очень хорошо работает в классах. И я действительно мог бы создать класс, который использует черту. Фактический вопрос заключается в том, что мне разрешено использовать 'MyTrait :: setting_enabled()' вне класса. Он работает, но я не смог найти документацию о том, является ли это ошибкой или функцией. – Neograph734

+0

Я думаю, что это не ошибка. Определение на [php.net] (http://php.net/manual/en/language.oop5.traits.php) звучит так: «A Trait похож на класс, но предназначен только для группировки функциональности в порядке -годовалый и последовательный путь ». Вы не можете создать черту, но поскольку она похожа на класс во всех других функциях, черта должна обрабатывать все другие действия сама по себе. И еще раз, идея угла, если вы можете скопировать и вставить код из одного класса в другой, то у вас есть кандидат на предмет. –

+0

Спасибо, я полагаю, что это полезно для использования. – Neograph734