PHP面向对象问题

PHP面向对象问题,php,oop,object-design,Php,Oop,Object Design,PHP5.3中的对象是否可能包含某些常量或属性?我读了一点PHP的接口模型,它似乎只适用于抽象的公共方法,所以这是正确的。所以我要问的是,是否有一种方法可以让两个对象,对象a和对象B。如果对象B想要扩展对象a,它必须包含一个特定的常量或变量。您将如何设计这种类型的架构?谢谢。对象A和对象B应该是类,对象是不能扩展的(类的)实例(我可能弄错了,但是…) 考虑到这一点,您可以假设类B扩展了类A,那么如果您希望类B定义一个特定的常量,那么类A应该实现一个接口。阅读更多信息。嗯,如果对象B扩展了对象A,

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

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


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

嗯,如果对象B扩展了对象A,并且对象A包含常量或变量,那么如果变量受
保护
公共
,则对象B也将包含它们。因此,如果在对象A中定义变量,即使其值为
NULL
,对象B也会根据定义定义它

您不能强制对象B实现一个不是从对象a继承的常量。接口也是如此——如果B实现了接口C,其中包含常量,它将继承这些常量。但是,B可以定义与其父类或接口不同的常量值

是和否

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

是的,因为接口允许您定义所有派生类也将具有的常量(请注意,)。这“强制”类具有这些常量。您还可以使用抽象类或常规继承“强制”将属性传递给派生类:

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

接口可能有常数。接口常量的工作原理与类常量完全相同,只是它们不能被继承它的类/接口重写

不能通过继承类重写接口常量。可以重写类常量,但不要求重写(即使在抽象类中声明)。抽象类的设计是为了实现接口,而不是实现。常量属于实现,而方法定义接口。因此,虽然可以在抽象类中使用默认值声明常量,但是否使用或重新定义它们取决于子类

您的最佳选择是使用“getter”方法,例如:

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

现在,任何使用
extend MyAbstract
的类都需要定义
getPropertyA()
getPropertyB()
,这确保了值总是可以访问的。

我从来没有说过它们不能有常量,我的观点是,接口似乎只需要一些方法,属性和常量似乎没有按预期工作。也许当我说“仅适用于”时我应该更清楚。谢谢,这正是我需要的。戈登,如果你有对象A实现接口A,然后对象B扩展对象A,然后对象C扩展对象B,那么他们可以。对象C将能够重新定义常量。不确定这是否是预期的行为?@chrisw让我试试。那听起来像个虫子。你能在代码板上放一个例子吗?@chrisw有一个关于PHP的讨论。我相信到目前为止,大家的共识是,这是“未记录的行为”,不应该被依赖(不确定它是否会被视为“缺陷”或被批准为“功能”)。@netcoder:我完全同意你的看法,在我看来,这是一个缺陷。