3

是否可以要求 PHP 5.3 中的对象包含某些常量或属性?我读了一点关于 PHP 的接口模型,它似乎只适用于抽象的公共方法,所以这是正确的。所以我要问的是是否有办法拥有两个对象对象 A 和对象 B。如果对象 B 想要扩展对象 A,它必须包含一个特定的常量或变量。你会如何设计这种类型的架构?谢谢。

4

4 回答 4

2

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()and getPropertyB(),这确保了这些值总是可以访问的。

于 2011-03-29T14:51:48.200 回答
1

是和不是。

不,因为属性是实现细节。它根本不是接口的一部分(方法定义接口)。您可以定义属性(在类中)和常量(在类或接口中),但不能将它们标记为抽象并要求它们由派生类“实现”。

是的,因为 interface 允许您定义所有派生类也将具有的常量(请注意这一点,请参阅@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
于 2011-03-29T14:44:20.367 回答
0

对象 A 和对象 B 应该是类,对象是不能扩展的(类的)实例(我可能弄错了,但是......)。

考虑到这一点,您可以说 B 类扩展了 A 类,那么如果您希望 B 类定义一个特定的常量,则 A 类应该实现一个接口。阅读更多关于php 接口的信息。

于 2011-03-29T14:43:42.977 回答
0

嗯,如果对象 B 扩展了对象 A,并且对象 A 包含一个常量或变量,那么如果变量是protected或,对象 B 也将包含它们public。因此,如果您在对象 A 中定义变量,即使它的值为NULL,对象 B 也会根据定义定义它。

您不能强制对象 B 实现不是从对象 A 继承的常量。与接口相同 - 如果 B 实现包含常量的接口 C,它会继承它们。但是,B 可以定义与其父类或接口不同的常量值。

于 2011-03-29T14:44:18.100 回答