Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Design Patterns - Fatal编程技术网

Php 如何使一个类分布在多个源文件中?

Php 如何使一个类分布在多个源文件中?,php,oop,design-patterns,Php,Oop,Design Patterns,我目前正在从事一个PHP项目,其中包括广泛的数据库使用。基本内容是:我有一个遵循工厂模式的PDOFactory类和一个带有静态方法的抽象SQL类(只是这些方法的一个容器),它们依次与PDOFactory 正如我所说,该项目涉及广泛的数据库使用,因此SQL类将包含许多方法。但是,可以根据它们处理的内容(即会话存储、用户登录/注销等)轻松地对它们进行分组。这将使SQL类更易于维护,等等。这里有一个大问题:我能把类内容的来源分布在多个文件中吗?这个问题可能(至少)有两种可能的解决方案: 多重继承,即

我目前正在从事一个PHP项目,其中包括广泛的数据库使用。基本内容是:我有一个遵循工厂模式的
PDOFactory
类和一个带有静态方法的抽象
SQL
类(只是这些方法的一个容器),它们依次与
PDOFactory

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

  • 多重继承,即拥有类
    SQLSession
    SQLUser
    SQLblahblah
    ,并使
    SQL
    类继承所有这些类
  • 与C++类似的预处理器*指令,即
    #包括SQLSession.php或类似的东西
我知道PHP中有多重继承,因此排除了选项1。第二种选择可能吗?或者有人知道更好的解决方案吗

*或者实际上是预处理器指令,因为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"

?>

我想你可能是走错路了。这当然不是最好的解决办法。尝试将许多函数分解成更小的实用程序类,然后使用这些类组合成更大的类。

我认为您的做法可能是错误的。这当然不是最好的解决办法。尝试将许多函数分解成更小的实用程序类,然后使用这些类组合成更大的类。

  • 不要使用静态方法,因为它需要使用
  • 使用小类,这些类具有
      • 不要使用静态方法,因为它需要使用
      • 使用小类,这些类具有

        • 我认为您应该使用for-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
          
          SQLSession.php:

          <?php
          
          function SQLSessionStart()
          {
             ...
          }
          
          function SQLSessionEnd()
          {
             ...
          }
          

          我认为您应该使用for-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
          
          SQLSession.php:

          <?php
          
          function SQLSessionStart()
          {
             ...
          }
          
          function SQLSessionEnd()
          {
             ...
          }
          

          对我来说,这听起来像是你在试图创建一个整体式的代码块,这与基于类的OO代码完全相反-我建议遵循Java核心模式的基本原则,并在PHP中实现它,以实现你想要做的:)这应该涵盖所有你想问的问题,听起来你在试图创建一个整体式的代码块,这与基于类的OO代码完全相反-我建议遵循Java核心模式的基本原则,并在PHP中实现它,以实现你的目标:)这应该涵盖你所有的问题

          你说的是多重继承,对吗?或者我没有完全理解您的答案吗?您不必使用多重继承,尽管如果您的语言拥有这样的特性,这是一种选择。我在考虑更多的是让多个成员可以根据需要进行互动。或者,将功能组划分为不同的层,并构建一个类层次结构,其中每个新类在上一个类的基础上添加一个层。另一个选项(如果我理解正确的话)将涉及一个(最好是单例)类
          SQL
          ,该类将包含成员
          SESSION
          USER
          。。。这将是适当类的实例。然而,由于顶级类不能被声明为抽象类,因此这在某种程度上忽略了要点,每次调用函数时都必须实例化它。代码可读性将急剧下降。我无法再编辑我以前的评论,所以我将在这里写。谢谢你的想法,我将发布一篇关于我的问题的后续文章,涉及到你的想法。你说的是多重继承,对吗?或者我没有完全理解您的答案吗?您不必使用多重继承,尽管如果您的语言拥有这样的特性,这是一种选择。我在考虑更多的是让多个成员可以根据需要进行互动。或者,将功能组划分为不同的层,并构建一个类层次结构,其中每个新类在上一个类的基础上添加一个层。另一个选项(如果我理解正确的话)将涉及一个(最好是单例)类
          SQL
          ,该类将包含成员
          SESSION
          USER
          。。。这将是适当类的实例。然而,由于顶级类不能被声明为抽象类,因此这在某种程度上忽略了要点,每次调用函数时都必须实例化它。代码可读性将急剧下降。我无法再编辑我以前的评论,所以我将在这里写。谢谢你的想法,我将发布我的问题的后续内容,涉及你的想法。PHP是一个解释器,而不是预处理器。区别在于预处理器实际上并不执行任何代码。PHP代表PHP:超文本预处理器。它部分是一个预处理器(或者更像一个编译器),因为代码首先被“编译”成字节码,然后被执行