我之前没有写过OOP代码,我总是试图避免额外的击键。无论如何,我正在冒险,因为它应该提高可读性。
无论如何,我无法让我的课程能够访问彼此的方法。
这是我的设置:
$conf = new Conf(); // boot up!
// Include dependencies, system files and other functions
require_once $conf->getIncludePath() . 'error.php';
require_once $conf->getIncludePath() . 'pool.php';
require_once $conf->getIncludePath() . 'database.php';
require_once $conf->getIncludePath() . 'api.php';
require_once $conf->getIncludePath() . 'user.php';
require_once $conf->getIncludePath() . 'forms.php';
require_once $conf->getIncludePath() . 'page.php';
require_once $conf->getIncludePath() . 'resources.php';
$error = new Error();
$pool = new Pool();
$db = new Database();
$api = new Api();
$user = new User();
$forms = new Forms();
$page = new Page();
$resources = new Resources();
我的问题是,如何获取它以便User
类中的方法可以在Database
中运行查询方法,以便获取其信息?
我知道在每个方法中都使用global $db; global $user; etc.
,但是我没有办法在不想每次使用它们的情况下重新声明这些变量吗?
由于
墩
答案 0 :(得分:2)
使用对象所以不仅仅是可读性。
我没有对这背后的原因进行全面解释,我强烈建议进一步研究该主题。从为什么开始使用它们以及它们解决的问题(并导致!)。
关于你的问题:
你有大量的对象应该真正能够彼此“交谈”。
我们可以说User
上Database
类依赖。要解决此依赖关系,我们需要能够在Database
(正确的范围)的上下文中引用User
。
有几种方法可以实现这一点,但通常的做法是在User
类中定义成员变量,并使用setter和getter设置属性的值。这被称为injecting the dependencies。
例如:
class User {
protected $database;
public function getDatabase()
{
return $this->database;
}
public function setDatabase(Database $database) {
$this->database = $database;
}
public function getUsers()
{
$sql = 'SELECT * FROM user';
return $this->getDatabase()->execute($sql);
}
}
您的客户端代码将变为:
$db = new Database();
$user = new User();
$user->setDatabase($db);
请注意,上面的例子充其量是一个人为的设法 - 根据User
制作Database
类将是一个设计决定,将导致你的其他问题 - 我的东西认为你需要研究。
答案 1 :(得分:1)
您可以创建一个新类DBHandler
,将Database
类的实例存储到您想要的每个其他类中。
例如:
class DBHandler {
public static $db;
public static function init($db) {
self::$db = $db;
}
}
$db = new Database();
DBHandler::init($db);
然后,您只需使用extends
关键字从此类继承。
即:
class User extends DBHandler {
// ... your code here ...
}
这是您如何实施dependency injection。
的示例如果您使用__autoload()
功能,则无需每次require
课程。
例如,您可以执行此操作以自动解决依赖关系:
function __autoload($classname) {
require_once $classname . ".php";
}
答案 2 :(得分:0)
按照nettuts+的教程引导我写下这个:
// load configuration
require_once 'includes/class.conf.php';
$conf = new Conf(dirname(__FILE__));
// dependency class
$conf->registerRequiredFile('dependencies');
$dependencies = new Dependencies();
// start registering dependencies
$conf->registerRequiredFile('error');
$error = $dependencies->error = function(){ // error
$error = new Error();
$error->conf = $conf;
return $error;
};
$conf->registerRequiredFile('pool');
$pool = $dependencies->pool = function(){ // error
$pool = new Pool();
$pool->db = $db;
$pool->user = $user;
$pool->error = $error;
// etc. any other dependencies
return $pool;
};
它工作正常,第一个conf文件包含registerRequiredFile方法,然后根据给定的参数require_once一个uri。
感谢您帮助我指明正确的方向!