如何让一个类分布在许多源文件中?

时间:2010-07-06 19:19:18

标签: php oop design-patterns

我目前正在开发一个包含大量数据库用法的PHP项目。基础是:我有一个遵循Factory模式的PDOFactory类和一个带有静态方法的抽象SQL类(只是这些方法的容器),后者又与PDOFactory对话

正如我所说,该项目涉及广泛的数据库使用,因此SQL类将包含许多方法。但是,它们可以很容易地分组,这取决于它们处理的内容(即会话存储,用户登录/关闭等)。这将使SQL类更容易维护等等。这里有一个很大的问题:我可以将类内容的来源分布在多个文件中吗?这个问题可能有(至少)两种可能的解决方案:

  • 多重继承,即拥有类SQLSessionSQLUserSQLblahblah并使SQL类继承所有类。
  • C ++ - 类似于预处理器*指令,即#include SQLSession.php;或类似的东西。

我知道PHP中存在 no 多重继承,因此排除了第1选项。第2选项是否可行?或者有人知道这个问题的更好解决方案吗?

*或实际上是预处理前指令,因为PHP 是预处理器。 :)

编辑:

根据Kalium的建议,这是尝试回答这个问题。读起来很乱,但它确实有效。但是,我会坚持比尔的方法,因为它更干净。     

class SQL {

  private static $oInstance = false;
  public static function getInstance()
  {
    if( self::$oInstance == false )
    {
      self::$oInstance = new self();
    }
    return self::$oInstance;
  }

  public $SESSION;

  private function __construct()
  {
    $this->SESSION = new SESSION;
  }
}

// this would be in another file
class SESSION {
  public function printOne()
  {
    echo "One";
  }
}


SQL::getInstance()->SESSION->printOne(); // outputs "One"

?>

4 个答案:

答案 0 :(得分:2)

我认为你可能正在接近这个错误。这当然不是最好的方式。尝试将许多函数分解为更小的实用程序类,然后使用它们来组合更大的类。

答案 1 :(得分:1)

答案 2 :(得分:1)

我认为你应该使用Builder pattern作为SQL而不是静态方法的杂乱容器。

不,PHP中没有多重继承。改为使用委托。

不,您不能包含文件来定义类的方法。您只能在执行代码的上下文中包含文件,而不是在类定义的中间:

<?php

include("define-functions.php"); // OK

class Foo
{
  include("define-methods.php");  // ERROR

  function foo()
  {
    include("method-body.php"); // OK
  }
}

PHP Parse error:  syntax error, unexpected T_INCLUDE, expecting T_FUNCTION 
in foo.php on line 7

重新评论:

由于您只承诺使用静态方法,为什么还要使用类?只需在全局范围内定义函数即可。然后,您可以根据需要include()

<?php

include("SQLSession.php");
include("SQLUser.php");
include("SQLblahblah.php");

SQLSession.php:

<?php

function SQLSessionStart()
{
   ...
}

function SQLSessionEnd()
{
   ...
}

您无法使用此解决方案访问静态类成员数据,但您只能使用全局变量。

答案 3 :(得分:0)

对我来说,这听起来像是在尝试创建一个单片的代码块,这与基于类的OO代码完全相反 - 我建议遵循Java核心模式的DAO blueprint,并且用PHP实现它你想要做的事情:)应该涵盖你所有的问题