Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.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_Inheritance_Object_Abstract - Fatal编程技术网

具有公共祖先冗余的PHP抽象对象设计

具有公共祖先冗余的PHP抽象对象设计,php,oop,inheritance,object,abstract,Php,Oop,Inheritance,Object,Abstract,我帮助设计和实现了用PHP编写的DroidAPI。虽然它工作得很好,但我总是希望重构我的代码 在具有共同祖先的其他对象中包含对象可以吗 这可能是一个基本问题,但我似乎找不到信息来支持这是否是一个糟糕的做法 目标是让类foo为所有人提供公共常量和方法 例如: abstract class foo { //constants //common methods to all }

我帮助设计和实现了用PHP编写的DroidAPI。虽然它工作得很好,但我总是希望重构我的代码

在具有共同祖先的其他对象中包含对象可以吗

这可能是一个基本问题,但我似乎找不到信息来支持这是否是一个糟糕的做法

目标是让类foo为所有人提供公共常量和方法

例如:

            abstract class foo {
             //constants
             //common methods to all
            }

            class bar extends foo{
             //represents something
            }

            class widget extends foo {
             //represents something else
            }

            class controller extends foo{
                //controls flow
                public function __construct(){
                    $this->my_bar= new bar();
                    $this->my_widget= new widget();
             }
            }
类bar和widget可能不需要扩展foo,但如果不发送参数,这些对象中的方法将不知道foo知道的常见事情


看起来冗余太多了,只是在寻找最佳实践。

如果它对您的应用程序有意义,那么就没有问题

举例来说,这正是PHP的DOM库的结构。几乎所有东西都是一个节点——文档、元素、属性和字符数据。它们都共享祖先
DOMNode
,即使它们彼此嵌套


因此,如果它真的有意义(这在你的抽象例子中很难说),那么绝对没有理由不这样做。事实上,如果各种对象共享功能,这可能是“最佳实践”。

创建一个框架需要大量的尝试,这会让你跌倒,然后重新站起来

关于你的问题,最重要的是确保你不会落入利斯科夫替代原则所描述的陷阱:

“如果它像鸭子一样嘎嘎作响,看起来像鸭子,但需要电池,它就会 可能是只鸭子,但可能不是。”

Liskov原理很简单,请确保在扩展时 有些事,你没有改变班级的合同。如果一个班级 用于返回函数中的某个内容,并对其进行扩展以返回 完全不同的是,用户将如何适应? 因为您提供了 一个类,它标识为它扩展的基类,但它不是 表现得像基类一样,增加了函数性

我最建议的是,您总是尽量使您的类层次结构尽可能现实,但始终记住坚实的原则。有关SOLID的更多信息,请访问我的博客:


祝你好运,谢谢。我正在尝试将我们的店铺转换为OO风格,我希望能有一个良好的开端。谢谢你的回答和链接。