我如何从PHP中的另一个类调用变量?

时间:2017-06-19 12:46:21

标签: php pdo try-catch

开始用PHP创建登录系统。这是DB.php文件和RegisterController.php文件的片段。

  

db.php中       

class DB {
public $username = 'root',
       $password = '',
       $host     = '127.0.0.1',
       $dbname   = 'php',
       $options  = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');

public function connect() {

    try {
        $db = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->dbname . ';charset=utf8', $this->username, $this->password, $this->options);
    } catch(PDOException $e) {
        die('Failed to connect to the database' . $e->getMessage());
    }
}

}

  

RegisterController.php

<?php

require 'DB.php';

class RegisterController {

    public function Regiser() {
           try {
              $stmt = $db->prepare($query);
              $result = $stmt->execute($query_params);
           } catch(PDOException $e) {
              die('Failed to run query: ' .$e->getMessage());
           }

    }
}

我的问题是如何将DB.php中的$ db变量调用到寄存器文件中?我得到的错误是未定义的变量$ db&#39;,如果尝试通过执行链接

$db = new DB();

然后它开始说&#39;在课程DB()&#39;中找不到prepare()这是来自PHP的PDO。 我知道必须有一个简单的方法来做到这一点,但是,我觉得我在这里错过了大局。

1 个答案:

答案 0 :(得分:0)

你的意思是connect() 返回 PDO对象吗?像这样:

public function connect() {
    try {
        return new PDO('mysql:host=' . $this->host . ';dbname=' . $this->dbname . ';charset=utf8', $this->username, $this->password, $this->options);
    } catch(PDOException $e) {
        die('Failed to connect to the database' . $e->getMessage());
    }
}

然后,您的消费代码将创建DB的实例并调用connect()来获取该PDO对象。像这样:

$db = new DB();
$pdo = $db->connect();
$stmt = $pdo->prepare($query);
// etc.

面向对象的设计并非真正,这实际上只是为了将连接封装到方法中而创建一个DB对象。另一种选择是connect()可能是一个静态方法吗?或者DB包装所有数据库操作?

您可以查看各种模式。但这里最重要的是你不会像你想的那样“在一个类中访问一个变量”。该变量封装在该方法中,并且仅存在于该方法中。为了从该方法中获取值(在本例中为PDO对象),该方法将返回该值并且消耗代码将对该返回值进行操作。被引用的对象在这里是关键,而不是在任何给定时间恰好指向该对象的任何给定变量。