> 백엔드 개발 > PHP 문제 > PHP에 생성자가 있습니까?

PHP에 생성자가 있습니까?

藏色散人
풀어 주다: 2023-03-15 06:22:01
원래의
1861명이 탐색했습니다.

PHP에는 생성자가 있으며 구문 설명은 "__construct(mixed...$values ​​​​= ""): void"입니다. 생성자가 있는 클래스는 새 객체가 생성될 때마다 이 메서드를 먼저 호출합니다. 이므로 매우 적합합니다. 객체를 사용하기 전에 몇 가지 초기화 작업을 수행하십시오.

PHP에 생성자가 있습니까?

이 기사의 운영 환경: Windows 7 시스템, PHP 버전 7.1, DELL G3 컴퓨터

PHP에 생성자가 있나요?

php 생성자

__construct(mixed ...$values = ""): void
로그인 후 복사

PHP를 사용하면 개발자는 클래스의 생성자로 메서드를 정의할 수 있습니다. 생성자가 있는 클래스는 새 객체가 생성될 때마다 이 메서드를 호출하므로 객체를 사용하기 전에 일부 초기화 작업을 수행하는 데 매우 적합합니다.

참고: 생성자가 하위 클래스에 정의된 경우 해당 상위 클래스의 생성자는 암시적으로 호출되지 않습니다. 상위 클래스의 생성자를 실행하려면 하위 클래스의 생성자에서 parent::__construct()를 호출해야 합니다. 하위 클래스가 생성자를 정의하지 않으면 일반 클래스 메서드와 마찬가지로 상위 클래스에서 상속됩니다(private으로 정의되지 않은 경우).

예제 #1 상속의 생성자

<?php
class BaseClass {
    function __construct() {
        print "In BaseClass constructor\n";
    }
}
class SubClass extends BaseClass {
    function __construct() {
        parent::__construct();
        print "In SubClass constructor\n";
    }
}
class OtherSubClass extends BaseClass {
    // 继承 BaseClass 的构造函数
}
// In BaseClass constructor
$obj = new BaseClass();
// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();
// In BaseClass constructor
$obj = new OtherSubClass();
?>
로그인 후 복사

다른 메서드와 달리 __construct()는 상속 시 서명 호환성 규칙을 따르지 않습니다.

PHP 5.3.3부터 네임스페이스에서 클래스 이름과 동일한 이름을 가진 메서드는 더 이상 생성자로 사용되지 않습니다. 네임스페이스에 없는 클래스는 영향을 받지 않습니다. 생성자는 해당 객체가 인스턴스화될 때 자동으로 호출되는 일반적인 메서드입니다. 따라서 필수이거나 유형이 있거나 기본값을 가질 수 있는 매개변수를 원하는 수만큼 정의할 수 있습니다. 생성자의 매개변수는 클래스 이름 뒤에 괄호 안에 표시됩니다.

예제 #2 생성자 매개변수 사용

<?php
class Point {
    protected int $x;
    protected int $y;
    public function __construct(int $x, int $y = 0) {
        $this->x = $x;
        $this->y = $y;
    }
}
// 两个参数都传入
$p1 = new Point(4, 5);
// 仅传入必填的参数。 $y 会默认取值 0。
$p2 = new Point(4);
// 使用命名参数(PHP 8.0 起):
$p3 = new Point(y: 5, x: 4);
?>
로그인 후 복사

클래스에 생성자가 없고 생성자의 매개변수가 필요하지 않은 경우 괄호를 생략할 수 있습니다.

이전 스타일 생성자

PHP 8.0.0 이전에는 전역 네임스페이스의 클래스에 동일한 이름의 메서드가 있으면 이전 스타일 생성자로 해석되었습니다. 함수를 생성자로 사용할 수 있지만 이 구문은 더 이상 사용되지 않으며 E_DEPRECATED 오류가 발생합니다. __construct()와 동일한 이름의 메서드가 동시에 존재하면 __construct()가 호출됩니다.

클래스와 이름이 같은 메서드는 네임스페이스의 클래스와 PHP 8.0.0 이후의 모든 클래스라는 두 가지 경우에서 더 이상 특별한 의미를 갖지 않습니다.

새 코드에서는 __construct()를 사용하세요.

생성자 속성 개선

PHP 8.0.0부터 생성자의 매개변수도 이에 따라 클래스 속성으로 업그레이드될 수 있습니다. 클래스 속성에 생성자 매개변수를 할당하는 것이 일반적입니다. 그렇지 않으면 작동할 수 없습니다. 생성자 승격 기능은 이 시나리오에 편의를 제공합니다. 따라서 위의 예는 다음과 같이 다시 작성할 수 있습니다.

예제 #3 생성자 속성 승격 사용

<?php
class Point {
    public function __construct(protected int $x, protected int $y = 0) {
    }
}
로그인 후 복사

생성자 매개변수에 액세스 제어(가시성 수정자)가 있는 경우 PHP는 이를 객체 속성 및 생성자로 처리합니다. 동시에 매개변수를 지정하고 속성에 값을 할당합니다. 생성자는 비어 있거나 다른 문을 포함할 수 있습니다. 매개변수 값이 해당 속성에 할당된 후 텍스트의 추가 코드 문이 실행됩니다.

모든 매개변수를 개선할 필요는 없습니다. 승격된 매개변수와 승격되지 않은 매개변수를 속성으로 혼합할 수 있으며 순서대로일 필요는 없습니다. 제기된 매개변수는 생성자 내의 코드 호출에 영향을 주지 않습니다.

참고:

엔진에 대한 혼동을 피하기 위해 객체 속성 유형을 호출할 수 없습니다. 따라서 승격된 매개변수도 호출할 수 없습니다. 다른 유형 선언이 허용됩니다.

참고:

생성자의 부스트 매개변수에 배치된 속성은 속성과 매개변수로 동시에 복사됩니다.

정적 생성 방법

PHP에서는 각 클래스마다 생성자가 하나만 있을 수 있습니다. 그러나 다양한 입력을 사용하여 객체를 다양한 방식으로 구성해야 하는 상황이 있습니다. 이 경우 정적 메서드 래핑 구성을 사용하는 것이 좋습니다.

예제 #4 정적을 사용하여 메서드 만들기

<?php
class Product {
    private ?int $id;
    private ?string $name;
    private function __construct(?int $id = null, ?string $name = null) {
        $this->id = $id;
        $this->name = $name;
    }
    public static function fromBasicData(int $id, string $name): static {
        $new = new static($id, $name);
        return $new;
    }
    public static function fromJson(string $json): static {
        $data = json_decode($json);
        return new static($data[&#39;id&#39;], $data[&#39;name&#39;]);
    }
    public static function fromXml(string $xml): static {
        // 自定义代码逻辑。
        $data = convert_xml_to_array($xml);
        $new = new static();
        $new->id = $data[&#39;id&#39;];
        $new->name = $data[&#39;name&#39;];
        return $new;
    }
}
$p1 = Product::fromBasicData(5, &#39;Widget&#39;);
$p2 = Product::fromJson($some_json_string);
$p3 = Product::fromXml($some_xml_string);
로그인 후 복사

생성자를 비공개 또는 보호로 설정하여 직접 추가 호출을 방지할 수 있습니다. 현재로서는 정적 메서드만 클래스를 인스턴스화할 수 있습니다. 동일한 정의된 클래스에 있기 때문에 전용 메서드에 액세스할 수 있으며 동일한 객체 인스턴스에 있을 필요가 없습니다. 물론 생성자를 반드시 private으로 설정할 필요는 없습니다. 합리적인지 여부는 실제 상황에 따라 다릅니다.

세 가지 정적 메서드는 객체를 다양한 방식으로 인스턴스화하는 방법을 보여줍니다.

  • fromBasicData()는 모든 필수 매개변수를 생성자에 전달하고 객체를 생성한 후 결과를 반환합니다.

  • fromJson()은 JSON 문자열을 받아 생성자가 요구하는 형식으로 전처리한 후 새 객체를 반환합니다.

  • fromXml()은 XML 문자열을 받아 구문 분석하고 간단한 객체를 생성합니다. 매개변수는 선택사항이므로 모든 매개변수를 무시하고 생성자를 호출할 수 있습니다. 그런 다음 객체의 속성에 값을 할당하고 결과를 반환합니다.

위의 세 가지 예에서 static 키워드는 코드가 위치한 클래스의 클래스 이름으로 변환됩니다. 이 경우에는 제품입니다.

추천 학습: "PHP 비디오 튜토리얼"

위 내용은 PHP에 생성자가 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿