php oop接口或抽象类

时间:2011-12-19 15:41:37

标签: php oop interface abstract-class php-5.3

请有人给我一个以下所需OOP结构的例子。

我想要一个主类(超类)(接口或抽象类?),其中从其扩展的所有其他类可以从主超类的实例调用它们的函数。

e.g。

class mainSupoerClass() {

}

class doWork exends mainSupoerClass(){
    public function addEntity(){
        //do stuff for entity
    }
}

我希望能够做到这一点:

$data = new mainSupoerClass;
$data->addEntity();  (doesnt belong to this class but its fetching the function from doWork class)

任何人都可以开始使用正确的OOP结构来开展这项工作吗?

4 个答案:

答案 0 :(得分:1)

这不会像你描述的那样起作用。 PHP(也没有任何其他语言)可以知道您引用的派生类。如果您实例化doWork而不是mainSupoerClass,则会有效。

我认为您正在寻找工厂模式,但我不确定。 使用该模式,您可以构建一个接口(接口或抽象类),并让工厂实例化该类的任何后代。

现在你的代码不需要知道它是哪个实例,因为它可以调用在接口/抽象基类中声明的任何方法。

在这方面,界面更灵活。如果创建抽象类,则需要从该类派生所有其他类。通常这不会是一个问题,但有时您需要一个全新的实现。在这种情况下,界面更好。您可以在完全不同的类中实现接口,并且仍然使用PHP的类型提示来验证传递给函数或方法的任何对象是否实现了接口。

答案 1 :(得分:1)

简单来说,你不能。您必须实例化扩展类,并且您将获得实例化类中的所有函数以及父类/类。

你有什么理由需要这样做吗?

答案 2 :(得分:0)

即使它被称为超类,也不意味着它具有在其他地方定义的所有类。方法如下:

[super] --> [concrete]

而不是

[concrete] --> [super]

因此,具体类扩展了超类。具体类将具有超类的所有内容以及具体类具有/覆盖的内容 - 但不是相反的方式。

class Super
{
    public function a() {}
}

class Concrete extends Super
{
    public function b() {}
}

Super::a(),此外Concrete::b()。但Super永远不会有::b()

此外,即使您有多个类,也总是有一个实例,无论它是多少个类,通常称为对象:

$object = new Concrete;

这会产生一个Concrete对象。

答案 3 :(得分:0)

你必须阅读。试试这些:

Article: http://sourcemaking.com/design_patterns/abstract_factory

Code: http://sourcemaking.com/design_patterns/abstract_factory/php/2

工厂设计模式似乎正是您所寻找的。

我不明白你为什么要这样做:

(doesnt belong to this class but its fetching the function from doWork class)

背后的原因是什么?