繁体   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