Przeglądając różne biblioteki PHP, zauważyłem, że wiele osób decyduje się na poprzedzanie niektórych metod klasowych pojedynczym podkreśleniem, na przykład
public function _foo()
...zamiast...
public function foo()
Zdaję sobie sprawę, że ostatecznie sprowadza się to do osobistych preferencji, ale zastanawiałem się, czy ktoś ma jakiś wgląd w to, skąd pochodzi ten nawyk.
Wydaje mi się, że jest to prawdopodobnie przenoszone z PHP 4, zanim metody klasowe mogłyby zostać oznaczone jako chronione lub prywatne, w celu zasugerowania „nie wywołuj tej metody spoza klasy”. Jednak przyszło mi również do głowy, że może pochodzi skądś (język), którego nie znam lub że może kryć się za tym rozsądne uzasadnienie, którego znajomość przyniosłaby mi korzyści.
Wszelkie przemyślenia, spostrzeżenia i / lub opinie będą mile widziane.
źródło
Odpowiedzi:
Pochodzi ze złych, starych czasów Object Oriented PHP (PHP 4). Ta implementacja OO była dość zła i nie obejmowała rzeczy takich jak metody prywatne. Aby to zrekompensować, programiści PHP poprzedzili metody, które miały być prywatne, podkreśleniem. W niektórych starszych klasach zobaczysz,
/**private*/ __foo() {
jak nadać mu trochę wagi.Nigdy nie słyszałem o programistach poprzedzających wszystkie swoje metody podkreśleniami, więc nie mogę zacząć wyjaśniać, co to powoduje.
źródło
Uważam, że obecnie najbardziej miarodajnym źródłem tego rodzaju konwencji PHP byłby PSR-2: Przewodnik po stylach kodowania, ponieważ Zend Framework jest częścią PSR :
źródło
Teraz, w 2013 roku, jest to „oficjalnie” zły styl według wytycznych kodowania PSR-2:
Źródło: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md
źródło
PSR-2
-> „NIE POWINIENEŚ” oznacza „NIE POLECAĆ” nie jest zabronione To oznacza w niektórych przypadkach może być akceptowalne. PSR Doc -> ietf.org/rfc/rfc2119.txtByłem zdecydowanie przeciwny dodawaniu przedrostków do metod prywatnych / chronionych podkreśleniem, ponieważ możesz użyć do tego słowa kluczowego private / protected, a IDE oznaczy je za Ciebie.
I nadal jestem, ale znalazłem jeden powód, dla którego może to być dobra praktyka. Wyobraź sobie, że masz sposób publiczny
addFoo()
i wewnątrz tej metodzie masz jakąś część zadania, która jest wspólna z innymi metodamiaddFooWhenBar()
,addFooWhenBaz()
... teraz, że najlepszą nazwą stosowaną metodą byłobyaddFoo()
, ale to jest już zajęta, więc trzeba wymyślić jakiś brzydka nazwa jakaddFooInternal()
lubaddFooCommon()
lub ... ale_addFoo()
metoda prywatna wygląda na najlepszą.źródło
Podkreślenia wiodące są zwykle używane w przypadku prywatnych nieruchomości i metod . Nie jest to technika, którą zwykle stosuję, ale pozostaje popularna wśród niektórych programistów.
źródło
Używam wiodącego podkreślenia w klasie PHP 5, którą piszę dla metod prywatnych. Jest to mała wizualna wskazówka dla programisty, że dany element klasy jest prywatny. Ten typ podpowiedzi nie jest tak przydatny, gdy używasz IDE, które rozróżnia członków publicznych i prywatnych. Podniosłem to z moich dni C #. Stare zwyczaje...
źródło
Uważam, że twoje pierwotne założenie było słuszne. Zauważyłem, że w niektórych językach powszechną praktyką jest dodawanie znaku podkreślenia do metod / elementów itp., Które mają pozostać prywatne w stosunku do „obiektu”. To tylko wizualny sposób na powiedzenie, chociaż możesz, nie powinieneś tego nazywać!
źródło
Szukałem tej samej odpowiedzi, przeprowadziłem kilka badań i właśnie odkryłem, że frameworki php sugerują różne style:
Code Igniter
Oficjalny podręcznik zawiera sekcję dotyczącą stylu kodowania, która zachęca do tej praktyki :
Inne frameworki robią to samo, na przykład
Cakephp:
robi to samo :
I również
GRUSZKA
robi to samo :
Podczas
Drupal
styl kodu specjalnie ostrzega przed tym :
Symfonia
z drugiej strony oświadcza :
źródło
Znam to z Pythona, gdzie poprzedzanie zmiennych podkreśleniem powoduje, że kompilator tłumaczy pewną losową sekwencję liter i cyfr przed rzeczywistą nazwą zmiennej. Oznacza to, że każda próba uzyskania dostępu do zmiennej spoza klasy spowodowałaby błąd „zmienna niezdefiniowana”.
Nie wiem jednak, czy nadal jest to konwencja używana w Pythonie
źródło
W Drupalu (php CMS) podkreślenia mogą być używane do zapobiegania wywoływaniu hooków ( https://api.drupal.org/api/drupal/includes!module.inc/group/hooks/7 ).
Jeśli mam moduł o nazwie „my_module” i chcę nazwać funkcję my_module_insert, zostanie to „zaczepione” o funkcję hook_insert. Aby temu zapobiec, mogę zmienić nazwę mojej funkcji na _my_module_insert.
ps Sposób działania hooków w Drupalu umożliwia omyłkowe zaimplementowanie hooków, co jest bardzo złe.
źródło
Drupal i używanie podkreślenia:
Ogólnie rzecz biorąc, podkreślenie ma na celu proste zaznaczenie faktu, że funkcja byłaby prawdopodobnie wywoływana tylko przez powiązaną funkcję nadrzędną ...
Oczywiście tylko prosty przykład ...
źródło
Używanie podkreślenia tylko w celu zapamiętania, że nie będziemy „modyfikować zmiennej” / „wywoływać funkcji” poza klasą.
Ponieważ deklarujemy zmienne const pisane dużymi literami, dzięki czemu widząc nazwę zmiennej można się domyślić, że jest to zmienna const. Podobnie jak zmienna, której nie chcemy modyfikować poza klasą, deklarujemy ją z podkreśleniem dla naszej własnej konwencji.
źródło
Nazywa się je „metodami magicznymi” .
źródło
_foo()
z jednym początkowym podkreśleniem nie jest metodą magiczną. Metody magiczne są oznaczone dwoma kolejnymi wiodącymi podkreśleniami. Pytanie dotyczy tylko jednego.