【问题标题】:PHP variable scope: passing external objects to a classPHP 变量范围:将外部对象传递给类
【发布时间】:2012-11-15 02:02:25
【问题描述】:

我正在定义共享公共数据库的模型。但是,我无法通过require_once() 传递 PDO 对象。我收到以下错误:

Fatal error: Call to a member function prepare() on a non-object...

我猜这只是范围问题。我尝试在两个文件中将$database 声明为global,但这似乎不起作用。有什么想法吗?

common.php

$host = 'localhost';
$dbname = 'database';
$username = 'user';
$password = 'pass';

$database = new PDO("mysql:host=$host;dbname=$dbname", $username, $password, array(PDO::ATTR_PERSISTENT => true));

product.php

require_once('common.php');

class Product {

  function fetch_from_category($category) {
    $query = $database->prepare('SELECT * FROM product WHERE product.category = ?');
    $query->execute($category);
    return $query->fetchAll(PDO::FETCH_ASSOC);
  }

}

【问题讨论】:

  • $database 在类外定义;而且,与普通函数类似,您看不到类中的变量。要么按照 MrCode 的建议将其传递给班级,要么按照 Rawkode 的建议将其设置为全局(尽管不推荐)。

标签: php class pdo scope


【解决方案1】:

确实是范围问题,$database 内部没有定义Product::fetch_from_category。你应该在实例化它时将它传递给对象:

class Product {

  protected $database;

  public function __construct(PDO $database) {
      $this->database = $database;
  }

  public function fetch_from_category($category) {
      $query = $this->database->prepare('SELECT * FROM product WHERE product.category = ?');
      $query->execute($category);
      return $query->fetchAll(PDO::FETCH_ASSOC);
  }

}

...

require_once 'common.php';
require_once 'product.php';

$product = new Product($database);

【讨论】:

    【解决方案2】:

    $database 传递给类,然后将其存储为属性并使用$this->database 访问:

    class Product {
    
      protected $database;
    
      public function setDb($db)
      {
          $this->database = $db;
      }
    
      function fetch_from_category($category) {
        $query = $this->database->prepare('SELECT * FROM product WHERE product.category = ?');
        $query->execute($category);
        return $query->fetchAll(PDO::FETCH_ASSOC);
      }
    
    }
    
    $p = new Product();
    $p->setDb($database);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      • 2019-07-09
      • 2020-06-06
      • 2016-03-02
      相关资源
      最近更新 更多