1. 抽象として定義されたクラスはインスタンス化できません。
2. 少なくとも 1 つのメソッドが抽象として宣言されている場合、このクラスも抽象として宣言する必要があります。
3. 抽象として定義されたメソッドは、その呼び出しメソッド (パラメーター) を宣言するだけであり、その特定の関数の実装を定義することはできません。
4. 抽象クラスを継承する場合、サブクラスは親クラスのすべての抽象メソッドを定義する必要があります (これらのメソッドの アクセス制御は、親クラスのアクセス制御と同じ (またはより緩和された) 必要があります)。
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. サブクラスはオプションのパラメーターを定義できますが (つまり、デフォルト値が必要です)、それは親クラスの抽象メソッドの宣言には含まれません。2 つの宣言の間に矛盾はありません。 。 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";
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
8。 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 中国語 Web サイトの他の関連記事を参照してください。