PHP OOP问题,附带一个示例

时间:2012-07-11 07:52:34

标签: php oop class

我知道有一些关于此问题的问题,但我需要一个更“具体”的例子和解决方案。

以下是我的示例
databse.class.php

class db{ 
   public function connect($conStr){...} 
} 

func.class.php

func class{ 
   public insert_song(){ 
      //ineed to use the conenct method from database 
      //then I would INERT INTO... 
   } 
}

问题:
1)我应该在func类中要求或扩展db类吗?
2)如果我需要,db类函数的范围是否仍然存在? (假设我在那里有私人变量,是否可以从外面访问?)

3 个答案:

答案 0 :(得分:5)

  • 不,您不应该要求或扩展数据库类。
  • 不,私有变量或方法永远不会在课外获得。受保护的变量仅适用于子类,公共变量是... public。

您可能需要在配置中的某个位置存放数据库类的文件,因此您可以随时随地实例化数据库类。但是,因为您可能只需要一个数据库对象实例,所以您可以在配置中实例化它并使用Dependency injection传递它。

这基本上意味着您将数据库对象传递给需要其中一个的其他对象。处理数据库对象的常用方法是使用Constructor injection,尽管setter注入也可以。

你做的是类似的事情:

// config:
$db = new Database;
$db->setConnectionValues();

$fooClass = new Foo($db);
$fooClass->insertSomething();

// fooClass:
class Foo
{
    private $db;

    public function __construct(Database $db)
    {
        $this->db = $db;
    }

    public function insertSomething()
    {
        $this->db->query("INSERT");
    }
}

这解决了大多数依赖性问题。

答案 1 :(得分:3)

// changed the class name, func is not good for a class name.
class Foo {
   protected $db;

   public setDb($db) {
     $this->db = $db;
   }

   public insert_song(){ 
      //ineed to use the conenct method from database 
      //then I would INERT INTO...
      $this->db->insert(...); 
   } 
}

示例:

// omited the error handling.
$db = new db();
$db->connect();
$foo = new Foo();
$foo->setDb($db);
$foo->insert_songs();

答案 2 :(得分:2)

作为抽象的一部分,您应该分离您的课程的职责。您的Database课程应关注您的Songs(您应该如何命名)课程。

如果您的Songs班级使用Database班级,您应该在构造函数中注入,如下所示:

<?php

class Database {
    public function connect($conStr) {
        /*
         * Connect to database here
         */
    }
}

class Songs {
    private $db;
    public function __construct(Database $db) {
        $this->db = $db;
    }

    public function insert_song($song) {
        /*
         * Now you can use $this->db as your database object!
         */
    }
}