Как обстоят дела с лидирующим подчеркиванием в методах класса PHP? - PullRequest
145 голосов
/ 19 марта 2009

Просматривая различные библиотеки PHP, я заметил, что многие люди предпочитают префикс некоторых методов класса с одним подчеркиванием, например

public function _foo()

... вместо ...

public function foo()

Я понимаю, что в конечном итоге это сводится к личным предпочтениям, но мне было интересно, кто-нибудь имел некоторое представление о том, откуда эта привычка.

Я думаю, что он, вероятно, перенесен из PHP 4, прежде чем методы класса могли быть помечены как защищенные или частные, что подразумевает "не вызывайте этот метод извне класса". Однако мне также пришло в голову, что, возможно, это происходит где-то (на языке), с которым я не знаком, или что за этим могут быть веские доводы, которые мне было бы полезно узнать.

Любые мысли, идеи и / или мнения будут оценены.

Ответы [ 13 ]

144 голосов
/ 19 марта 2009

Это из плохих старых времен объектно-ориентированного PHP (PHP 4). Эта реализация ОО была довольно плохой и не включала в себя такие вещи, как частные методы. Чтобы компенсировать это, разработчики PHP предвосхитили методы, которые должны были быть приватными, с подчеркиванием. В некоторых старших классах вы увидите /**private*/ __foo() {, чтобы придать ему дополнительный вес.

Я никогда не слышал о том, чтобы разработчики предваряли все свои методы подчеркиванием, поэтому я не могу объяснить, что вызывает это.

71 голосов
/ 12 июня 2009

Я полагаю, что наиболее авторитетным источником таких соглашений для PHP сейчас является PSR-2: Руководство по стилю кодирования , поскольку Zend Framework является частью PSR :

Имена свойств НЕ ДОЛЖНЫ иметь префикс с одним подчеркиванием для обозначения защищенной или приватной видимости.

40 голосов
/ 30 сентября 2013

Теперь, в 2013 году, это «официально» плохой стиль согласно руководству по кодированию PSR-2:

Имена свойств НЕ ДОЛЖНЫ иметь префикс с одним подчеркиванием для обозначения защищенной или приватной видимости`

Источник: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md

13 голосов
/ 09 апреля 2012

Я был категорически против префикса закрытых / защищенных методов с подчеркиванием, поскольку вы можете использовать для этого ключевое слово private / protected и IDE пометит его для вас.

И я до сих пор, но я нашел одну причину, почему это может быть хорошей практикой. Представьте, что у вас есть открытый метод addFoo(), и внутри этого метода у вас есть некоторая часть задачи, которая является общей с другими методами addFooWhenBar(), addFooWhenBaz() ... Теперь лучшее имя для этого общего метода будет addFoo(), но оно уже занято, поэтому вы должны придумать какое-нибудь уродливое имя, например addFooInternal() или addFooCommon() или ... но _addFoo() закрытый метод выглядит лучше всего.

12 голосов
/ 19 марта 2009

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

9 голосов
/ 20 марта 2009

Я использую лидирующее подчеркивание в классе PHP 5, который я пишу для частных методов. Это небольшая визуальная подсказка для разработчика, что конкретный член класса является частным. Этот тип подсказок не так полезен при использовании IDE, которая различает общедоступных и закрытых участников. Я взял это из моих дней C #. Старые привычки ...

5 голосов
/ 19 марта 2009

Я полагаю, что ваше первоначальное предположение было верным, я обнаружил, что для некоторых языков обычной практикой является добавление подчеркивания к методам / элементам и т. Д., Которые должны быть приватными для "объекта". Просто визуальный способ сказать, хотя вы можете, вы не должны называть это!

4 голосов
/ 30 декабря 2016

Я искал тот же ответ, я провел некоторое исследование, и я только что обнаружил, что php-фреймворки предлагают разные стили:

Кодовый воспламенитель

В официальном руководстве есть раздел стиля кодирования , который поощряет эту практику :

Частные методы и переменные

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

public function convert_text()

private function _convert_text()

Другие фреймворки делают то же самое, как

CakePHP:

делает то же самое :

Член видимости

Используйте приватные и защищенные ключевые слова PHP5 для методов и переменных. Кроме того, непубличные имена методов или переменных начинаются с одного подчеркивания (_). Пример:

class A
{
    protected $_iAmAProtectedVariable;

    protected function _iAmAProtectedMethod()
    {
       /* ... */
    }

    private $_iAmAPrivateVariable;

    private function _iAmAPrivateMethod()
    {
        /* ... */
    }
}

А также

Груша

делает то же самое :

Частным ученикам предшествует одно подчеркивание. Например:

$_status    _sort()     _initTree()

Пока

Drupal

стиль кода специально предупреждает об этом :

  1. Защищенные или закрытые свойства и методы не должны использовать префикс подчеркивания.

симфония

с другой стороны, объявляет :

Symfony следует стандартам, определенным в документах PSR-0, PSR-1, PSR-2 и PSR-4.

4 голосов
/ 08 апреля 2010

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

Я не знаю, является ли это все еще соглашением для использования в python, хотя

3 голосов
/ 07 мая 2014

Drupal, и с использованием подчеркивания:

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

function mymodule_tool($sting="page title"){
    $out ='';
    //do stuff 
    $out  .= _mymodule_tool_decor($sting);
    return $out;
}

function _mymodule_tool_decor($sting){
    return '<h1>'.$string.'</h1>';
}

Конечно, простой пример ...

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