我目前正在使用PHP并且已经开始使用课程 - 我正在学习很多东西,但是我还没有得到我的" penny drop"那一刻 - 我正在努力与对象互动。
我非常感谢有关一个对象如何与另一个对象互动的一些澄清。作为一个非常基本的例子,如果我有一个处理连接和查询数据库的数据库对象,其他类应如何访问数据库对象执行的查询结果?
从我的理解到目前为止,我可以看到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似乎与类只应包含与它们定义的对象相关的方法和属性的想法相矛盾。
我可以想到许多其他的例子。如果我创建一个负责在整个系统中管理用户的类,但是负责其他任务的类需要知道用户具有什么特权级别,我是否要在全局用户类中创建该属性并将其传递给其他类?其他类是否实例化新的用户对象?
任何帮助都非常感激。
答案 0 :(得分:0)
数据库类中的查询结果可以公开访问
这(对我来说)是答案的关键。如果在实例中设置或更改值,则这意味着您要在基础数据集中设置值(尽管您可能会考虑推迟写入)。请注意,魔术方法允许您隐式地将操作与get和set操作相关联。但并非每个查询都是可更新的。如果你的sql被烘焙,那么你可以在设计时确定可更新性。
另外,我建议您的查询对象有一组与之关联的记录对象,您可以在其中与基础数据进行交互。如果它是一个工厂(支持多个查询)和创建查询结果对象,那么仅将连接功能与查询捆绑在一起才有意义。而查询(结果)对象应该可能实现迭代器接口。
pdo和mysqli都将连接,查询和结果分隔成单独的对象 - 这是有充分理由的。
答案 1 :(得分:-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();
首先,您希望只获得一次数据库连接,而不是每次都打开它。
其次,使用相同的数据库连接对象,您可以运行多个查询,如上例所示。
无论您使用多少其他课程,您都将获得单一连接。