【问题标题】:How to access variables in OOP如何在 OOP 中访问变量
【发布时间】:2017-08-25 20:34:39
【问题描述】:

我正在尝试找到一种方法来让名为$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

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

谢谢, 呸呸呸_

【问题讨论】:

  • 首先MySQL() 不起作用,因为此时您还没有定义$db_host,..。然后如果你想得到 $connect 做return $connect; 但这是一个类映射器的一个坏例子。提示:绑定到$this->connect=connet() 并重复使用它。
  • 变量需要是类级别的,而不是方法级别的:php.net/manual/en/language.oop5.properties.php 或者您是否尝试返回变量?从用法上看不太清楚...
  • 坦率地说,这段代码毫无意义。你应该解释你想在这里做什么以及为什么。特别是什么是引擎,为什么你认为需要一个 mysql 方法
  • @JustOnUnderMillions 是的,我知道。我没有输入变量,因为这会导致数据库凭据泄漏。你的答案应该有修复,正在尝试。

标签: php mysql oop pdo


【解决方案1】:

您必须更新课程才能访问外部成员。 您有多种选择。

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

【讨论】:

    【解决方案2】:

    快要跑了,所以这有点快。

    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();
    

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

    另外,如果有人发现任何问题,请告诉我,我回来后会更新它,需要马上跑掉。

    【讨论】:

      猜你喜欢
      • 2015-12-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多