1. abstract로 정의된 클래스는 인스턴스화할 수 없습니다.
2. 적어도 하나의 메소드가 abstract로 선언된 경우 이 클래스는 abstract로 선언되어야 합니다.
3. abstract로 정의된 메서드는 호출 메서드(매개변수)만 선언하며 특정 함수 구현을 정의할 수 없습니다.
4. 추상 클래스를 상속할 때 하위 클래스는 상위 클래스의 모든 추상 메소드를 정의해야 합니다(이러한 메소드의 액세스 제어는 상위 클래스의 것과 동일해야 합니다(또는 더 완화되어야 함).)
demo
abstract class AbstractClass{ // 强制要求子类定义这些方法 abstract protected function getValue(); abstract protected function prefixValue($prefix); // 普通方法(非抽象方法) public function printOut() { print $this->getValue() . "\n"; } class ConcreteClass1 extends AbstractClass{ //父类定义了俩个抽象方法,如子类只实现了其中一个,则报如下错误//Fatal error: Class ConcreteClass1 contains 1 abstract //method and must therefore be declared abstract or //implement the remaining methods //(AbstractClass::prefixValue) protected function getValue() { return "ConcreteClass1"; } // 且子类的访问权限不能低于父类,如果将如下子类的访问方式改为private则会报如下错误 //Fatal error: Access level to //ConcreteClass1::prefixValue() must be protected (as in //class AbstractClass) or weaker public function prefixValue($prefix) { return "{$prefix}ConcreteClass1"; } } //当实例化一个抽象类时,Fatal error: Cannot instantiate //abstract class AbstractClass //$obj = new AbstractClass(); // 但是我们可以这么使用########################################################## abstract class Foo{ static function bar() { echo "test\n"; } } Foo::bar();########################################################## $obj = new ConcreteClass1(); echo $obj->getValue();
5. 하위 클래스가 선택적 매개 변수를 정의할 수 있지만(즉, 기본값이 있어야 함) 상위 클래스의 추상 메서드 선언에 포함되지 않은 경우 둘 사이에 충돌이 없습니다. 선언.
abstract class AbstractClass{ // 我们的抽象方法仅需要定义需要的参数 abstract protected function prefixName($name); } class ConcreteClass extends AbstractClass { // 我们的子类可以定义父类签名中不存在的可选参数 // 如果这里的$separator没有默认值,则会报Fatal error: 、、//Declaration of ConcreteClass::prefixName() must be //compatible with that of AbstractClass::prefixName() public function prefixName($name, $separator = ".") { if ($name == "Pacman") { $prefix = "Mr"; } elseif ($name == "Pacwoman") { $prefix = "Mrs"; } else { $prefix = ""; } return "{$prefix}{$separator} {$name}"; } } $class = new ConcreteClass; echo $class->prefixName("Pacman"), "\n"; echo $class->prefixName("Pacwoman"), "\n";
6. 추상 클래스는 추상 메소드를 가질 수 없습니다. 반대로 추상 메소드가 있는 클래스는 추상 클래스로 선언되어야 합니다.
abstract class A{ public function show(){ echo 'A'; } } class B extends A{ public function hello(){ echo 'B'; parent::show(); } } $obj = new B; $obj->hello(); // BA
7. 추상 메소드는 다음과 같이 정의됩니다. static
methods// 正确的定义顺序 abstract class horse extends animal { public function get_breed() { return "Jersey"; } } class cart extends horse { public function get_breed() { return "Wood"; } } // 错误的定义顺序,将会导致horse类找不到 class cart extends horse { public function get_breed() { return "Wood"; } } abstract class horse extends animal { public function get_breed() { return "Jersey"; } }
abstract class FOO { abstract static function dump(); } class BAR extends FOO{ static function dump(){var_dump("BAR");} } BAR::dump(); // string(3) "BAR"
위 내용은 PHP 추상 클래스 기능 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!