簡體   English   中英

PHP OOP問題

[英]PHP OOP Question

是否可以要求PHP 5.3中的對象包含某些常量或屬性? 我讀了一下PHP的接口模型,看起來它只適用於抽象的公共方法,所以它就是正確的。 所以我要問的是,是否有一種方法可以有兩個對象對象A和對象B.如果對象B想要擴展對象A,它必須包含一個特定的常量或變量。 你會如何設計這種類型的架構? 謝謝。

http://php.net/manual/en/language.oop5.interfaces.php#language.oop5.interfaces.constants

接口有可能有常量。 接口常量的工作方式與類常量完全相同,只是它們不能被繼承它的類/接口覆蓋。

繼承類不能覆蓋接口常量。 類常量可以被重寫,但不是必須的 (即使在抽象類中聲明)。 抽象類旨在強制實現 接口 ,而不是實現 常量屬於實現,而方法定義了接口。 因此,雖然常量可以在抽象類中使用默認值聲明,但由孩子決定是否使用或重新定義它們。

您最好的選擇是使用“getter”方法,例如:

abstract class MyAbstract
{
    abstract public function getPropertyA();
    abstract public function getPropertyB();
}

現在,任何使用extend MyAbstract類都需要定義getPropertyA()getPropertyB() ,以確保始終可以訪問值。

是的,不是。

不,因為屬性是實現細節。 它根本不是接口的一部分(方法定義接口)。 您可以定義屬性(在類中)和常量(在類或接口中),但是您不能將它們標記為抽象,並要求它們由派生類“實現”。

是的,因為接口允許您定義所有派生類也將具有的常量(請注意, 請參閱@ Gordon的問題 )。 這個“強制”類有這些常量。 您還可以使用抽象類或常規繼承“強制”將屬性傳遞給派生類:

abstract class Foo {
   public $foo = 'bar';
   protected $bar = 'baz';
}

class Bar extends Foo {
   public funciton getBar() {
      return $this->bar;
   }
}

$bar = new Bar;
echo $bar->foo;      // bar
echo $bar->getBar(); // baz

對象A和對象B應該是類,對象是無法擴展的實例(類)(我可能會弄錯但是......)。

考慮到這一點,你可以說B類擴展了A類,然后如果你讓B類定義了一個特定的常量,那么A類應該實現一個接口。 閱讀更多關於php接口的信息

嗯,如果對象B擴展了對象A,並且對象A包含常量或變量,那么如果變量是protectedpublic ,則對象B也將包含它們。 因此,如果在對象A中定義變量,即使其值為NULL ,對象B也將根據定義定義它。

您不能強制對象B實現不從對象A繼承的常量。與接口相同 - 如果B實現包含常量的接口C,則它繼承它們。 但是,B可以定義與其父類或接口不同的常量值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM