Подчеркнуть префикс метода - PullRequest
5 голосов
/ 21 сентября 2010

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

Какова цельэтого?

Ответы [ 7 ]

12 голосов
/ 21 сентября 2010

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

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

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

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

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

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

1 голос
/ 24 мая 2013

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

mysite.com / основной / индекс.

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

1 голос
/ 21 сентября 2010

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

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

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

1 голос
/ 21 сентября 2010

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

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

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

0 голосов
/ 15 ноября 2017

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

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, которые напрямую влияют на исполнение.

0 голосов
/ 21 сентября 2010

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

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

0 голосов
/ 21 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...