我知道有一些关于此问题的问题,但我需要一个更“具体”的例子和解决方案。
以下是我的示例:
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类函数的范围是否仍然存在? (假设我在那里有私人变量,是否可以从外面访问?)
答案 0 :(得分:5)
您可能需要在配置中的某个位置存放数据库类的文件,因此您可以随时随地实例化数据库类。但是,因为您可能只需要一个数据库对象实例,所以您可以在配置中实例化它并使用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!
*/
}
}