我目前正在构建一个包含父(基类)的许多扩展的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();
虽然创建一个对象的新实例并不完全是“世界末日”,但我的父类的构造函数非常大,因此,我不希望每页有多个实例...
结果,我只能看到另一个选项,我只需将必要的方法放入父类中......鉴于我的课程的工作方式,这不太实用!
因此,我想知道的是,您是否可以创建对象的实例,然后为其单独加载单独的扩展名?
或者,如果您能想出更好的实现方法,请随时提供您的观点......
答案 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);
//...