추상 클래스는 직접 인스턴스화할 수 없습니다. 추상 클래스는 하위 클래스에 필요한 메서드만 정의(또는 부분적으로 구현)합니다. 서브클래스는 이를 상속하고 추상 메서드를 구현하여 추상 클래스를 구체적으로 만들 수 있습니다. 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='<?xml version="1.0" encoding="UTF-8"?>'."\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은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!