ホームページ >バックエンド開発 >PHPチュートリアル >PHP クラスのサンプル チュートリアル: 抽象クラスと抽象メソッド
abstract を使用してクラスまたはメソッドを変更できます。
abstract で変更されたクラスは、このクラスが抽象クラスであることを示し、abstract で変更されたメソッドは、このメソッドが抽象メソッドであることを示します。
抽象クラスはインスタンス化できません。
抽象メソッドにはメソッド宣言のみがあり、メソッドの実装内容はありません。
abstract 抽象クラス
abstract を使用してクラスを変更できます。
abstract で変更されたクラスは、このクラスが抽象クラスであることを示します。
抽象クラスはインスタンス化できません。
これは単純な抽象メソッドです。直接インスタンス化すると、システムはエラーを報告します。
<?php //定义一个抽象类 abstract class User { public function __toString() { return get_class($this); } } //实例化这个类会出现错误 echo new User(); ?>以下の例の NormalUser は User クラスを継承しており、インスタンス化できます。
<?php //定义一个抽象类 abstract class User { public function __toString() { return get_class($this); } } //实例化这个类会出现错误 echo new User(); class NormalUser extends User { } $a = new NormalUser(); echo "这个类" . $a . "的实例"; ?>抽象クラスを単独で設定するのは意味がありません。抽象メソッドを使用してのみ、抽象クラスが血肉を持つことができます。以下に抽象メソッドを紹介します。
抽象抽象メソッド
このメソッドが抽象メソッドであることを示すには、抽象修飾クラスを使用します。
抽象メソッドにはメソッドの宣言部分のみがあり、メソッド本体はありません。
抽象メソッドには {} はありませんが、; で終わります。
クラス内に抽象メソッドが存在する限り、そのクラスは抽象クラスとして宣言する必要があります。
抽象メソッドはサブクラスでオーバーライドする必要があります。
以下は、setSal() と getSal() という 2 つの抽象メソッドを持つ抽象クラスです。 $sal 従業員の賃金を取得するために使用されます。
<?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 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 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 class User { protected $sal = 0; //这里定义的抽象方法。 //注意抽象方法没有方法体,而且方法结束使用;号。 abstract function getSal(); abstract function setSal(); //定义它的__tostring方法 public function __toString() { return get_class($this); } } //这个类中有两个抽象方法,如果这个类不是抽象的。会报错 ?>
抽象クラスは抽象クラスを継承します
抽象クラスが別の抽象クラスを継承する場合、その中の抽象メソッドを書き直す必要はありません。
抽象クラスでは、抽象親クラスの抽象メソッドをオーバーライドできません。
このような使用法は、抽象クラスの拡張として理解できます
次の例は、抽象クラスが別の抽象クラスから継承するときに、その中の抽象メソッドを書き直す必要がないことを示しています。
<?php abstract class User { protected $sal = 0; abstract function getSal(); abstract function setSal($sal); } abstract class VipUser extends User { } ?>
抽象クラスが継承された後は、その中の抽象メソッドをオーバーライドすることはできません。
書き換えが発生した場合、システムはエラーを報告します。
<?php abstract class User { protected $sal = 0; abstract function getSal(); abstract function setSal($sal); } abstract class VipUser extends User { abstract function setSal(); } ?>
抽象クラスは抽象クラスを継承し、抽象クラスを拡張することを目的としています。
<?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 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(); ?> //这里的抽象方法好像没有问题
転載元: http://blog.csdn.net/klinghr/article/details/5212952
以上、PHP クラスのサンプルチュートリアル: 抽象クラスと抽象メソッドを内容も含めて紹介しましたが、PHP チュートリアルに興味のある友人の参考になれば幸いです。