PHP 클래스 메소드에서 밑줄로 처리하는 것은 무엇입니까?


155

다양한 PHP 라이브러리를 살펴보면서 많은 사람들이 다음과 같이 단일 클래스 밑줄로 일부 클래스 메소드를 접두어로 선택한다는 것을 알았습니다.

public function _foo()

...대신에...

public function foo()

나는 이것이 궁극적으로 개인 취향에 달려 있다는 것을 알고 있지만, 누군가 가이 습관이 어디서 왔는지에 대한 통찰력이 있는지 궁금합니다.

내 생각은 클래스 메소드가 "클래스 외부에서이 메소드를 호출하지 마십시오"를 암시하는 방식으로 클래스 메소드가 보호 또는 개인으로 표시되기 전에 PHP 4에서 전달 된 것입니다. 그러나 그것은 아마도 내가 익숙하지 않은 어딘가 (언어)에서 나왔거나 내가 알게되면 이익을 얻을 수있는 좋은 추론이있을 수 있습니다.

모든 생각, 통찰력 및 / 또는 의견을 부탁드립니다.


9
업데이트 2014 : 공식적으로 구식 구문 : github.com/php-fig/fig-standards/blob/master/accepted/…
Sliq

답변:


155

예전에는 Object Oriented PHP (PHP 4)가 나빴습니다. OO의 구현은 꽤 나빴으며 개인 메소드와 같은 것은 포함하지 않았습니다. 이를 보완하기 위해 PHP 개발자는 밑줄로 개인용으로 작성된 메소드를 소개했습니다. 일부 오래된 수업 /**private*/ __foo() {에서는 추가 무게를주는 것을 볼 수 있습니다.

개발자가 밑줄로 모든 방법을 미리 사용하는 것에 대해 들어 본 적이 없으므로 그 원인을 설명 할 수 없습니다.


12
클래스 전용이며 컨트롤러에서 라우팅되지 않는 컨트롤러의 메서드 앞에 밑줄을 넣습니다. 내 프레임 워크로 작업하기 때문에 경로 내의 컨트롤러 이름에 밑줄이없는 정책을 시행함에 따라 보안이 추가됩니다. 그러나 이것은 컨트롤러 당 1-2 가지 방법을 거의 초과하지 않습니다.
Robert K

6
관습 적으로 perl을 사용하면 밑줄로 시작하는 메소드는 개인용입니다. 그러나 그것은 단지 컨벤션 일뿐입니다. 실제로 이러한 메소드는 여전히 클래스 외부에서 액세스 할 수 있습니다.
Luc M

확장 클래스가 부모의 보호 된 메소드를 공개하기로 결정하면 밑줄은 더 의미가 없습니다. 가장자리 케이스이지만 발생합니다. API 개발자는 비공개 메소드를 공개로 공개 할 수도 있습니다. 즉, 액세스 수정자를 변경하는 것 외에도 메소드 이름을 리팩터링해야합니다. 그럼에도 불구하고 큰 문제는 없지만 귀찮은 일입니다.
Johan Fredrik Varen

요한-리팩토링이 귀찮은가? 내 편집기에는 "찾기 및 바꾸기"라는 기능이 있습니다. 잘 작동합니다!
DaveWalley

개인 멤버 앞에 정확히 하나의 밑줄을 붙이기 위해 사용할 수있는 C # 규칙입니다. 따라서 동일한 방식으로 Zend Framework 1 (2012)을 사용했습니다.
alpham8

73

Zend Framework가 PSR의 일부이기 때문에 PHP에 대한 이러한 종류의 규칙에 대한 가장 권위있는 소스는 PSR-2 : Coding Style Guide 라고 생각합니다 .

보호 또는 개인 가시성을 나타 내기 위해 속성 이름 앞에 단일 밑줄을 붙여서는 안됩니다.


9
명명 규칙을 사용하는 것이 언어를 사랑하는 이유는 아닙니다.
sepehr

4
내가 이것에 대해 처음 읽었을 때, 나는 당신이 방법을보고 그것이 공개인지 비공개인지 알 수 있도록 그 이유를 이해했습니다. 컨벤션보다는 요구 사항이라면 훨씬 더 의미가 있었을 것입니다. 팀의 프로그래머 1 명이 불필요한 곳에 밑줄을 추가하거나 밑줄을 사용하여 공개하면 많은 혼란이 생길 ​​수 있습니다. 결과적으로, 이것은 Jeremy가 지적한대로 PHP4에서 나 왔으며 & #ZF는 PEAR 규칙에 근거한 규칙을 기반으로합니다. PEAR가 그것을 제거했고 #ZF가 그 뒤를 따를 것이라고 믿습니다.
joedevon

이 대답은 맞습니다. 그것은 마젠 토의 지독한 곳이며, 아래 Sliq에서 언급했듯이 일반적으로 사용되지 않는 규칙입니다.
siliconrockstar

여기에 관한 업데이트 된 링크가 있습니다. framework.zend.com/manual/1.12/ko/…
셰이프 쉬프터

FYI (및 @joedevon) Zend 2.4는 몇 달 전에 출시되었으며 여전히 개인 및 보호 된 framework.zend.com/manual/current/en/ref/…에 밑줄을 사용합니다 .
James

40

이제 2013 년에 이것은 PSR-2 코딩 지침에 따라 "공식적으로"나쁜 스타일입니다 .

보호 또는 개인 가시성을 나타 내기 위해 속성 이름 앞에 단일 밑줄을 붙여서는 안됩니다.

출처 : https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md


6
PSR-2-> "SHOULD NOT" 에 따르면 "권장하지 않음"은 금지되지 않음을 의미합니다. 경우에 따라 허용 될 수도 있습니다. PSR Doc-
ahmed hamdy

14

개인 / 보호 된 키워드를 밑줄로 접두어로 사용하지 않았으므로 개인 / 보호 된 키워드를 사용할 수 있으므로 IDE가 표시합니다.

그리고 나는 여전히 그렇습니다. 그러나 그것이 좋은 습관이 될 수있는 한 가지 이유를 찾았습니다. 공용 메소드를 가지고 addFoo()있고 그 메소드 내부에 다른 메소드와 공통되는 작업의 일부 가 있다고 상상해보십시오 addFooWhenBar(). addFooWhenBaz()...이 공통 메소드의 가장 좋은 이름은 addFoo()이지만 이미 사용되었으므로 이미 일부를 생각해 냈습니다. 추악한 이름은 addFooInternal()or addFooCommon()또는 ...이지만 _addFoo()개인 방법은 가장 좋습니다.


예, 동의했습니다. 나는 실제로 거의 사용하지 않았기 때문에 다른 사람들이 밑줄에 대해 어떻게 생각하는지 보려고 여기에 왔으며 항상 잘못 느꼈지만이 예는 내가 한 번입니다. 또한 공용 메서드가 자식이 재정의 한 추상 보호 메서드를 호출하는 템플릿 메서드 패턴의 경우에 대해서도 사용했습니다. 이는 비슷한 아이디어입니다. 때로는 공개 메소드와 호출하는 추상 보호 메소드가 너무 유사하거나 관련되어 있기 때문에 이름을 다르게 지정하는 것보다 추상적 인 이름을 다르게하는 것보다 이상하게 보입니다.
John Pancoast

12

선행 밑줄은 일반적으로 개인 속성 및 방법에 사용 됩니다. 내가 일반적으로 사용하는 기술은 아니지만 일부 프로그래머에게 인기가 있습니다.


10

개인 메소드를 위해 작성한 PHP 5 클래스에서 밑줄을 사용합니다. 특정 클래스 멤버가 비공개라는 것은 개발자에게 작은 시각적 신호입니다. 이 유형의 힌트는 공용 및 개인 구성원을 구별하는 IDE를 사용할 때 유용하지 않습니다. 나는 C # 일에서 그것을 집어 들었다. 오래된 습관 ...


5

나는 당신의 원래 가정이 맞았다 고 생각합니다. 나는 어떤 언어들이 "객체"에 비공개로 유지되어야하는 메소드 / 멤버들에 밑줄을 붙이는 것이 일반적인 관행이라는 것을 알았습니다. 비록 당신이 할 수는 있지만 시각적 인 방법으로, 당신은 이것을 호출해서는 안됩니다!


5

나는 같은 대답을 찾고 있었고, 조사를 해왔으며, 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()

동안

드루팔

코드 스타일은 특히 이것에 대해 경고합니다 .

  1. 보호 또는 개인 속성 및 메서드는 밑줄 접두사를 사용해서는 안됩니다.

교향곡

반면에 다음과 같이 선언합니다 .

Symfony는 PSR-0, PSR-1, PSR-2 및 PSR-4 문서에 정의 된 표준을 따릅니다.


매우 철저한 답변.
colonelclick

4

파이썬에서 그것을 알고 있습니다. 변수에 밑줄을 붙이면 컴파일러가 실제 변수 이름 앞에서 임의의 문자와 숫자 시퀀스를 번역합니다. 즉, 클래스 외부에서 변수에 액세스하려고하면 "변수 정의되지 않음"오류가 발생합니다.

이것이 여전히 파이썬에서 사용하는 규칙인지는 모르겠습니다.


3

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에서 후크가 작동하는 방식은 실수로 후크를 구현하는 것이 가능합니다.


1
나는 그것이 한동안 drupal의 디자인 결함이라고 생각했습니다. 혼란과 불규칙한 작동을 방지하기 위해 후크를 명시 적으로 등록하는 것이 더 합리적입니다. 가정은 일반적으로 나쁜 일이며 일반적인 프로그래밍을 방해하거나 가로채는 구조는 일반적으로 열악한 아키텍처입니다.
mopsyd November

3

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

물론 간단한 예일뿐입니다.


0

클래스 외부에서 '변수 수정'/ '함수 호출'을하지 않을 것이라는 점을 기억하기 위해 밑줄을 사용합니다.

const 변수를 모두 대문자로 선언하면 변수의 이름을 보면서 const 변수라고 추측 할 수 있습니다. 클래스 외부에서 수정하고 싶지 않은 변수와 마찬가지로 자체 규칙에 따라 밑줄로 선언합니다.


"const variables"는 무엇을 의미합니까? 변수 상수를 어떻게 정의 할 수 있습니까?
Nico Haase 2012

-21

이를 "마법 방법"이라고 합니다.


39
_foo()단일 밑줄이있는 것은 마술 방법이 아닙니다. 마술 방법은 두 개의 연속적인 밑줄 로 표시됩니다 . 여기서 질문은 하나에 대해서만 이야기합니다.
BoltClock
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.