即使数据成员初始化了,也不会初始化


data members are not initialized even though they are

我是一个Java程序员试图在PHP编码,我有点困惑。我使用Netbeans作为我的IDE,有$host, $user, $pass和$db的警告消息,说这些数据成员没有初始化,即使它们是。

class Database {
    private $host = "localhost";
    private $user = "MYDATABASE";
    private $pass = "MYPASSWORD";
    private $db = "MYDATABASE";
    private $con = null;
    function connect() {
        $con = pg_connect("host=$this->$host dbname=$this->$db user=$this->$user password=$this->$pass")
                or die("Could not connect to server'n");
    }
    function disconnect() {
        pg_close($this->$con);
    }
}
当我使用下面的代码运行脚本时,我得到以下错误消息
<?php
require_once "./helpers/Database.php";
$database = new Database();
$database->connect();
?>

"PHP可捕获的致命错误:类Database的对象无法在/var/www/mysit/helpers/Database. PHP第13行转换为字符串"

您使用属性的语法是错误的,应该是$this->foobar

"host={$this->$host}..."

你有两个问题。

第一个原因(错误的原因)是没有{大括号}。这意味着PHP试图将"$ This"作为字符串计算,然后是字符串字面量"->",然后是"$host"作为字符串计算。使用{大括号}是很好的做法,但如果第二个问题得到纠正,则不是严格必要的。

第二个问题是,当您想要数据库对象的"host"属性时,您正在使用"$host"变量。它说,有了$,计算$host变量("localhost"),然后查找数据库对象的"localhost"属性(没有)。通过省略$,您可以引用"host"对象属性,而不是由$host变量命名的属性。

这将创建一个连接字符串,您可以使用它传递给pg_connect():

$dsn = sprintf("host='%s' dbname='%s' user='%s' password='%s'",
    addcslashes($this->host, "'''"),
    addcslashes($this->db, "'''"),
    addcslashes($this->user, "'''"),
    addcslashes($this->pass, "'''")
);

它消除了双引号字符串中$this->host等表达式的歧义,并将每个参数封装在单引号中,以便它支持空格或空值。