>백엔드 개발 >PHP 튜토리얼 >PHP 객체지향, 패턴 및 실습 고급 기능에 대한 심층적인 이해 (2)

PHP 객체지향, 패턴 및 실습 고급 기능에 대한 심층적인 이해 (2)

黄舟
黄舟원래의
2017-03-20 09:54:401272검색

추상 클래스

추상 클래스는 직접 인스턴스화할 수 없습니다. 추상 클래스는 하위 클래스에 필요한 메서드만 정의(또는 부분적으로 구현)합니다. 서브클래스는 이를 상속하고 추상 메서드를 구현하여 추상 클래스를 구체적으로 만들 수 있습니다. abstract 키워드를 사용하여 추상 클래스를 정의할 수 있습니다. 대부분의 경우 추상 클래스에는 하나 이상의 추상 메서드가 포함되어 있습니다. 추상 메소드는 abstract 키워드로 선언되며 특정 내용을 가질 수 없습니다.

abstract class ShopProductWriter{
    protected $products = array();   
     public function addProduct(ShopProduct $shopProduct)
    {
        $this->products[] = $shopProduct;
    }    abstract public function write();}

추상 메소드를 생성한 후 해당 메소드가 모든 하위 클래스에 구현되었는지 확인하지만 구현 세부 사항은 아직 결정할 수 없습니다. 각 하위 클래스는 추상 클래스의 모든 추상 메서드를 구현하거나 자신을 추상 메서드로 선언해야 합니다. 확장 클래스는 단순히 추상 클래스의 메서드를 구현하는 역할을 할 뿐만 아니라 메서드를 다시 선언해야 합니다. 새로운 구현 방법의 액세스 제어는 추상 메서드의 액세스 제어보다 엄격할 수 없습니다. 새로운 구현 메소드의 매개변수 개수는 추상 메소드의 매개변수 개수와 동일해야 하며, 해당 타입 힌트를 다시 생성해야 합니다.

class XmlProductWriter extends ShopProductWriter{

    public function write()
    {
        $str=&#39;<?xml version="1.0" encoding="UTF-8"?>&#39;."\n";        
        $str.="<products>\n";        
        foreach ($this->products as $shopProduct) {            
        $str.="\t<product title=\"{$shopProduct->getTitle()}\">\n";            
        $str.="\t\t<summary>\n";            
        $str.="\t\t{$shopProduct->getSummaryLine()}\n";            
        $str.="\t\t</summary>\n";            
        $str.="\t</product>\n";
        }        
        $str.="</products>\n";        
        print $str;
    }
}class TextProductWriter extends ShopProductWriter{

    public function write()
    {
        $str="PRODUCTS:\n";        
        foreach ($this->products as $shopProduct) {            
        $str.=$shopProduct->getSummaryLine()."\n";
        }        
        print $str;
    }
}

인터페이스

추상 클래스는 특정 구현 표준을 제공하는 반면 인터페이스는 순수 템플릿입니다. 인터페이스는 구현 내용이 아닌 기능만 정의할 수 있습니다. 인터페이스는 키워드 인터페이스를 사용하여 선언할 수 있습니다. 인터페이스에는 속성 및 메서드 선언이 포함될 수 있지만 메서드 본문은 비어 있습니다.

interface Chargeable{
    public function getPrice();}

인터페이스를 구현하는 모든 클래스는 인터페이스에 정의된 모든 메서드를 구현해야 합니다. 그렇지 않으면 클래스를 abstract로 선언해야 합니다. 클래스는 선언에 Implement 키워드를 사용하여 인터페이스를 구현할 수 있습니다.

class ShopProduct implements Chargeable
{
    //...
    function getPrice()
    {        return ($this->getPrice-$this->discount);
    }
    //...}

ShopProduct 클래스에는 이미 getPrice() 메소드가 있는데 Chargeable 인터페이스를 구현하는 것이 여전히 유용합니까? 대답은 '예'입니다. 유형 때문입니다. 인터페이스를 구현하는 클래스는 상속받은 클래스의 유형과 구현하는 인터페이스를 허용합니다.

모든 클래스는 인터페이스를 구현할 수 있으며, 인터페이스는 관련 없는 유형을 효과적으로 연결할 수 있습니다. 클래스는 상위 클래스를 상속하고 동시에 여러 인터페이스를 구현할 수 있습니다. 확장 절은 구현 절 앞에 옵니다.

class Consultancy extends TimedService implements Bookable, Chargeable{//...}

지연된 정적 바인딩: static 키워드

이 기능의 가장 확실한 징후는 새로운 키워드 static입니다. static은 self와 유사하지만 포함하는 클래스가 아니라 호출되는 클래스를 나타냅니다. 이 경우 Document::create()를 호출하면 DomainObject 개체를 인스턴스화하려고 시도하는 대신 새 Document 개체가 생성된다는 의미입니다.

abstract class DomainObject{

    public static function create()
    {
        return new static();
    }
}class User extends DomainObject{   }class Document extends DomainObject{}

print_r(Document::create());//输出为Document Object//      (//      )

정적 키워드는 단순한 인스턴스화 이상의 용도로 사용될 수 있습니다. self 및 parent와 마찬가지로 static은 정적이 아닌 컨텍스트에서도 정적 메서드 호출에 대한 식별자로 사용할 수 있습니다.

아아아아

위 내용은 PHP 객체지향, 패턴 및 실습 고급 기능에 대한 심층적인 이해 (2)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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