PHP クラスのサンプル チュートリアル: 抽象クラスと抽象メソッド

巴扎黑
リリース: 2016-11-11 10:52:58
オリジナル
1450 人が閲覧しました

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();  
?>  
//这里的抽象方法好像没有问题
ログイン後にコピー


関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート