无法访问空属性php类

无法访问空属性php类,php,oop,Php,Oop,我试图学习OOP,以及它的一些概念。我为用户提供了以下课程: class Users { private $host = DB_HOST; private $user = DB_USERNAME; private $pass = DB_PASSWORD; private $dbname = DB_NAME; private $conn; private $stmt;

我试图学习OOP,以及它的一些概念。我为用户提供了以下课程:

    class Users
    {

        private $host   = DB_HOST;
        private $user   = DB_USERNAME;
        private $pass   = DB_PASSWORD;
        private $dbname = DB_NAME;

        private $conn;
        private $stmt;
        public  $error;

        function __construct()
        {
            $dsn = 'mysql:host='.$this->host.';dbname='.$this->dbname.';charset=utf8';
            $options = array(
                PDO::ATTR_PERSISTENT => true,
                PDO::ATTR_ERRMODE    => PDO::ERRMODE_EXCEPTION
            );
            try {
                $this->conn = new PDO($dsn,$this->user,$this->pass,$options);
            } catch (PDOException $e) {
                $this->error = $e->getMessage();
            }
        }

        private function mysql_execute_query($sql,$params)
        {
            $this->stmt = $this->conn->prepare($sql);
            $this->stmt->execute($params);
            return $this->$stmt;
        }

        public function find_user_by_provider_uid($provider,$provider_uid)
        {
            $sql = 'SELECT * FROM users WHERE provider = :provider AND provider_uid = :provider_uid LIMIT 1';
            $params = array(
                ':provider'     => $provider,
                ':provider_uid' => $provider_uid
            );
            $result = $this->mysql_execute_query($sql,$params);
            return $result->fetch();
        }
}
首先,您是否想到了一些技巧来更好地构建代码?还是使用oop的更多功能

第二,它失败,出现以下错误:

PHP注意:未定义变量:stmt PHP致命错误:无法访问空属性

这两行都表示返回$this->$stmt;在mysql内部执行查询

我的直觉是,这与它的私人功能有关。但我不知道

有什么想法吗?

这里是错误:

return $this->$stmt;
但应该是:

return $this->stmt;
下面是错误:

return $this->$stmt;
但应该是:

return $this->stmt;
下面是错误:

return $this->$stmt;
但应该是:

return $this->stmt;
下面是错误:

return $this->$stmt;
但应该是:

return $this->stmt;


您在一种情况下使用了
$this->stmt
,在另一种情况下使用了
$this->$stmt
。你没有看到区别吗?@zerkms我真的是瞎的。@Slaven请在你的类中注入一个完整的PDO实例,而不是每次构造
用户的实例时都创建一个新的DB连接。还有,你为什么要用仿真的prepares?@slaven是的,没错。由于5.1之前的MySQL版本不支持预处理语句,因此默认情况下启用了模拟。你可以说这是一个暂时性问题的很短的补丁。PHP核心团队对向后兼容性有一种讨厌的崇拜=/另一方面,当您通过
execute()
传递参数时,它们都被绑定为
PDO::PARAM_STR
。你可能想看看int-PDO的
bintParam()
方法,因为你的一些值看起来有点像整数,应该这样绑定。不,我的意思是在构造函数中。基本上,您需要
$user=newusers(newpdo('mysql:…',$user,$pass))
或更好:
$pdo=新pdo(…)$用户=新用户($pdo)$文档=新文档($pdo)。。etc
。这样,您可以在多个对象之间共享同一个连接实例。当您将对象作为参数传递时,它不会被复制。您在一种情况下使用了
$this->stmt
,在另一种情况下使用了
$this->$stmt
。你没有看到区别吗?@zerkms我真的是瞎的。@Slaven请在你的类中注入一个完整的PDO实例,而不是每次构造
用户的实例时都创建一个新的DB连接。还有,你为什么要用仿真的prepares?@slaven是的,没错。由于5.1之前的MySQL版本不支持预处理语句,因此默认情况下启用了模拟。你可以说这是一个暂时性问题的很短的补丁。PHP核心团队对向后兼容性有一种讨厌的崇拜=/另一方面,当您通过
execute()
传递参数时,它们都被绑定为
PDO::PARAM_STR
。你可能想看看int-PDO的
bintParam()
方法,因为你的一些值看起来有点像整数,应该这样绑定。不,我的意思是在构造函数中。基本上,您需要
$user=newusers(newpdo('mysql:…',$user,$pass))
或更好:
$pdo=新pdo(…)$用户=新用户($pdo)$文档=新文档($pdo)。。etc
。这样,您可以在多个对象之间共享同一个连接实例。当您将对象作为参数传递时,它不会被复制。您在一种情况下使用了
$this->stmt
,在另一种情况下使用了
$this->$stmt
。你没有看到区别吗?@zerkms我真的是瞎的。@Slaven请在你的类中注入一个完整的PDO实例,而不是每次构造
用户的实例时都创建一个新的DB连接。还有,你为什么要用仿真的prepares?@slaven是的,没错。由于5.1之前的MySQL版本不支持预处理语句,因此默认情况下启用了模拟。你可以说这是一个暂时性问题的很短的补丁。PHP核心团队对向后兼容性有一种讨厌的崇拜=/另一方面,当您通过
execute()
传递参数时,它们都被绑定为
PDO::PARAM_STR
。你可能想看看int-PDO的
bintParam()
方法,因为你的一些值看起来有点像整数,应该这样绑定。不,我的意思是在构造函数中。基本上,您需要
$user=newusers(newpdo('mysql:…',$user,$pass))
或更好:
$pdo=新pdo(…)$用户=新用户($pdo)$文档=新文档($pdo)。。etc
。这样,您可以在多个对象之间共享同一个连接实例。当您将对象作为参数传递时,它不会被复制。您在一种情况下使用了
$this->stmt
,在另一种情况下使用了
$this->$stmt
。你没有看到区别吗?@zerkms我真的是瞎的。@Slaven请在你的类中注入一个完整的PDO实例,而不是每次构造
用户的实例时都创建一个新的DB连接。还有,你为什么要用仿真的prepares?@slaven是的,没错。由于5.1之前的MySQL版本不支持预处理语句,因此默认情况下启用了模拟。你可以说这是一个暂时性问题的很短的补丁。PHP核心团队对向后兼容性有一种讨厌的崇拜=/另一方面,当您通过
execute()
传递参数时,它们都被绑定为
PDO::PARAM_STR
。你可能想看看int-PDO的
bintParam()
方法,因为你的一些值看起来有点像整数,应该这样绑定。不,我的意思是在构造函数中。基本上,您需要
$user=newusers(newpdo('mysql:…',$user,$pass))
或更好:
$pdo=新pdo(…)$用户=新用户($pdo)$文档=新文档($pdo)。。etc
。这样,您可以在多个对象之间共享同一个连接实例。当你传递一个对象作为参数时,它不会被复制。我重复我自己,我是瞎子:|我重复我自己,我是瞎子:|我重复我自己,我是瞎子:|我重复我自己,我是瞎子:|