【问题标题】:Class is not inheriting DB correctly类没有正确继承 DB
【发布时间】:2013-11-17 10:48:50
【问题描述】:

所以我有一个看起来像这样的 DB 类

class db{

    private $hostname = 'localhost';
    private $username = 'root';
    private $password = 'root';
    private $con;

    public function db(){
        try {
            $dbh = new PDO("mysql:host=$this->hostname;dbname=myDB", $this->username, $this->password);
        }catch(PDOException $e){
            echo $e->getMessage();
            exit();
        }
        $this->con = $dbh;
        echo 'Connected to database<br />';
    }

还有我的 index.php

include('db.class.php');
include('todo.class.php');
include('dressTemplate.inc.php');

$db = new db;

$todo = new todo($db);

我的 todo.class.php 是这样开始的

class todo{

function todo(db $db){
    $this->db = $db;
} 

public function render($post) {

    $db &= $this->db;

但后来我收到了这个通知

Notice: Undefined variable: db in todo.class.php on line 11

Notice: Object of class db could not be converted to int in todo.class.php on line 11

如何在 todo.class.php 中正确定义 db?

【问题讨论】:

  • 你为什么不使用__construct()
  • 我只是习惯使用类名作为构造函数,但似乎 __construct 是最佳实践。

标签: php oop pdo


【解决方案1】:

您正在使用&amp;=。这等于$db = $db &amp; $this-&gt;db。第一个通知就在那里,因为 PHP 对 $db 一无所知(它尚未声明)。第二个通知是因为你正在尝试做(null) &amp; (object)。首先将首先转换为int,然后显然会出现“无法转换对象”(因为PHP会尝试将整个表达式视为int

就是这样:您的对象变量设置正确,但您的 $db 变量是本地变量,与它无关。你正在通过&amp; (bitwise AND) 对对象做一些奇怪的事情

提示:不要使用旧的 PHP4 方式来定义类构造函数 - 除非您使用的是 PHP4。在 PHP5 中有 __construct() 魔术方法。

【讨论】:

    【解决方案2】:

    试试这个:

    class todo {
    
      var $db;
    
      __construct(&$db) {
        $this->db = $db;
      }
    
      public function render($post) {
        $db = &$this->db;
      }
    }
    

    【讨论】:

      【解决方案3】:

      您的待办事项类应该使用__construct 或带有类名的公共函数,例如

      class todo {
      
          var $db;
      
          __construct (db $db) {
              $this->db = $db;
          }
      
          // OR
      
          public function todo(db $db){
              $this->db = $db;
          } 
      
          ...
      }
      

      【讨论】:

        【解决方案4】:

        您应该使用公共构造函数:__construct() 这对我来说很好:

        class db{
        
            private $hostname = 'localhost';
            private $username = 'root';
            private $password = 'root';
            private $con;
        
            public function __construct(){
                try {
                    $dbh = new PDO("mysql:host=$this->hostname;dbname=myDB", $this->username, $this->password);
                }catch(PDOException $e){
                    echo $e->getMessage();
                    exit();
                }
                $this->con = $dbh;
                echo 'Connected to database<br />';
            }
        }
        
        
        
        class todo{
        
            public function __construct(db $db){
                $this->db = $db;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-12
          • 1970-01-01
          • 1970-01-01
          • 2016-02-09
          • 2016-06-06
          • 1970-01-01
          相关资源
          最近更新 更多