ホームページ >バックエンド開発 >PHPチュートリアル >PHP抽象クラスの機能例を詳しく解説

PHP抽象クラスの機能例を詳しく解説

伊谢尔伦
伊谢尔伦オリジナル
2017-07-03 09:11:401863ブラウズ

抽象クラスの特徴

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";
6. 抽象クラスは抽象メソッドを持つことができません。逆に、抽象メソッドを持つクラスは抽象クラスとして宣言する必要があります

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"; }
 }

9. 抽象クラスが別の抽象クラスを継承する場合、抽象メソッドを abstract

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。