Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP面向对象:抽象、接口、继承等_Php_Oop - Fatal编程技术网

PHP面向对象:抽象、接口、继承等

PHP面向对象:抽象、接口、继承等,php,oop,Php,Oop,几周前,我开始练习OO PHP,我上了一些课,但我不知道我是否正确理解了这些概念。正因为如此,我想展示一些课程,如果有人能告诉我他们对它的看法并教我一些东西,我会非常高兴 如果你能解释你的评估和修改背后的原因,我将不胜感激,请记住。。。我正在学习:$ 我有一个产品目录,我们可以有多种类型的目录。目录基本上是产品类实例的集合 我为目录实现了一个基类,如下所示: class BaseCatalog { protected $_collection; protected $_count

几周前,我开始练习OO PHP,我上了一些课,但我不知道我是否正确理解了这些概念。正因为如此,我想展示一些课程,如果有人能告诉我他们对它的看法并教我一些东西,我会非常高兴

如果你能解释你的评估和修改背后的原因,我将不胜感激,请记住。。。我正在学习:$

我有一个产品目录,我们可以有多种类型的目录。目录基本上是产品类实例的集合

我为目录实现了一个基类,如下所示:

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
    定义了
    InterfaceCatalog
    使用的所有函数。我会考虑编写<代码> BaseCalActudio<代码>实现<代码>接口>根据定义,它的每个子类也将是一个
    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