你能强制子类覆盖常量吗?

问题描述 投票:0回答:4

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

php oop object-design
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()
getPropertyB()
,这确保了值始终可访问。
    


1
投票

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

是的,因为接口允许您定义所有派生类也将具有的常量(请小心,

参见@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



0
投票

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

php 接口

.


0
投票
protected

public
,则对象 B 也会包含它们。因此,如果您在对象 A 中定义变量,即使其值为
NULL
,对象 B 根据定义也会定义它。

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

© www.soinside.com 2019 - 2024. All rights reserved.