abstract を使用してクラスまたはメソッドを変更できます。
abstract で変更されたクラスは、このクラスが抽象クラスであることを示し、abstract で変更されたメソッドは、このメソッドが抽象メソッドであることを示します。
抽象クラスはインスタンス化できません。
抽象メソッドにはメソッド宣言のみがあり、メソッドの実装内容はありません。
abstract 抽象クラス
abstract を使用してクラスを変更できます。
abstract で変更されたクラスは、このクラスが抽象クラスであることを示します。
抽象クラスはインスタンス化できません。
これは単純な抽象メソッドです。直接インスタンス化すると、システムはエラーを報告します。
Php コード
<?php //定义一个抽象类 abstract class User { public function __toString() { return get_class($this); } } //实例化这个类会出现错误 echo new User(); ?>
次の例の NormalUser は User クラスから継承しており、インスタンス化できます。
Php コード
<?php //定义一个抽象类 abstract class User { public function __toString() { return get_class($this); } } //实例化这个类会出现错误 echo new User(); class NormalUser extends User { } $a = new NormalUser(); echo "这个类" . $a . "的实例"; ?>
抽象クラスを単独で設定しても意味はありません。抽象メソッドが存在する場合にのみ、抽象クラスは血肉となります。以下に抽象メソッドを紹介します。
abstract 抽象メソッド
このメソッドが抽象メソッドであることを示すには、abstract 変更クラスを使用します。
抽象メソッドにはメソッドの宣言部分のみがあり、メソッド本体はありません。
抽象メソッドには {} はありませんが、; で終わります。
クラス内に抽象メソッドが存在する限り、そのクラスは抽象クラスとして宣言する必要があります。
抽象メソッドはサブクラスでオーバーライドする必要があります。
以下は、setSal() と getSal() という 2 つの抽象メソッドを持つ抽象クラスです。 $sal 従業員の賃金を取得するために使用されます。
Phpコード
<?php abstract class User { protected $sal = 0; //这里定义的抽象方法。 //注意抽象方法没有方法体,而且方法结束使用 ; 号。 abstract function getSal(); abstract function setSal(); //定义它的__tostring方法 public function __toString() { return get_class($this); } } ?>
Userクラスは直接継承できないので、Userクラスを継承したNormalUserクラスを書きます。次のコードを記述すると、システムはエラーを報告します。 このエラーは、User クラスに 2 つの抽象メソッドがあり、サブクラスでこれら 2 つのメソッドをオーバーライドする必要があることを示しています。
Php コード
<?php abstract class User { protected $sal = 0; //这里定义的抽象方法。 //注意抽象方法没有方法体,而且方法结束使用 ; 号。 abstract function getSal(); abstract function setSal(); //定义它的__tostring方法 public function __toString() { return get_class($this); } } class NormalUser extends User { } ?>
次の例では、これら 2 つのメソッドを書き換えていますが、メソッド本体の {} の内容は空ですが、このメソッドを書き換えているとみなすことができます。オーバーライドされるメソッドのパラメータ名に注意してください。パラメータの数が同じであれば、パラメータの名前は同じである必要はありません。
Php コード
<?php abstract class User { protected $sal = 0; //这里定义的抽象方法。 //注意抽象方法没有方法体,而且方法结束使用;号。 abstract function getSal(); abstract function setSal(); //定义它的__tostring方法 public function __toString() { return get_class($this); } } class NormalUser extends User { function getSal() { } function setSal($sal) { } } //这样就不会出错了。 ?>
以下の 19 ~ 21 行目では、3 つの書き換えメソッドがエラーを報告します。
19 行目、パラメーターがありません。
20 行、より多くのパラメーター。
21行目、パラメータの型が間違っています。 (この書き方は後の章で紹介します)
クラス内に抽象メソッドがある場合、そのクラスは抽象クラスとして宣言する必要があります。
次のクラスは抽象メソッドを定義しているため、エラーが報告されます。
Phpコード
<?php class User { protected $sal = 0; //这里定义的抽象方法。 //注意抽象方法没有方法体,而且方法结束使用;号。 abstract function getSal(); abstract function setSal(); //定义它的__tostring方法 public function __toString() { return get_class($this); } } //这个类中有两个抽象方法,如果这个类不是抽象的。会报错 ?>
抽象クラスは抽象クラスを継承します
抽象クラスが別の抽象クラスを継承する場合、その中の抽象メソッドを書き直す必要はありません。
抽象クラスでは、抽象親クラスの抽象メソッドをオーバーライドできません。
このような使用法は、抽象クラスの拡張として理解できます
次の例は、抽象クラスが別の抽象クラスから継承するときに、その中の抽象メソッドを書き直す必要がないことを示しています。
Php コード
<?php abstract class User { protected $sal = 0; abstract function getSal(); abstract function setSal($sal); } abstract class VipUser extends User { } ?>
抽象クラスが継承された後は、その中の抽象メソッドをオーバーライドすることはできません。
書き換えが発生した場合、システムはエラーを報告します。
Phpコード
<?php abstract class User { protected $sal = 0; abstract function getSal(); abstract function setSal($sal); } abstract class VipUser extends User { abstract function setSal(); } ?>
抽象クラスは、抽象クラスを拡張する目的で抽象クラスを継承します。
Php コード
<?php abstract class User { protected $sal = 0; abstract function getSal(); abstract function setSal($sal); } abstract class VipUser extends User { protected $commision = 0; abstract function getCommision(); abstract function setCommision(); } ?>
PHP5.1 では、静的抽象メソッドが抽象クラスでサポートされています。以下の例では、静的抽象メソッドを宣言できることがわかります。このメソッドを実装する場合は、静的メソッドである必要があります。
静的抽象メソッド
PHP5.1では、抽象クラスで静的抽象メソッドがサポートされています。以下の例では、静的抽象メソッドを宣言できることがわかります。このメソッドを実装する場合は、静的メソッドである必要があります。
PHPコード
<?php abstract class User { protected static $sal = 0; static abstract function getSal(); static abstract function setSal($sal); } class VipUser extends User { static function getSal() { return self::$sal; } static function setSal($sal) { self::$sal = $sal; } } VipUser::setSal(100); echo "you sal is " . VipUser::getSal(); ?> //这里的抽象方法好像没有问题