如何在PHP中构造类

时间:2012-10-09 19:30:04

标签: php oop class object

我一直在努力转移到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”类中的内容时创建新对象。

如果我的问题不明确,我道歉,并提前感谢任何回复!!

感谢所有人的回复!

3 个答案:

答案 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,他们会大量使用这些技巧!