PHP面向对象:抽象、接口、继承等
几周前,我开始练习OO PHP,我上了一些课,但我不知道我是否正确理解了这些概念。正因为如此,我想展示一些课程,如果有人能告诉我他们对它的看法并教我一些东西,我会非常高兴 如果你能解释你的评估和修改背后的原因,我将不胜感激,请记住。。。我正在学习:$ 我有一个产品目录,我们可以有多种类型的目录。目录基本上是产品类实例的集合 我为目录实现了一个基类,如下所示:PHP面向对象:抽象、接口、继承等,php,oop,Php,Oop,几周前,我开始练习OO PHP,我上了一些课,但我不知道我是否正确理解了这些概念。正因为如此,我想展示一些课程,如果有人能告诉我他们对它的看法并教我一些东西,我会非常高兴 如果你能解释你的评估和修改背后的原因,我将不胜感激,请记住。。。我正在学习:$ 我有一个产品目录,我们可以有多种类型的目录。目录基本上是产品类实例的集合 我为目录实现了一个基类,如下所示: class BaseCatalog { protected $_collection; protected $_count
class BaseCatalog
{
protected $_collection;
protected $_count;
public function __construct()
{
// some stuff here
}
public function getCount()
{
return $this->_count;
}
public function getProducts()
{
return $this->_collection;
}
}
后来,当我使用目录时,我扩展了这个类
class OrganicCatalog extends BaseCatalog implements InterfaceCatalog
{
protected $_collection;
protected $_count;
public function __construct()
{
parent::__construct();
// some more things here depending catalog type
}
// some more methods specific of this catalog type
最后是一个接口:
interface InterfaceCatalog
{
public function getCount();
public function getProducts();
}
对守则的一些质疑
- 所有目录类型都将具有相同的属性,它们之间的区别在于获取此信息的过程
- 接口将有所有目录类型都将实现的方法,但只有方法的原型(如果我要定义一些行为,我应该使用抽象类)是正确的吗
- 我认为基础产品永远不会被直接实例化,我在抽象地思考,但我一直在阅读,抽象不能修改属性。。。也许我可以把它保密
- 声明属性(集合、计数…)的正确方法是什么?只在基地?谁能解释一下吗
- 将访问器(getter和setter)放在基类中是正确的吗
定义了BaseCatalog
使用的所有函数。我会考虑编写<代码> BaseCalActudio<代码>实现<代码>接口>根据定义,它的每个子类也将是一个InterfaceCatalog
InterfaceCatalog
可能不应该有自己的OrganicCatalog
和$\u count
,因为它们在基类中受到保护(因此可供子类使用)李>$\u collection
如果您希望所有目录都扩展
BaseCatalog
,那么根本不需要该接口。它的主要用途是,如果您希望有一个自己管理一切的目录(即:它有自定义的getCount
和getProducts
方法)。这样做的类应该实现接口,而不是扩展基类。如果InterfaceCatalog
的实现不能始终像真正的目录一样工作,那么可能应该将该接口添加到中。到目前为止看起来相当不错
所有目录类型都将具有相同的属性,但
他们是获取这些信息的过程
听起来不错
接口将具有所有目录类型都将实现的方法,但
只有方法的原型(如果我要定义一些行为,我会
应该使用抽象类)是否正确
是的,没错
我认为基础产品永远不会被直接实例化,我
thinkink是抽象的,但我一直在读抽象不能
修改属性。。。也许我可以把它保密
这是不对的。抽象类可以很好地修改属性。因此,您当然可以将BaseCatalog
定义为抽象。此外,我还建议您使用BaseCatalog
实现InterfaceCatalog
声明属性(集合、计数…)的正确方法是什么?
只在基地?谁能解释一下吗
及
将访问器(getter和setter)放在基类中是正确的吗
这实际上取决于您对基类派生的预期需求。如果您认为所有派生都需要这些属性,并且还可以使用一些基本方法实现(getter),那么这是非常好的。我看这根本没什么问题
如果你甚至不想让导数覆盖这些方法,你可以将它们声明为
final
如果你想强制每个子类都有一个特定的方法,那么我不会使用接口,只需在父类中的方法前面加上“abstract”。@BaseCatalog实现InterfaceCatalog,OrganicCatalog只扩展BaseCatalog。。。有道理。非常感谢!!我问的其他要点正确吗?@DigitalPrecision如果我在baseproduct中设置抽象方法,那么类也将是抽象的。。。那么,如果类是抽象的,我可以在baseproduct的构造函数中使用数据库中的信息设置属性吗?@Sergi:abstract类可以修改属性——但它们只能(可靠地)修改自己的属性。他们不能乱搞子类的受保护和私有变量。但是,常规类也不能很好地做到这一点。@SergiGP:您是正确的,将方法设置为abstract会迫使您将父类设置为abstract。您仍然可以通过子类使用数据库中的信息设置属性。我不会用$\作为成员变量的开头,这是php4的回溯。非常感谢,非常完整的答案!!我将进一步调查和测试OO。再次感谢你在我的疑惑中花费/浪费时间:P