클래스 상속은 프로그래머로서 기본적으로 매일 처리하는 일인데 정말 알고 있는 게 있나요? 아래는 공식 홈페이지에서 볼 수 있는 내용입니다.
클래스는 선언에 확장 키워드를 사용하여 다른 클래스의 메서드와 속성을 상속할 수 있습니다. PHP는 다중 상속을 지원하지 않으며, 클래스는 하나의 기본 클래스에서만 상속할 수 있습니다.
상속된 메서드와 속성은 동일한 이름으로 다시 선언하여 재정의할 수 있습니다. 그러나 부모 클래스가 메서드를 정의할 때 final을 사용하는 경우 해당 메서드를 재정의할 수 없습니다. 재정의된 메서드나 속성은 parent::를 통해 액세스할 수 있습니다.
메서드를 재정의할 때 매개변수는 일관성이 있어야 합니다. 그렇지 않으면 PHP는 E_STRICT 수준 오류 메시지를 발행합니다. 예외는 constructor이며 재정의 시 다른 매개변수를 사용할 수 있습니다.
기본 개념은 다들 아시겠지만 프로젝트에서 final과 parent::를 실제로 사용하지 않아서 부끄럽습니다.
다음은 주로 이 두 키워드의 용도에 대해 설명합니다.
Final 키워드
PHP 5의 새로운 키워드입니다. 상위 클래스의 메서드가 final로 선언되면 하위 클래스가 해당 메서드를 재정의할 수 없습니다. 마찬가지로 클래스가 final로 선언되면 상속될 수 없습니다.
속성은 최종으로 정의할 수 없으며 클래스와 메서드만 최종으로 정의할 수 있다는 점에 유의해야 합니다.
범위 확인 연산자(::)
범위 확인 연산자 또는 간단히 콜론 쌍을 사용하여 정적 멤버, 클래스 상수에 액세스할 수 있으며 클래스의 속성 및 메서드를 재정의하는 데에도 사용할 수 있습니다.
세 가지 특수 키워드 self, parent 및 static은 클래스 정의 내의 해당 속성이나 메서드에 액세스하는 데 사용됩니다.
하위 클래스가 상위 클래스의 메서드를 재정의하면 PHP는 상위 클래스의 재정의된 메서드를 호출하지 않습니다. 상위 클래스의 메소드 호출 여부는 하위 클래스에 따라 다릅니다. 이 메커니즘은 생성자 및 소멸자, 오버로드 및 마법 메서드에도 작동합니다.
다음은 상위 클래스의 메서드를 호출하는 예입니다.
<?php class MyClass { protected function myFunc() { echo "MyClass::myFunc()\n"; } } class OtherClass extends MyClass { // 覆盖了父类的定义 public function myFunc() { // 但还是可以调用父类中被覆盖的方法 parent::myFunc(); echo "OtherClass::myFunc()\n"; } } $class = new OtherClass(); $class->myFunc(); /** * 输出结果 -> * MyClass::myFunc() * OtherClass::myFunc() */ ?>
클래스 정의 외부에서 이러한 항목을 참조할 때는 클래스 이름을 사용하세요.
::class PHP 5.5부터 class 키워드를 클래스 이름 구문 분석에 사용할 수도 있습니다. ClassName::class를 사용하면 ClassName 클래스의 정규화된 이름이 포함된 문자열을 얻을 수 있습니다. 이는 네임스페이스를 사용하는 수업에 특히 유용합니다. 이것들은 앞으로 논의할 주제일 수 있습니다. 이 개념은 앞으로 계속 논의될 것입니다. 현재 우리는 여전히 php5.3을 사용하고 있습니다.
하지만 솔직히 소규모 프로젝트에서는 사용하기 어려운 키워드도 있지만, 그래도 좀 더 알아가는 것이 필요하다고 생각해요. 특히 일부 타사 클래스 라이브러리를 사용하는 경우 해당 프로그램 논리를 자세히 연구하면 항상 무언가를 배울 수 있습니다. 어떤 것들은 오랫동안 사용하지 않으면 잊어버릴 수도 있지만, 결국 그것들은 당신의 마음을 스쳐 지나갔고 남은 생애 동안 항상 어떤 흔적을 남길 것입니다.
마지막으로, 더 이상 고민하지 않고 범위 구문 분석 연산자(::) 적용을 위한 코드를 공유하겠습니다. 여러분도 경험할 수 있습니다:
<?php class cA { /** * 直接使用的测试属性的默认值 */ protected static $item = 'Foo'; /** * 间接使用的测试属性的默认值 */ protected static $other = 'cA'; public static function method() { print self::$item."\r\n"; print self::$other."\r\n"; } public static function setOther($val) { self::$other = $val; } } class cB extends cA { /** * 重定义测试属性的默认值 */ protected static $item = 'Bar'; public static function setOther($val) { self::$other = $val; } /** * 不重新声明 method()方法 */ } class cC extends cA { /** * 重定义测试属性的默认值 */ protected static $item = 'Tango'; public static function method() { print self::$item."\r\n"; print self::$other."\r\n"; } /** * 不重新声明 setOther()方法 */ } class cD extends cA { /** * 重定义测试属性的默认值 */ protected static $item = 'Foxtrot'; /** * 不重新声明 任何方法来实现上述过程 */ } cB::setOther('cB'); // cB::method()! cB::method(); // cA::method()! cC::setOther('cC'); // cA::method()! cC::method(); // cC::method()! cD::setOther('cD'); // cA::method()! cD::method(); // cA::method()! /** * 输出结果 -> * Foo * cB * Tango * cC * Foo * cD */ ?>
PHP 확장 클래스 상속 코드 예:
< ?php class a{ public $x; public $y; function construct($x=0,$y=0){ $this->x=$x; $this->y=$y; } function getx(){ return $this->x; } function gety(){ return $this->y; } function destruct(){} } class a2 extends a{} /*extends是一个继承函数*/ $b2=new a2(10,10); echo $b2->getx()."<br>"; echo $b2->gety(); ?>
위에 소개된 내용 PHP는 클래스 상속을 확장합니다.
위 내용은 PHP 상속 클래스 확장 사용법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!