문제

사용하는 이점이 있습니까? __construct() PHP의 생성자의 클래스 이름 대신?

예시 (__construct):

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

예 (이름) :

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

가지고있다 __construct PHP 5 이후 방법 (첫 번째 예)가 가능합니다.

PHP 버전 4에서 버전 7까지 클래스와 동일한 이름을 가진 메소드 (두 번째 예)가 가능합니다.

도움이 되었습니까?

해결책

나는 Gizmo에 동의합니다. 장점은 클래스의 이름을 바꾸면 이름을 바꿀 필요가 없습니다. 마른.

마찬가지로 자식 수업이 있으면 전화 할 수 있습니다.

parent::__construct()

부모 생성자를 호출합니다. 트랙을 더 아래로 내려 가면 수업을 변경하면 어린이 클래스가 상속받는 수업을 변경하면 구성 호출을 부모에게 변경할 필요가 없습니다.

작은 것 같지만, 구성 자 호출 이름을 부모 수업으로 바꾸면 미묘한 (미묘하지 않은) 버그를 만들 수 있습니다.

예를 들어, 수업을 상속자에 삽입했지만 생성자 통화를 변경하는 것을 잊어 버린 경우 부모 대신 조부모의 건설자에게 전화하기 시작할 수 있습니다. 이것은 종종 바람직하지 않은 결과를 유발하여 눈치 채기 어려울 수 있습니다.

또한 주목하십시오

PHP 5.3.3 기준으로, 네임 스패닝 클래스 이름의 마지막 요소와 동일한 이름을 가진 메소드는 더 이상 생성자로 취급되지 않습니다. 이 변경은 이름이없는 클래스에 영향을 미치지 않습니다.

원천: http://php.net/manual/en/language.oop5.decon.php

다른 팁

__construct PHP5에 도입되었습니다. 그것은 당신이 지금 그것을 해야하는 방식입니다. 나는 아무것도 모른다 장점 그래도 그 자체.

PHP 매뉴얼에서 :

거꾸로 호환되는 경우, PHP 5가 주어진 클래스에 대해 __construct () 함수를 찾을 수 없다면 클래스 이름으로 구식 생성자 함수를 검색합니다. 효과적으로, 호환성 문제가있는 유일한 경우는 클래스에 다른 의미론에 사용 된 __construct ()라는 메소드가있는 경우입니다.

PHP5에 있다면 사용하는 것이 좋습니다 __construct PHP가 다른 곳에서 보이지 않도록합니다.

__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 미리 정리해야합니다.

위에서 언급 한 나쁜 관행에 대한 설명 (데니스를 위해)

코드 어딘가에 사용할 수 있습니다 reflectionClass :: getName (); 클래스의 이름을 바꾸면 반사를 사용한 위치를 기억하고 getName() 결과는 여전히 앱에서 일관성이 있습니다. 구체적인 것을 기억해야할수록 무언가를 잊어 버릴 가능성이 높아서 앱의 버그가 발생합니다.

부모는 세계의 모든 수업을 통제 할 수 없습니다. 만약에 allow_url_include 활성화되면 다른 웹에서는 서버의 클래스를 사용하고 있으며 클래스 이름을 바꾸면 충돌 할 수 있습니다. 위에서 언급 한 컴파일 된 언어에서는 더욱 악화됩니다. 라이브러리는 다른 코드로 복사 및 번들로 연결할 수 있습니다.

클래스 이름을 바꾸는 이유는 없습니다.

  • 클래스 이름이 충돌하는 경우 네임 스페이스를 사용하십시오
  • 수업 책임이 바뀌면 대신 다른 수업을 도출하십시오.

네임 스페이스의 PHP 클래스에서는 어쨌든 같은 이름을 가진 방법을 피해야합니다. 직관적으로 클래스를 생성 한 객체를 생성해야합니다. 다른 일을한다면 왜 같은 이름을 주는가? 그것은 생성자이고 다른 것은어야합니다. 주요 문제는 그러한 방법의 동작이 네임 스페이스 사용에 달려 있다는 것입니다.

Php의 __construct 생성자에는 문제가 없습니다. 그러나 명명 된 생성자를 변경하는 것이 가장 현명한 아이디어는 아니 었습니다.

사용의 가장 좋은 장점 __contruct() 대신에 ClassName() 클래스를 확장 할 때입니다. 전화가 훨씬 쉽습니다 parent::__construct() 대신에 parent::ClassName(), 수업 중에서 재사용 할 수 있으므로 부모는 쉽게 변경할 수 있습니다.

당신의 예에서 Foo::Foo PHP 4의 시대에서 나오기 때문에 PHP 4 또는 구식 생성자라고도합니다.

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

PHP 4 생성자는 더 이상 사용되지 않지만 제거되지 않습니다 PHP 7에서는 PHP 8의 상황에서 더 이상 생성자로 간주되지 않습니다. 향후 호환성은이 기능을 사용하지 않는 큰 이유입니다.

PHP 5에서는 이점이 성능이 더 좋을 것입니다. 이름으로 생성자를 찾을 것입니다. __construct 먼저, 그것을 찾지 못하면, 그것은 이름으로 생성자를 찾을 것입니다. className. 따라서 이름으로 생성자를 찾으면 __construct 이름으로 생성자를 검색 할 필요가 없습니다. className.

글쎄,이 질문이 질문을받은 지 몇 년이 지났지 만, 나는 상황이 바뀌었고 앞으로 독자들을 위해 정보를 최신 상태로 유지하고 싶기 때문에 여전히이 질문에 대답해야한다고 생각합니다!


따라서 PHP-7에서는 클래스와 동일한 이름의 함수로 생성자를 작성하는 옵션을 제거합니다. 당신이 여전히 그렇게한다면 당신은 얻을 것입니다 E_DEPRECATED.

이 제안에 대한 자세한 내용은 다음과 같습니다. https://wiki.php.net/rfc/remove_php4_constructors

그리고 거기에서 인용문 :

PHP 7 방출됩니다 e_deprecated 때마다 a PHP 4 생성자가 정의됩니다. 메소드 이름이 클래스 이름과 일치하면 클래스가 네임 스페이스에 있지 않으며 PHP 5 생성자 (__construct)가 없으면 E_DEPRECATED가 방출됩니다. PHP 8은 E_DEPRECATED 방출을 중단하고 방법은 생성자로 인식되지 않습니다.

또한 당신은 얻지 못할 것입니다 E_STRICT PHP-7에서 클래스와 동일한 이름의 메소드를 정의하고 __construct().

여기에서도 볼 수 있습니다.

PHP 7 또한 E_strict 방출을 중지하십시오 클래스와 동일한 이름을 가진 메소드가있을 때 __construct뿐만 아니라.


그래서 나는 당신을 사용하는 것이 좋습니다 __construct(), 앞으로 이것에 문제가 적을 것입니다.

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

방법이 __construct 및 sameasclassName 메소드가 있으면 __construct가 실행되면 SameasclassName 메소드가 건너 뜁니다.

주된 이유는 그것이 언어 협약이라고 생각합니다. 언어가 다른 사람처럼 행동하도록 강요 할 필요는 없습니다.

객관적인 C에서는 예를 들어 생성자를 -INIT로 접두사합니다. 클래스 이름을 사용하여 자신의 생성자를 만들 수 있지만 왜 그런가? 언어 규칙 대신이 스키마를 사용해야 할 이유가 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top