如何在OOP中访问变量

时间:2017-03-31 14:15:58

标签: php mysql oop pdo

我正在尝试找到一种方法来运行名为$connect的变量,但不知道如何运行。

文件名: /engine/init.php

class Engine {
    function MySQL() {
        $connect = new PDO("mysql:host=$db_host;dbname=$db_name;charset=$db_char", $db_user, $db_pass);
    }
}

文件名: /inc/database.php

require 'engine/init.php;
$engine = new Engine;
$conn = $engine->MySQL;
// Activate $connect variable

如果不清楚,请索取更多信息。

谢谢, CrAzYz _

2 个答案:

答案 0 :(得分:2)

您必须更新课程以访问外部成员。 你有几种选择。

1:将连接存储在public属性

class Engine {
    public $connection;

    public function MySQL() {
        $this->connection = new PDO("mysql:host=$db_host;dbname=$db_name;charset=$db_char",$db_user, $db_pass);
    }
}

这样你可以通过

检索它
$engine = new Engine();
$engine->MySQL();
$conn = $engine->connection;

2:使函数返回连接

class Engine {
    public function MySQL() {
        return new PDO("mysql:host=$db_host;dbname=$db_name;charset=$db_char",$db_user, $db_pass);
    }
}

通过这种方式,您的示例将起作用(如果您将Mysql用作函数):

$engine = new Engine();
$conn = $engine->MySQL();

3:更复杂但通常更好的方法:

class Engine {
    protected $connection;

    public function __construct($db_host, $db_name, $db_user, $db_pass $db_char = "utf-8") {
        $this->connection = new PDO("mysql:host=$db_host;dbname=$db_name;charset=$db_char",$db_user, $db_pass);
    }

    public function MySQL() {
        if ( !$this->connection instanceof PDO ) {
            throw new Exception("Connection is not set up");
        }

        return $this->connection;
    }
}

这几乎可以按照您的意愿工作,除了您无法直接访问连接(受保护),但只能通过MySql函数。这样,如果您忘记初始化连接,则会抛出异常。

$engine = new Engine("localhost", "db_name", "user", "pass");
$conn   = $engine->MySQL();  // you don't even need to save the connection to a local variable, because the function only references the connection and won't start a new one

脚注: 如果你不得不像这样的问题,你应该查阅并了解更多有关OOP的信息。对于php,这是一个开始:http://php.net/manual/en/language.oop5.php

答案 1 :(得分:0)

即将逃跑,所以这有点快。

class Engine
{
    public $db;

    public function connect($host, $database, $charset, $user, $pass) 
    {
        $this->db = new PDO("mysql:host=$host;dbname=$database;charset=$charset", $user, $pass);
    }
}

我们首先要创建您要创建的Engine类,我们已经在类上创建了一个名为db的属性,我们可以使用->db进行访问。我们还有一个名为connect的方法,我们将数据库变量传递给它,以便PDO可以连接到我们的数据库。

现在我们将数据库凭据传递给我们的connect方法,在生产环境中我真的建议不要对这些进行硬编码,而是使用类似环境变量的方法。

$engine = new Engine();
$engine->connect('127.0.0.1', 'example_database', 'UTF-8', 'root', 'root'); 

然后我们可以使用我们新发起的PDO连接,如下所示:

$statement = $engine->db->query('SELECT * FROM some_table');
$result    = $statement->execute();

至少应该给你一个起点,还有其他方法可以解决这个问题,但我不想偏离原始代码太远。

此外,如果有人发现任何错误,请告诉我,当我回来时我会更新它,需要在一秒钟内跑掉。