我目前在PHP中工作,并已开始利用类 - 我正在学习很多东西,但是我仍然有我的“便士下降”时刻 - 我正在努力与对象交互。PHP OOP-对象互动
我真的很感谢关于一个对象如何与另一个对象进行交互的一些澄清。作为一个非常基本的例子,如果我有一个处理连接和查询数据库的数据库对象,其他类应该如何访问由数据库对象执行的查询结果?
从我的理解到目前为止,我可以看到2个选项。无论是数据库类内的查询结果可公开访问,并传递到其他对象作为参数...
$databaseObject = new DatabaseObject;
$databaseObject->query("query goes here");
$newObject = randomObject;
$newObject->doStuff($databaseObject->query())
或依赖查询结果的对象本身内实例化新的数据库对象,因此该结果包含内目的。
class databaseConnection {
public $queryResults;
function __construct {
connect to database...
}
function query {
perform queries...
$this->queryResults = query results
}
}
class NewObject
{
function doStuff() {
$db = new databaseConnection
do stuff with $db->queryResults
}
}
选项1似乎错了,因为在数据库中的类属性是全球可用,而选项2似乎矛盾的类只能保存与它们定义对象的方法和属性的想法。
我可以想到很多其他的例子。如果我创建一个负责在整个系统中管理用户的类,那么负责其他任务的类需要知道用户拥有什么特权级别,我是否在全局用户类中创建该特性并将其传递给其他类?其他类是否实例化新的用户对象?
任何帮助非常感谢。
阅读有关依赖注入的内容 – bxN5
封装是一个重要的OO概念。您不需要关心数据来自何处,您只需要从数据对象之外的数据中获取数据,并让它担心数据的来源和方式。最简单的解决方案是将结果作为SQL行返回,但如果将其转换为关联数组,则派生对象可以使用任何数据库,xml文件,平面文件,curl call *,并且其他代码都不会知道或关心哪一个*。 – Mike
我不是将查询结果保留在数据库对象中,而是从查询方法中返回它。我有像queryArray,queryScalar,queryColumn和queryRow以不同方式返回结果集的方法,以及queryExec用于插入/更新/删除语句。如果您需要一次访问多个结果集,那么在数据库对象中保留结果会让重复使用同一连接进行多个查询变得很麻烦。 – reaanb