Префикс метода подчеркивания

Я изучал код CodeIgniter и CakePHP, и я заметил, что некоторые из методов в их классах имеют префикс с подчеркиванием _ или двойным подчеркиванием __ .

В чем цель этого?

В случае, если это не какой-либо из магических методов PHP , это означает, что Visibility не содержит правильных ключевых слов Видимости:

Соглашения о кодировании торта:

Поскольку мы не можем использовать частные и защищенные ключевые слова PHP5 для методов или переменных, мы соглашаемся на следующие правила:

  • Защищенный метод или имя переменной начинаются с одного символа подчеркивания («_»).
  • Имя частного метода или переменной начинается с двойного подчеркивания («__»).

Соглашения CodeIgniter :

Методы и переменные, которые доступны только внутри вашего класса, такие как служебные и вспомогательные функции, используемые вашими общественными методами для абстракции кода, должны иметь префикс с подчеркиванием.

Это магические методы в PHP-классах:

Имена функций __construct, __destruct, __call, __callStatic, __get, __set, __isset, __unset, __sleep, __wakeup, __toString, __invoke, __set_state и __clone являются волшебными в классах PHP. У вас не может быть функций с этими именами в любом из ваших классов, если вы не хотите, чтобы связанные с ними магические функции.

Метод с одним подчеркиванием не имеет особого значения. Это, скорее, некоторая конвенция кодирования проектов.

Это, вероятно, магические методы . Существует ряд тех методов, которые служат определенной цели (конструктор объекта, деструктор объекта, геттер, сеттер …)

PHP сохраняет префикс __ в именах функций для этих магических функций. Рекомендуется не определять функции с этим префиксом для любых других целей.

Обновление. Оба фреймворка, похоже, используют префикс __ для своих целей. См. Ответ @ Гордона.

В Codeigniter методы внутри контроллеров обычно можно назвать частью URL-адреса, поэтому вы можете вызвать метод «index» в контроллере «main» следующим образом:

mysite.com/main/index.

У вас также может быть метод внутри вашего контроллера, который вы не хотите, чтобы кто-то мог вызывать сегмент в URL-адресе, поэтому вы должны префикс его «_» (одно подчеркивание) .. это отличается от того, частный. Частные методы могут быть вызваны только в классе, где он определен. Таким образом, метод контроллера может иметь префикс с подчеркиванием, который сделал бы его невообразимым как сегмент URL, и его также можно было бы объявить частным, что сделало бы его непригодным для других классов.

Я не знаком с CakePHP или CodeIgniter, но я думаю, что их следует рассматривать как protected или private для классов, отличных от CakePHP. Они, вероятно, являются public поскольку их можно вызвать из других классов, что делает какой-то взлом. Обратите внимание, что __get , __construct и другие магические методы (как указано выше) существуют в PHP.

Методы, начинающиеся с __, являются магическими методами, которые автоматически вызываются в php. для дополнительной справки, проверки,

http://php.net/manual/en/language.oop5.magic.php

У меня есть прецедент для этого, это мое предпочтение. Я часто буду писать черты, предназначенные для соблюдения определенного интерфейса, хотя, поскольку черты не могут напрямую реализовать интерфейс, я укажу, какой интерфейс он удовлетворяет в комментарии блока док-кода, а также префикс защищенных и приватных методов, не связанных с интерфейсом с одним подчеркиванием. Это позволяет вам довольно легко следить за тем, какие методы предоставляются для удовлетворения контракта (интерфейса) и которые поддерживают методы. Например:

 interface Foo { public function bar(array $args = null, array $flags = null); } 

Цель ниже, чтобы удовлетворить требованиям интерфейса Foo , но для этого необходим только один из его методов. Для ясности защищенные методы имеют префикс. Даже если они будут опубликованы позже через расширение, это все еще указывает на то, что они не зависят от интерфейса по интерфейсу, и не следует полагать, что это что-то важное.

 /** * @satifies Foo */ trait FooTrait { public function bar(array $args = null, array $flags = null) { $this->_handleArgs($args); $this->_handleFlags($flags); } protected function _handleArgs(array $args = null) { if (is_null($args) { return; } //do something with the args } protected function _handleFlags(array $flags = null) { if (is_null($flags) { return; } //do something with the flags } } 

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

 final class ConcreteFoo implements Foo { use FooTrait; } 

Это существенно упрощает связь и позволяет легко интегрироваться с другими классами из других библиотек или фреймворков, для которых требуется цепочка наследования, без необходимости свертывать вашу логику с помощью группы классов адаптеров.


Моя IDE (Netbeans) ворчит об этом как о нарушении PSR-1. Поскольку PSR-1 не влияет непосредственно на выполнение, и можно утверждать, что это более читаемый подход или нет, я мог бы позаботиться о нем меньше. Я стараюсь следить за всеми PSR, которые влияют на выполнение.