Какова сделка с ведущим подчеркиванием в методах класса PHP?

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

public function _foo() 

…вместо…

 public function foo() 

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

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

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

Solutions Collecting From Web of "Какова сделка с ведущим подчеркиванием в методах класса PHP?"

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

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

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

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

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

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

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

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

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

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

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

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

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

Я не знаю, является ли это еще конвенцией для использования в python, хотя

В Drupal (php CMS) подчеркивания могут использоваться для предотвращения вызова крючков ( https://api.drupal.org/api/drupal/includes!module.inc/group/hooks/7 ).

Если у меня есть модуль под названием «my_module» и вы хотите назвать функцию my_module_insert, он «зацепился» за функцию hook_insert. Чтобы я не мог переименовать свою функцию в _my_module_insert.

ps Путь крючков работает в Drupal, можно реализовать крючок по ошибке, что очень плохо.

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>'; } 

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

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

Код зажигания

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

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

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

 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.

Используя подчеркивание только для того, чтобы запомнить цель, мы не будем «изменять переменную» / «вызывать функцию» вне класса.

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

Их называют «магическими методами» .