Просматривая различные библиотеки PHP, я заметил, что многие люди предпочитают префикс некоторых методов класса с одним подчеркиванием, например
public function _foo()
...вместо того...
public function foo()
Я понимаю, что в конечном итоге это сводится к личным предпочтениям, но мне было интересно, кто-нибудь имел некоторое представление о том, откуда эта привычка.
Я думаю, что это, вероятно, перенесено из PHP 4, прежде чем методы класса могут быть помечены как защищенные или частные, как способ "не вызывать этот метод извне класса". Тем не менее, мне также пришло в голову, что, возможно, это происходит где-то (язык), с которым я не знаком, или что за этим могут быть веские доводы, которые мне было бы полезно узнать.
Любые мысли, идеи и / или мнения будут оценены.
php
coding-style
nocash
источник
источник
Ответы:
Это из плохих старых времен объектно-ориентированного PHP (PHP 4). Эта реализация ОО была довольно плохой и не включала в себя такие вещи, как частные методы. Чтобы компенсировать это, разработчики 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
источник
PSR-2
-> «НЕ ДОЛЖЕН» означает «НЕ РЕКОМЕНДУЕТСЯ» не запрещено. Это означает, что в некоторых случаях это может быть приемлемо. PSR Doc -> ietf.org/rfc/rfc2119.txtЯ был категорически против префикса закрытых / защищенных методов с подчеркиванием, поскольку вы можете использовать ключевое слово private / protected для этого, и IDE пометит его для вас.
И я до сих пор, но я нашел одну причину, почему это может быть хорошей практикой. Представьте, что у вас есть публичный метод,
addFoo()
и внутри этого метода у вас есть некоторая часть задачи, которая является общей с другими методамиaddFooWhenBar()
,addFooWhenBaz()
... Теперь лучшее имя для этого общего метода будетaddFoo()
, но оно уже занято, поэтому вы должны придумать безобразное имя какaddFooInternal()
илиaddFooCommon()
или ... но_addFoo()
закрытый метод выглядит как лучший.источник
Основные подчеркивания обычно используются для частных свойств и методов . Не метод, который я обычно использую, но остается популярным среди некоторых программистов.
источник
Я использую ведущие подчеркивания в классе PHP 5, который я пишу для частных методов. Это небольшая визуальная подсказка для разработчика, что конкретный член класса является частным. Этот тип подсказок не так полезен при использовании IDE, в которой для вас различаются открытые и закрытые члены. Я взял это из моих дней C #. Старые привычки ...
источник
Я полагаю, что ваше первоначальное предположение было верным, я обнаружил, что для некоторых языков обычной практикой является добавление подчеркивания к методам / элементам и т. Д., Которые должны быть приватными для «объекта». Просто визуальный способ сказать, хотя вы можете, вы не должны называть это!
источник
Я искал тот же ответ, я провел небольшое исследование и обнаружил, что фреймворки php предлагают разные стили:
Кодовый Воспламенитель
Официальное руководство имеет раздел стиля кодирования, который поощряет эту практику :
Другие рамки делают то же самое, как
CakePHP:
делает то же самое :
А также
ГРУША
делает то же самое :
Пока
Drupal
Стиль кода специально предупреждает об этом :
симфония
с другой стороны, заявляет :
источник
Я знаю это из 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, и с помощью подчеркивания:
В общем, подчеркивание состоит в том, чтобы просто отметить тот факт, что функция, вероятно, будет вызываться только связанной родительской функцией ...
Конечно, просто простой пример ...
источник
Используя подчеркивание просто для запоминания цели, мы не будем «модифицировать переменную» / «вызывать функцию» вне класса.
Мы объявляем переменные const заглавными буквами, чтобы, увидев имя переменной, можно было догадаться, что это переменная const. Подобно переменной, которую мы не хотим изменять вне класса, мы объявляем ее с подчеркиванием для нашего собственного соглашения.
источник
Их называют "магическими методами" .
источник
_foo()
с единственным начальным подчеркиванием не является магическим методом. Магические методы обозначаются двумя последовательными ведущими подчеркиваниями. Вопрос здесь говорит только об одном.