PHP 手冊 (類與物件) 學習筆記十:抽象類

小彭友發表於2020-06-01

描述:

  • PHP 5 支援抽象類和抽象方法。定義為抽象的類不能被例項化。任何一個類,如果它裡面至少有一個方法是被宣告為抽象的,那麼這個類就必須被宣告為抽象的。被定義為抽象的方法只是宣告瞭其呼叫方式(引數),不能定義其具體的功能實現

  • 繼承一個抽象類的時候,子類必須定義父類中的所有抽象方法;另外,這些方法的訪問控制必須和父類中一樣(或者更為寬鬆)。例如某個抽象方法被宣告為受保護的,那麼子類中實現的方法就應該宣告為受保護的或者公有的,而不能定義為私有的。此外方法的呼叫方式必須匹配,即型別和所需引數數量必須一致。例如,子類定義了一個可選引數,而父類抽象方法的宣告裡沒有,則兩者的宣告並無衝突。 這也適用於 PHP 5.4 起的建構函式。在 PHP 5.4 之前的建構函式宣告可以不一樣的。

Example 1: 抽象類示例

   abstract class AbstractClass
    {
        //強制要求子類定義這些方法
        abstract protected function getValue();
        abstract protected function prefixValue($prefix);

        public function printOut()
        {
            print $this->getValue() . "\n";
        }
    }

    class ConcreteClass1 extends AbstractClass
    {
        protected function getValue()
        {
            return "ConcreteClass1";
        }

        public function prefixValue($prefix)
        {
            return "{$prefix}ConcreteClass1";
        }
    }

    class ConcreteClass2 extends AbstractClass
    {
        protected function getValue()
        {
            return "ConcreteClass2";
        }

        public function prefixValue($prefix)
        {
            return "{$prefix}ConcreteClass2";
        }
    }

    $class1 = new ConcreteClass1();
    $class1->printOut();//ConcreteClass1
    echo $class1->prefixValue('FOO_') . "\n";//FOO_ConcreteClass1
    $class2 = new ConcreteClass2();
    $class2->printOut();//ConcreteClass2
    echo $class2->prefixValue('FOO_');////FOO_ConcreteClass2

Example 2: 抽象類示例

    abstract class AbstractClass
    {
        // 我們的抽象方法僅需要定義需要的引數
       abstract protected function prefixName($name);
    }

    class ConcreteClass extends AbstractClass
    {
        // 我們的子類可以定義父類簽名中不存在的可選引數
        public function prefixName($name, $separator = '.')
        {
            if($name == 'Pacman'){
                $prefix = 'Mr';
            } else if($name == 'Pacwoman'){
                $prefix = 'Mrs';
            } else {
                $prefix = '';
            }
            return "{$prefix}{$separator} {$name}";
        }
    }

    $o = new ConcreteClass();
    echo $o->prefixName('Pacman'), "\n";//Mr. Pacman
    echo $o->prefixName('Pacwoman');//Mrs. Pacwoman

附手冊地址

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章