>  기사  >  백엔드 개발  >  PHP 상속 클래스 확장 사용법에 대한 자세한 설명

PHP 상속 클래스 확장 사용법에 대한 자세한 설명

伊谢尔伦
伊谢尔伦원래의
2018-05-15 17:31:2928196검색

클래스 상속은 프로그래머로서 기본적으로 매일 처리하는 일인데 정말 알고 있는 게 있나요? 아래는 공식 홈페이지에서 볼 수 있는 내용입니다.

클래스는 선언에 확장 키워드를 사용하여 다른 클래스의 메서드와 속성을 상속할 수 있습니다. 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 = &#39;Foo&#39;;

    /**
     * 间接使用的测试属性的默认值
     */
    protected static $other = &#39;cA&#39;;

    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 = &#39;Bar&#39;;

    public static function setOther($val)
    {
        self::$other = $val;
    }
    /**
     * 不重新声明 method()方法
     */
}
class cC extends cA
{
    /**
     * 重定义测试属性的默认值
     */
    protected static $item = &#39;Tango&#39;;

    public static function method()
    {
        print self::$item."\r\n"; 
        print self::$other."\r\n"; 
    }

    /**
     * 不重新声明 setOther()方法
     */
}
class cD extends cA
{
    /**
     * 重定义测试属性的默认值
     */
    protected static $item = &#39;Foxtrot&#39;;

    /**
     * 不重新声明 任何方法来实现上述过程
     */
}
cB::setOther(&#39;cB&#39;); //  cB::method()!
cB::method(); // cA::method()!
cC::setOther(&#39;cC&#39;); // cA::method()!
cC::method(); // cC::method()!
cD::setOther(&#39;cD&#39;); // 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.