很难解释这种情况,但请看例子.
我编写了一个加载页面的网站,我初始化了一个数据库类.我将此类作为函数参数发送给需要访问数据库的任何函数.
我知道这是不好的方法,但目前我不知道如何以任何其他方式做到这一点.你能帮我么.
例
class sms {
function log_sms($message, $db) {
$sql = "INSERT INTO `smslog` SET
`mesasge` = '$message'
";
$db->query($sql);
if ($db->result)
return true;
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在主页上..
$db = new db(username,pass,localhost,dbname);
$sms = new sms;
$sms->log_sms($message, $db);
Run Code Online (Sandbox Code Playgroud)
有没有比这更好的方法?
有多种选择如何解决依赖问题(对象A需要对象B):
构造函数注入
class Sms {
function __construct($db) ....
}
$sms = new Sms (new MyDbClass);
Run Code Online (Sandbox Code Playgroud)
二传手注射
class Sms {
protected $db;
}
$sms = new Sms;
$sms->db = new MyDbClass;
Run Code Online (Sandbox Code Playgroud)
'注册'模式
class Registry {
static function get_db() {
return new MyDbClass;
}}
class Sms {
function doSomething() {
$db = Registry::get_db();
$db->....
}}
Run Code Online (Sandbox Code Playgroud)
'服务定位器'模式
class Loader {
function get_db() {
return new MyDbClass;
}}
class Sms {
function __construct($loader) {
$this->loader = $loader;
function doSomething() {
$db = $this->loader->get_db();
$db->....
}}
$sms = new Sms(new Loader);
Run Code Online (Sandbox Code Playgroud)
自动化基于容器的依赖注入,请参阅http://www.sitepoint.com/blogs/2009/05/11/bucket-is-a-minimal-dependency-injection-container-for-php
interface DataSource {...}
class MyDb implements DataSource {...}
class Sms {
function __construct(DataSource $ds) ....
$di = new Dependecy_Container;
$di->register('DataSource', 'MyDb');
$sms = $di->get('Sms');
Run Code Online (Sandbox Code Playgroud)
仅举几例;)
我之前给你的福勒的文章也非常值得一读
| 归档时间: |
|
| 查看次数: |
1224 次 |
| 最近记录: |