我一直在努力转移到PHP中的OOP。我在php.net上阅读了解释,但我希望我能在这里得到一些具体的答案。
我尝试创建以下示例来说明我的问题。假设我有“数据库”,“产品”和“用户”类,我想在用户有权访问时显示产品。
所以我调用“Products”类“showProducts()”函数,该函数又创建“User”类的实例,该类创建“Database”对象的实例并检查用户访问级别。
如果用户具有访问权限,则“showProducts()”函数会创建“Database”对象的另一个实例,并查询数据库。
class Database{
public function query(){
//runs query here
}
public function __construct() {
//sets up connection here
}
}
class User{
public function checkAccess(){
$db = new Database();
$db->query( //pass in query to check access )
//does stuff, then returns true or false
}
}
class Products{
public function showProducts(){
$user = new User();
if($user->checkAccess())
$db = new Database();
$db->query( //pass in query to get products )
}
}
我希望有人可以用正确的方式说明如何做到这一点。
我想要某种控制器类,它创建一个“数据库”对象,可供所有需要访问它的类使用,而不必创建“Database”对象的多个实例。我希望用户类能够做同样的事情,因此所有类都可以访问一个$ users对象,而不必在每次需要使用“User”类中的内容时创建新对象。
如果我的问题不明确,我道歉,并提前感谢任何回复!!
感谢所有人的回复!
答案 0 :(得分:12)
将表单过程转换为面向对象的编程时,您应该掌握更多,然后才能构建类。 OOP不是在编写类,而是在OOP中遵循最佳实践,原则和模式。
您不应该在另一个内部实例化新对象,您应该通过构造函数或setter方法提供User对象,User所依赖的Database对象。这称为依赖注入。目标是通过构造函数或setter方法将对象赋予需要它们的类。它们应该从该类外部实现,因此更容易配置类。在构建类时,您希望很容易看到该类具有哪些依赖项。您可以在此处阅读有关控制反转原理的信息:IoC
那么你的代码就像这样:
<?php
// User object that depends on Database object, and expects it in constructor.
class User
{
protected $database;
public function __construct($database)
{
$this->database = $database;
}
// -- SNIP --
}
?>
现在要使用该用户类:
<?php
$database = new Database($connParams);
$user = new User($database);
?>
你也可以使用setter方法使用依赖注入来设置依赖关系,但Il允许你自己google:)
多数民众赞成,读到有关控制反转原理,以及依赖注入和依赖注入容器,这些是管理类的最佳方法。
我见过许多PHP代码都是“OOP”,实际上他们只使用Classes作为功能名称空间:)所以请大侠了解OOP原则和模式。
玩得开心! :)
答案 1 :(得分:2)
不要在构造函数或其他方法中实例化对象。将它们作为参数传递,最好在称为工厂的不同类中。这样可以轻松测试代码,还可以轻松创建对象。
另外,不要试图使用单身人士。这是“全局变量”的面向对象版本,您不希望使用全局变量。它使您的代码测试变得非常困难,几乎不可能。
观看此视频http://www.youtube.com/watch?v=-FRm3VPhseI,了解使用单身人士的原因。特别是19:00的CreditCard示例值得关注。
如果你真的想做最先进的,请看看“依赖注入”的概念。从本质上讲,将外部需要的东西传递给一个类是完全的秘密,但是有一些框架会自动为你做这些,所以你不必再自己编写工厂了。这些被称为“依赖注入容器”或“DIC”。
答案 2 :(得分:0)
要为所有代码创建一个对象,请使用Singleton pattern:
class Database{
private $db_descriptor;
private function __construct(){
/* connect and other stuff */
}
public static function getInstance(){
static $instance;
if($instance === null){
$instance = new self();
}
return $instance;
}
}
你可以使用相同的技术与用户,我说更多与PHP 5.4你可以使用1特征单身模式。 最后一个提示:当你使用数据库和其他繁重的东西时,使用称为lazy initialization的技术。当你提高你的OOP技能时,请看Doctrine Project,他们会大量使用这些技巧!