Какая сделка с ведущим подчеркиванием в методах класса PHP?
При просмотре различных библиотек PHP я заметил, что многие люди предпочитают префикс некоторых методов класса с единственным подчеркиванием, например
public function _foo()
... вместо...
public function foo()
Я понимаю, что в конечном итоге это сводится к личным предпочтениям, но мне было интересно, есть ли у кого-нибудь представление о том, откуда эта привычка.
Моя мысль заключается в том, что она, вероятно, переносится с PHP 4, прежде чем методы класса могут быть помечены как защищенные или закрытые, как способ подразумевать "не вызывать этот метод извне класса". Однако мне также пришло в голову, что, возможно, это происходит где-то (язык), с которым я не знаком, или что могут быть хорошие рассуждения позади этого, что я мог бы получить от знания.
Любые мысли, идеи и/или мнения будут оценены.
Ответы
Ответ 1
Это из плохих старых дней объектно-ориентированного PHP (PHP 4). Эта реализация OO была довольно плоха и не включала такие вещи, как частные методы. Чтобы компенсировать, PHP-разработчики предусмотрели методы, которые должны были быть закрытыми с подчеркиванием. В некоторых старых классах вы увидите /**private*/ __foo() {
, чтобы придать ему дополнительный вес.
Я никогда не слышал о том, чтобы разработчики превзошли все свои методы с помощью подчеркивания, поэтому я не могу начать объяснять, что вызывает это.
Ответ 2
Я считаю, что самым авторитетным источником для этих видов соглашений для PHP сейчас будет PSR-2: Руководство по стилю кодирования, потому что Zend Framework является частью PSR:
Имена свойств НЕ ДОЛЖНЫ иметь префикс с единственным подчеркиванием для указания защищенной или частной видимости.
Ответ 3
Теперь, в 2013 году, это "официально" плохой стиль по руководству по кодированию PSR-2:
Имена свойств НЕ ДОЛЖНЫ иметь префикс с единственным подчеркиванием для указания защищенной или частной видимости `
Источник: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md
Ответ 4
Ведущие подчеркивания обычно используются для частных свойств и методов. Не метод, который я обычно использую, но по-прежнему популярен среди некоторых программистов.
Ответ 5
Я был категорически против префикса частных/защищенных методов с помощью подчеркивания, так как для этого можно использовать ключевое слово private/protected, а IDE отметит его для вас.
И я до сих пор, но я нашел одну причину, почему это может быть хорошей практикой. Представьте, что у вас есть открытый метод addFoo()
, и внутри этого метода у вас есть часть задачи, которая является общей для других методов addFooWhenBar()
, addFooWhenBaz()
... Теперь лучшим именем для этого общего метода будет addFoo()
, но он уже принят, поэтому вы должны придумать какое-то уродливое имя, например addFooInternal()
или addFooCommon()
или..., но _addFoo()
частный метод выглядит как лучший.
Ответ 6
Я использую ведущее подчеркивание в классе PHP 5, который я пишу для частных методов. Это небольшой визуальный сигнал разработчику о том, что конкретный член класса является закрытым. Этот тип подсказок не так полезен при использовании среды IDE, которая выделяет для вас публичные и частные члены. Я взял его из своих дней С#. Старые привычки...
Ответ 7
Я считаю, что ваше первоначальное предположение было правильным, я обнаружил, что для некоторых языков обычной практикой является префикс подчеркивания методам/членам и т.д., которые должны быть закрыты для "объекта". Просто визуальный способ сказать, хотя вы можете, вы не должны называть это!
Ответ 8
Я знаю это из python, где префикс ваших переменных с подчеркиванием заставляет компилятор переводить некоторую случайную последовательность букв и цифр перед фактическим именем переменной.
Это означает, что любая попытка доступа к переменной извне класса приведет к ошибке "variable undefined".
Я не знаю, является ли это еще условным обозначением для использования в python, хотя
Ответ 9
В 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.
пс
Способ, которым крючки работают в Drupal, позволяет реализовать крючок по ошибке, что очень плохо.
Ответ 10
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>';
}
Конечно, просто простой пример...
Ответ 11
Я искал тот же ответ, я провел некоторое исследование, и я только что обнаружил, что фрэш-фреймы предлагают разные стили:
Идентификатор кода
В официальном руководстве есть раздел стиля кодирования, который поощряет эту практику:
Частные методы и переменные
Методы и переменные, которые доступны только внутренне, например, служебные и вспомогательные функции, используемые вашими общественными методами для абстракции кода, должны иметь префикс с подчеркиванием.
public function convert_text()
private function _convert_text()
Другие структуры делают то же самое, например
CakePHP:
делает то же самое:
Видимость членов
Использовать личные и защищенные ключевые слова PHP5 для методов и переменных. Кроме того, непубличные имена методов или переменных начинаются с одного символа подчеркивания (_). Пример:
class A
{
protected $_iAmAProtectedVariable;
protected function _iAmAProtectedMethod()
{
/* ... */
}
private $_iAmAPrivateVariable;
private function _iAmAPrivateMethod()
{
/* ... */
}
}
А также
PEAR
делает то же самое:
Частным членам класса предшествует одно подчеркивание. Например:
$_status _sort() _initTree()
Пока
Drupal
стиль кода специально предупреждает об этом:
- Защищенные или частные свойства и методы не должны использовать префикс подчеркивания.
Symphony
с другой стороны, объявляет:
Symfony следует стандартам, определенным в документах PSR-0, PSR-1, PSR-2 и PSR-4.
Ответ 12
Используя знак подчеркивания только для того, чтобы запомнить цель, мы не будем "изменять переменную" / "вызывать функцию" вне класса.
Как мы объявляем константные переменные во всех заглавных строках, чтобы при просмотре имени переменной можно было предположить, что это константная переменная. Подобная переменная, которую мы не хотим изменять вне класса, объявляем ее с подчеркиванием для нашего собственного соглашения.
Ответ 13
Они называются "магические методы" .