仅使用一个实例加载类的多个扩展

时间:2013-05-28 18:24:01

标签: php class oop object

简要说明

我目前正在构建一个包含父(基类)的许多扩展的Web应用程序。与以下结构非常相似:

Class A // Base Class
    -> Class B // Extension
    -> Class C // Extension
    // etc

扩展包含特定于站点区域的功能,因此,例如,我站点的“文档”部分将拥有自己的类(基类的扩展),并且此类将包含所有与打开,编辑,删除文件等相关的功能......

但是,我的应用程序的主导航菜单有一个交互式下拉列表,显示由几个“扩展”类中的方法收集的信息。

我的问题

目前,为了访问为我的导航菜单收集数据所需的所有方法,我必须创建几个扩展类的实例,如下所示:

require_once(class.a.php);
require_once(class.b.php);
require_once(class.c.php);

// Create an instance of Class B to get the data for the first dropdown
$b = new B();

// Gather the data for the first dropdown
$dropdown[0] = $b->get_document_data();

// Create an instance of Class C to get the data for the second dropdown
$c = new C();

// Gather the data for the second dropdown
$dropdown[1] = $c->get_settings_statistics();

虽然创建一个对象的新实例并不完全是“世界末日”,但我的父类的构造函数非常大,因此,我不希望每页有多个实例...

结果,我只能看到另一个选项,我只需将必要的方法放入父类中......鉴于我的课程的工作方式,这不太实用!

因此,我想知道的是,您是否可以创建对象的实例,然后为其单独加载单独的扩展名?

或者,如果您能想出更好的实现方法,请随时提供您的观点......

2 个答案:

答案 0 :(得分:0)

你可以赞成合成而不是固执:

 class A {
     public function __construct(){ /* heavy lifting here */ }

     public function coolSharedMethod(){}
 }

 class B {
     protected $a;
     public function __construct(A $myA){
          $this->a = $myA;
     }

     // proxy methods through
     public function coolSharedMethod(){
          return $this->a->coolSharedMethod();
     }
 }

如果A的初始化相同,但它包含需要根据具体情况进行更改的状态,则可能需要查看the prototype design pattern

 $a = new A();
 $b = new B(clone $a);
 $c = new C(clone $a);

答案 1 :(得分:-2)

我可能会为每个类使用泛型静态方法,并以IoC模式传递一个对象:

<?php

class A
{
    public static function init_nav_menu(&$menu_object)
    {
        // do nothing in base class
    }
}

class B extends A
{
    public static function init_nav_menu(&$menu_object)
    {
        // manipulate menu_object here, giving it info needed for dropdown
    }
}

// (load class files)

$menu = new stdClass;
B::init_nav_menu($menu);
//C::init_nav_menu($menu);
//...