IT

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

lottoking 2020. 6. 11. 08:06
반응형

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


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

public function _foo()

...대신에...

public function foo()

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

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

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


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

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


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

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


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

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

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


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

그리고 나는 여전히 그렇습니다. 그러나 그것이 좋은 습관이 될 수있는 한 가지 이유를 찾았습니다. 공용 방법을 가지고 상상 addFoo()그 방법 내에서 다른 방법으로 일반적인 작업의 일부가 addFooWhenBar(), addFooWhenBaz()그 일반적인 방법이 될 것를 위해 ... 자, 최선의 이름은 addFoo()당신이 어떤 마련되어야하므로 있지만 이미 촬영 못생긴 이름은 addFooInternal()or addFooCommon()또는 ...이지만 _addFoo()개인 방법은 가장 좋은 방법입니다.


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


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


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


나는 같은 대답을 찾고 있었고, 조사를 해왔으며, 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. Protected or private properties and methods should not use an underscore prefix.

Symphony

on the other hand, declares:

Symfony follows the standards defined in the PSR-0, PSR-1, PSR-2 and PSR-4 documents.


I know it from python, where prefixing your variables with an underscore causes the compiler to translate some random sequence of letters and numbers in front of the actual variable name. This means that any attempt to access the variable from outside the class would result in a "variable undefined" error.

I don't know if this is still the convention to use in python, though


In Drupal (a php CMS) underscores can be used to prevent hooks from being called (https://api.drupal.org/api/drupal/includes!module.inc/group/hooks/7).

If I have a module called "my_module" and want to name a function my_module_insert it would "hook" on the function hook_insert. To prevent that I can rename my function to _my_module_insert.

ps The way hooks works in Drupal it's possible to implement a hook by mistake, which is very bad.


Drupal, and using underscore:

In a general way the underscore is to simple mark the fact that a function would probably only be called by a related parent function...

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

Of course, just a simple example...


Using underscore in just for remembering purpose that we will not 'modify the variable'/'call the function' outside the class.

As we declare const variables in all uppercase so that while seeing the name of variable can guess that it is a const variable. Similar the variable that we don't want to modify outside the class, we declare it with underscore for our own convention.


They are called "magic methods".

참고URL : https://stackoverflow.com/questions/663350/whats-the-deal-with-a-leading-underscore-in-php-class-methods

반응형