source

PHP 컨스트럭터의 __construct() 대 SameAsClassName()

gigabyte 2023. 1. 22. 22:28
반응형

PHP 컨스트럭터의 __construct() 대 SameAsClassName()

'아예'를 사용하면 장점이 요?__construct()클래스 이름 대신 PHP에서 컨스트럭터 이름을 사용할 수 있습니까?

__construct

class Foo {
    function __construct(){
        //do stuff
    }
}

예(이름 있음):

class Foo {
    function Foo(){
        //do stuff
    }
}

「 」를 가지고 .__constructPHP 5는 PHP 5입니다.

클래스명과 같은 이름의 메서드를 컨스트럭터(두 번째 예)로 하는 것은 PHP 버전4부터 버전7까지 가능합니다.

기즈모에 동의해요, 반 이름을 바꾸면 이름을 바꿀 필요가 없다는 게 장점이에요.마른.

마찬가지로 자녀 클래스가 있는 경우

parent::__construct()

부모 컨스트럭터를 호출합니다.하위 클래스가 상속되는 클래스를 변경하는 트랙의 더 아래쪽에 있는 경우 부모에 대한 구성 호출을 변경할 필요가 없습니다.

사소한 것처럼 보이지만 컨스트럭터 호출 이름을 부모 클래스로 변경하지 않으면 미묘한 버그가 발생할 수 있습니다.

예를 들어, 상속권에 클래스를 삽입했지만 생성자 호출을 변경하는 것을 잊은 경우 부모 대신 조부모의 생성자를 호출할 수 있습니다.이로 인해 바람직하지 않은 결과가 발생할 수 있으며 이를 알아차리기 어려울 수 있습니다.

또, 주의해 주세요.

PHP 5.3.3부터는 이름 지정 클래스 이름의 마지막 요소와 이름이 같은 메서드는 더 이상 생성자로 취급되지 않습니다.이 변경은 이름 지정되지 않은 클래스에는 영향을 주지 않습니다.

출처 : http://php.net/manual/en/language.oop5.decon.php

__construct는 PHP5에서 도입되었습니다.그것이 지금 당신이 해야 할 방법이다.하지만 그 자체로는 어떤 이점도 알지 못합니다.

PHP 매뉴얼:

하위 호환성을 위해 PHP 5가 특정 클래스의 __construct() 함수를 찾을 수 없는 경우 클래스 이름으로 이전 스타일의 컨스트럭터 함수를 검색합니다.사실상 호환성 문제가 있는 유일한 경우는 클래스가 __construct()라는 이름의 메서드를 가지고 있을 때뿐입니다.이 메서드는 다른 의미에 사용됩니다.

PHP5를 사용하는 것을 합니다.__constructPHP가 다른 곳을 찾지 않도록 합니다.

__construct의 주요 장점은 클래스 이름을 변경해도 컨스트럭터의 이름을 변경할 필요가 없다는 것입니다.

오늘날, 받아들여지고 있는 대답은 구식이 되었다.

클래스 이름을 변경하는 것은 잘못된 방법입니다.새 버전으로 업그레이드할 때마다 이름을 변경할 항목과 위치를 기억해야 합니다.때로는 (반사 또는 복잡한 의존 구조를 사용하는 것과 같이) 급진적 리팩터링이 없으면 불가능할 수 있습니다.그리고 이것은 당신이 피하고 싶은 우연한 복잡함입니다.그것이 바로 네임스페이스가 PHP에 도입된 이유입니다.Java, C++ 또는 C# 사용 안 함__construct이름 있는 컨스트럭터를 사용하고 있기 때문에 문제 없습니다.

PHP 5.3.3부터는 이름 지정 클래스 이름의 마지막 요소와 이름이 같은 메서드는 더 이상 생성자로 취급되지 않습니다.변경은 이름 지정되지 않은 클래스에는 영향을 주지 않습니다.

namespace Foo;
class Test {
  var $a = 3;

  function Test($a) {
    $this->a = $a;
  }

  function getA() {
    return $this->a;
  }
}

$test = new Test(4);
echo $test->getA(); // 3, Test is not a constructor, just ordinary function

명명된 컨스트럭터는 폐지되지 않습니다(오늘날의 PHP 5.5).그러나 클래스가 네임스페이스에서 사용되지 않을 것이라고 예측할 수 없습니다. __construct미리 준비해야 합니다.

위에서 언급한 잘못된 관행에 대한 설명(Dennis의 경우)

코드 내 어딘가에서 ReflectionClass::getName()사용할 수 있습니다.클래스의 이름을 변경할 때는 Reflection을 사용한 장소를 기억하고 다음 중 어느 쪽을 사용하는지 확인해야 합니다.getName()결과는 여전히 앱에서 일관됩니다.특정 사항을 기억해야 할수록 앱에서 버그가 발생할 가능성이 높아집니다.

부모들은 자신들에게 의존하는 세상의 모든 수업을 통제할 수 없다.allow_url_include가 활성화되어 있는 경우 다른 웹에서 서버의 클래스를 사용하고 있을 수 있습니다.이러한 클래스의 이름을 변경하면 크래시가 발생할 수 있습니다.위에서 언급한 컴파일 언어에서는 더 심각합니다. 라이브러리를 다른 코드로 복사하고 번들할 수 있습니다.

클래스 이름을 변경해야 할 이유는 없습니다.

  • 클래스 이름이 충돌하는 경우 네임스페이스 사용
  • 학급 책임이 바뀌면, 대신 다른 반을 이끌어내라.

네임스페이스의 PHP 클래스에서는 같은 이름의 메서드는 피해야 합니다.직감적으로 클래스를 만든 오브젝트를 생성해야 합니다.다른 작업을 할 경우 같은 이름을 붙여야 하는 이유는 무엇입니까?그것은 건설자일 뿐 다른 것은 아니다.주요 문제는 이러한 방법의 동작이 네임스페이스 사용에 따라 달라진다는 것입니다.

PHP의 __constructure 컨스트럭터에는 문제가 없습니다.하지만 명명된 건설자를 바꾸는 것은 현명한 생각이 아니었다.

「 」를 사용하는 큰 __contruct()ClassName()이치노 부르는 게 요.parent::__construct()parent::ClassName()클래스 간에 재사용이 가능하고 부모도 쉽게 변경할 수 있기 때문입니다.

예에서는, 「」를 해 주세요.Foo::FooPHP 4 php php php php php php php 。PHP 4는 PHP 4입니다.

class Foo {
    // PHP 4 constructor
    function Foo(){
        //do stuff
    }
}

PHP 4 컨스트럭터는 폐지되지만 PHP 7에서는 삭제되지 않습니다.PHP 8에서는 더 이상 컨스트럭터로 간주되지 않습니다.미래의 호환성이 이 기능을 사용하지 않는 큰 이유입니다.

이 질문이 제기된 지 몇 년이 지났지만, 상황이 바뀌었기 때문에 이 질문에 답해야 할 것 같습니다. 그리고 앞으로 독자들을 위해 이 정보를 최신 상태로 유지하고 싶습니다!


따라서 php-7에서는 클래스와 같은 이름의 함수로 컨스트럭터를 만드는 옵션을 삭제합니다. 하면 '아까', '아까', '아까', '아까', '아까'가 요.E_DEPRECATED

이 제안(제안 접수)에 대한 자세한 내용은 https://wiki.php.net/rfc/remove_php4_constructors

그리고 여기서 인용하자면:

PHP 7PHP 4 컨스트럭터가 정의될 때마다 E_DEPRECED를 내보냅니다.메서드 이름이 클래스 이름과 일치하고 클래스가 네임스페이스에 없으며 PHP 5 컨스트럭터(_construct)가 존재하지 않으면 E_DEPRECATED가 출력됩니다.PHP 8은 E_DEPRECED 전송을 중지하고 메서드는 컨스트럭터로 인식되지 않습니다.

'아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.E_STRICT 메서드를 하면 php-7로 됩니다.__construct().

여기에서도 확인할 수 있습니다.

클래스와 같은 이름의 메서드가 존재하거나 __construct가 존재하는 경우에도 PHP 7은 E_STRICT 전송을 중지합니다.


도 꼭 하시길 권합니다.__construct()앞으로 문제가 줄어들 것이기 때문입니다.

PHP 5 의 5 php php php 는 php 는 php 는 php php php 。.__construct 않은 , ,, 그, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음 의 이름으로 시공자를 찾습니다.className__construct이름으로 생성자를 검색할 필요가 없습니다.className.

상위 호환성하위 호환성을 위해 언어에 남겨진 레거시 코드가 향후 버전에서 삭제될 가능성이 항상 있습니다.

메서드 __construct와 SameAsClassName 메서드가 있는 경우 __construct가 실행되며 SameAsClassName 메서드는 건너뜁니다.

나는 그것이 언어 관습 때문이라고 생각한다.다른 사람처럼 행동하도록 언어를 강요할 필요는 없습니다.

예를 들어 Objective-C에서는 컨스트럭터 앞에 -init을 붙입니다.클래스 이름을 사용하여 직접 컨스트럭터를 만들 수 있는데, 그 이유는 무엇입니까?언어 표기법 대신 이 스키마를 사용하는 이유가 있나요?

언급URL : https://stackoverflow.com/questions/217618/construct-vs-sameasclassname-for-constructor-in-php

반응형