php--抽象クラス

伊谢尔伦
リリース: 2016-11-23 14:10:34
オリジナル
1103 人が閲覧しました

PHP 5 は抽象クラスと抽象メソッドをサポートします。抽象として定義されたクラスはインスタンス化できません。クラス内の少なくとも 1 つのメソッドが抽象宣言されている場合、クラスは抽象宣言されている必要があります。抽象として定義されたメソッドは、その呼び出しメソッド (パラメーター) を宣言するだけであり、その特定の関数の実装を定義することはできません。

抽象クラスを継承する場合、サブクラスは親クラスのすべての抽象メソッドを定義する必要があります。また、これらのメソッドのアクセス制御は親クラスと同じ (またはより緩和された) 必要があります。たとえば、抽象メソッドが protected として宣言されている場合、サブクラスに実装されているメソッドは protected または public として宣言する必要があり、private として定義することはできません。さらに、メソッドを呼び出すメソッドは一致している必要があります。つまり、必要なパラメータの型と数が一致している必要があります。たとえば、サブクラスが親クラスの抽象メソッドの宣言に含まれていないオプションのパラメーターを定義している場合、2 つの宣言の間に競合はありません。 これは、PHP 5.4 以降のコンストラクターにも当てはまります。 PHP 5.4 より前のコンストラクター宣言は異なる可能性があります。

例 #1 抽象クラスの例

abstract class AbstractClass
{
    //强制要求子类定义这些方法
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);
    //普通方法(非抽象方法)
    public function printOut()
    {
        print $this->getValue().&#39;<br>&#39;;
    }
}
class ConcreteClass1 extends AbstractClass
{
    protected function getValue()
    {
        return "ConcteteClass1";
    }
    public function prefixValue($prefix){
        return "{$prefix}ConcreteClass1";
    }
}
class ConcreteClass2 extends AbstractClass
{
    public function getValue(){
        return "ConcreteClass2";
    }
    public function prefixValue($prefix){
        return "{$prefix}ConcreteClass2";
    }
}
$class1 = new ConcreteClass1;
$class1 -> printOut();
echo $class1->prefixValue(&#39;Foo_&#39;)."<br>";
$class2 = new ConcreteClass2;
$class2 -> printOut();
echo $class2->prefixValue(&#39;Bar_&#39;)."<br>";
ログイン後にコピー

出力結果:

ConcteteClass1

Foo_ConcreteClass1

ConcreteClass2

Bar_ConcreteClass2

例 #2 抽象クラスの例

abstract class AbstractClass
{
    //我们的抽象方法仅需要定义需要的参数 
    abstract protected function prefixName($name);
}
class ConcreteClass extends AbstractClass
{
    //我们的子类可以定义父类签名中不存在的可选参数
    public function prefixName($name,$separator=&#39;.&#39;){
        if($name == &#39;Pacman&#39;){
            $prefix = "Mr";
        }elseif($name == &#39;Pacwoman&#39;){
            $prefix = &#39;Mrs&#39;;
        }else{
            $prefix = "";
        }
        return "{$prefix}{$separator} {$name}";
    }
}
$class = new ConcreteClass;
echo $class->prefixName(&#39;Pacman&#39;).&#39;<br>&#39;;
echo $class->prefixName(&#39;Pacwoman&#39;).&#39;<br>&#39;;
ログイン後にコピー

出力結果:

パックマンさん

パックウーマンさん


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