2017-02-12 88 views
-1

我目前在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似乎矛盾的类只能保存与它们定义对象的方法和属性的想法。

我可以想到很多其他的例子。如果我创建一个负责在整个系统中管理用户的类,那么负责其他任务的类需要知道用户拥有什么特权级别,我是否在全局用户类中创建该特性并将其传递给其他类?其他类是否实例化新的用户对象?

任何帮助非常感谢。

+1

阅读有关依赖注入的内容 – bxN5

+0

封装是一个重要的OO概念。您不需要关心数据来自何处,您只需要从数据对象之外的数据中获取数据,并让它担心数据的来源和方式。最简单的解决方案是将结果作为SQL行返回,但如果将其转换为关联数组,则派生对象可以使用任何数据库,xml文件,平面文件,curl call *,并且其他代码都不会知道或关心哪一个*。 – Mike

+0

我不是将查询结果保留在数据库对象中,而是从查询方法中返回它。我有像queryArray,queryScalar,queryColumn和queryRow以不同方式返回结果集的方法,以及queryExec用于插入/更新/删除语句。如果您需要一次访问多个结果集,那么在数据库对象中保留结果会让重复使用同一连接进行多个查询变得很麻烦。 – reaanb

回答

-2
class Connection { 

    public static $conn; 

    public static function getInstance() { 
    if (!self::$conn) { 
     self::$conn = new Connection(); 
    } 

    return self::$conn; 
    } 

    public function query() { 
     echo "run your query here using self::\$conn object"; 
    } 
} 

class Person { 

    public function doStuff() { 
     $conn = Connection::getInstance(); 
     $results = $conn->query(); 
    } 
} 

$person = new Person(); 
$person->doStuff(); 

首先,你只想让你的数据库连接只有一次,而不是每次打开它。

其次,使用相同的数据库连接对象,可以运行多个查询,如上例所示。

无论您使用多少个其他类,您都将获得单个连接。

+0

如果您希望确保您一次不会连接到多个数据库(除非其连接工厂),则单例只是明智之举, – symcbean

0

无论是数据库类内的查询结果都可以访问公开

这(对我)的关键在于答案。如果您在实例中设置或更改了某个值,则这意味着您要设置基础数据集中的值(尽管您可能会考虑延迟写入)。请注意,魔术方法允许您隐式地将操作与get和set操作相关联。但并非每个查询都是可更新的。如果你的sql被引入,那么你可以在设计时确定可更新性。

此外,我建议您的查询对象有一组记录对象与它相关联,您与底层数据进行交互。如果是工厂(支持多个查询)并创建查询结果对象,那么在与查询相同的对象中绑定连接功能才有意义。查询(结果)对象应该可能实现迭代器接口。

pdo和mysqli都将连接,查询和结果分离为单独的对象 - 这是很好的理由。