1

我以前没有写过 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.在每一种方法中都使用过,但是有没有办法让我得到这些变量而不必每次我想使用它们时都重新声明它们?

谢谢

码头

4

3 回答 3

2

使用对象不仅仅是可读性。

在不对这背后的原因进行全面解释的情况下,我强烈建议对该主题进行进一步研究。从使用它们的原因以及它们解决(和导致!)的问题开始。

至于你的问题:

您有大量应该真正能够相互“交谈”的对象。我们可以说这个User依赖Database. 为了解决这种依赖关系,我们需要能够在(正确的范围Database的上下文中引用 。User

有几种方法可以实现这一点,但通常的做法是在User类中定义一个成员变量,并使用 setter 和 getter 设置属性的值。这被称为注入依赖项

例如:

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将是一项设计决策,这将导致您进一步遇到其他问题-我认为您需要研究的东西。

于 2013-09-26T16:03:21.200 回答
1

使用依赖注入!

您可以创建一个新类 ,它将您的类的实例DBHandler存储到您想要的每个其他类中。Database

例如:

class DBHandler {

  public static $db;
 
  public static function init($db) {
    self::$db = $db;
  }
}

$db = new Database();
DBHandler::init($db);

然后你只需要通过使用关键字从这个类继承。extends

IE:

class User extends DBHandler {
  // ... your code here ...
}

这是一个如何实现依赖注入的示例。


__autoload() 函数

如果您使用该功能,则无需require每次都需要上课。__autoload()

例如,您可以这样做来自动解决依赖关系:

function __autoload($classname) {
  require_once $classname . ".php";
}
于 2013-09-26T15:57:38.137 回答
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。

感谢您帮助我指出正确的方向!

于 2013-09-28T11:12:59.940 回答