В чем дело с ведущим подчеркиванием в методах класса PHP?
просматривая различные библиотеки PHP, я заметил, что многие люди предпочитают префикс некоторых методов класса с одним подчеркиванием, например
public function _foo()
...вместо...
public function foo()
Я думаю, что это, вероятно, переносится с PHP 4, прежде чем методы класса могут быть помечены как защищенный или закрытый, как способ подразумевать "не вызывайте этот метод из-за пределов класса". Однако мне также пришло в голову, что, возможно, это происходит где-то (язык), с которым я не знаком, или что за этим могут быть хорошие рассуждения, которые мне было бы полезно знать.
любые мысли, идеи и/или мнения будут оценены.
14 ответов:
это из плохих старых дней объектно-ориентированного 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 методы с подчеркиванием, так как вы можете использовать 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!модуль.Инк/группа/крючки/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>'; }конечно, просто простой пример...
Я искал тот же ответ, я провел некоторое исследование, и я только что обнаружил, что 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
стиль кода в частности предупреждает об этом:
- защищенные или частные свойства и методы не следует использовать префикс подчеркивания.
Симфония
С другой стороны, объявляет:
Symfony следует стандартам, определенным в документах PSR-0, PSR-1, PSR-2 и PSR-4.
использование подчеркивания только для запоминания цели, что мы не будем "изменять переменную" / "вызывать функцию" вне класса.
поскольку мы объявляем переменные const во всех прописных буквах, чтобы при просмотре имени переменной можно было догадаться, что это переменная const. Аналогично переменной, которую мы не хотим изменять вне класса, мы объявляем ее с подчеркиванием для нашего собственного соглашения.
простое использование одинарного и двойного подчеркивание в классе PHP
class Name { /* Property */ private $_name; /* Construct */ function __construct($name) { $this->_setName($name); } /* Set */ private function _setName($name) { $this->_name = $name; } /* Get */ public function getName() { return $his->_name; } }
Они называются "магические методы".
Comments