从其他类和函数PHP访问类

时间:2013-09-26 15:45:03

标签: php class oop variables global

我之前没有写过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.,但是我没有办法在不想每次使用它们的情况下重新声明这些变量吗?

由于

3 个答案:

答案 0 :(得分:2)

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

我没有对这背后的原因进行全面解释,我强烈建议进一步研究该主题。从为什么开始使用它们以及它们解决的问题(并导致!)。

关于你的问题:

你有大量的对象应该真正能够彼此“交谈”。 我们可以说UserDatabase依赖。要解决此依赖关系,我们需要能够在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()函数

如果您使用__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。

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