我知道对此有一些问题,但我需要一个更"具体"的示例
和解决方案。
这是我的示例:
databse.class.php
class db{
public function connect($conStr){...}
}
函数.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类函数的作用域会保留吗?(比如说,如果我有一个私有变量,它可以从外部访问吗?)
- 不,您不应该要求或扩展数据库类
- 不,私有变量或方法永远不会在类之外可用。受保护的变量只能用于子类,公共变量是。。。公众
您可以在配置中的某个位置需要数据库类所在的文件,这样您就可以随时随地实例化数据库类。但是,由于您可能只需要数据库对象的一个实例,您可以在配置中实例化它,并使用依赖项注入传递它。
这基本上意味着将数据库对象传递给其他需要数据库对象的对象。处理数据库对象的一种常见方法是使用构造函数注入,尽管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");
}
}
这解决了大部分依赖性问题。
// 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();
作为抽象的一部分,您应该将类的职责分开。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!
*/
}
}