Php 如何使一个类分布在多个源文件中?
我目前正在从事一个PHP项目,其中包括广泛的数据库使用。基本内容是:我有一个遵循工厂模式的Php 如何使一个类分布在多个源文件中?,php,oop,design-patterns,Php,Oop,Design Patterns,我目前正在从事一个PHP项目,其中包括广泛的数据库使用。基本内容是:我有一个遵循工厂模式的PDOFactory类和一个带有静态方法的抽象SQL类(只是这些方法的一个容器),它们依次与PDOFactory 正如我所说,该项目涉及广泛的数据库使用,因此SQL类将包含许多方法。但是,可以根据它们处理的内容(即会话存储、用户登录/注销等)轻松地对它们进行分组。这将使SQL类更易于维护,等等。这里有一个大问题:我能把类内容的来源分布在多个文件中吗?这个问题可能(至少)有两种可能的解决方案: 多重继承,即
PDOFactory
类和一个带有静态方法的抽象SQL
类(只是这些方法的一个容器),它们依次与PDOFactory
正如我所说,该项目涉及广泛的数据库使用,因此SQL
类将包含许多方法。但是,可以根据它们处理的内容(即会话存储、用户登录/注销等)轻松地对它们进行分组。这将使SQL类更易于维护,等等。这里有一个大问题:我能把类内容的来源分布在多个文件中吗?这个问题可能(至少)有两种可能的解决方案:
- 多重继承,即拥有类
,SQLSession
,SQLUser
,并使SQLblahblah
类继承所有这些类SQL
- 与C++类似的预处理器*指令,即
#包括SQLSession.php代码>或类似的东西
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:超文本预处理器。它部分是一个预处理器(或者更像一个编译器),因为代码首先被“编译”成字节码,然后被执行