当我尝试在PHP中访问它时,类变量为null

时间:2014-08-01 16:37:18

标签: php variables object class-variables

好的,这是我的主要代码:

require "checkpassword.php";
require "mysqllogininfo.php";

# Validate password
if (!validatePassword($_GET["password"])) {
    return;
}

# Get variables
$uuid = $_GET["uuid"];
if (preg_match('/^\d+$/',$_GET["rank"]) == false) {
    die("Rank must be integer");
}
$rank = $_GET["rank"];

# Validate UUID
if ($uuid == null) {
    die ("Supply uuid");
}

# Validate rank
if ($rank == null) {
    die ("Supply rank");
} else if ($rank < 0 || $rank > 6) {
    die ("Invalid rank");
}

# Load MySQL login info
$loginInfo = new MySQLLoginInfo("/var/uniqraft/mysqllogin");

# Debug
# All this displays as just 3 empty lines, so I assume the variables are null <--
echo($loginInfo->host);
echo "<br>";
echo($loginInfo->username);
echo "<br>";
echo($loginInfo->password);
echo "<br>";
echo($loginInfo->dbname);

# Create connection
$connection = mysqli_connect($loginInfo->host, $loginInfo->username, $loginInfo->password, $loginInfo->dbname);

# Check connection
if (mysqli_connect_errno()) {
    die ("Failed to connect to MySQL: " . mysqli_connect_error());
}

正如您所看到的,我尝试访问MySQLLoginInfo对象中的变量host,username,password和dbname,但它们都显示为null。

然而,我并不认为它们实际上是空的。因为,如果我们看看MySQLLoginInfo对象,我们可以看到我添加了一些调试echo()来显示变量,我们发现它们实际上不是空的。

class MySQLLoginInfo
{
    # Properties
    public $host;
    public $username;
    public $password;
    public $dbname;

    # Constructor
    function __construct($infoLocation) {
        $handle = fopen($infoLocation, "r", false) or die("Couldn't open $infoLocation");

        $i = 0;
        # Loop through lines
        while (($line = fgets($handle)) !== false) {
            if ($i === 0)
                $host = $line;
            else if ($i === 1)
                $username = $line;
            else if ($i === 2)
                $password = $line;
            else if ($i === 3)
                $dbname = $line;
            else
                break; # Read at max 4 lines
            $i++;
        }
        if ($i < 3) {
            die($infoLocation . " doesn't contain at least 4 lines");
        }

        # These all display the proper values, indicating that they are not null <--
        echo $host;
        echo $username;
        echo $password;
        echo $dbname;
    }
}

最终输出如下:

  

localhost mcserver secret_password uniqraft_core

     

无法连接到MySQL:访问被拒绝用户&#39; www-data&#39; @&#39; localhost&#39; (使用密码:否)

请注意,2个文本之间有空行,来自主代码中echo()的输出。

所以,我的问题是,为什么变量存储在MySQLLoginInfo对象中的适当值,但是当我尝试访问它们时它们是空的?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

你的MySQLLoginInfo构造函数中没有实际设置类变量,只有本地函数变量:

#Loop through lines
while (($line = fgets($handle)) !== false) {
    if ($i === 0)
        $this->host = $line; // vs $host = $line;
    // ...
}

我建议您参考Class Properties上的文档:

  

在类方法中,可以使用->访问非静态属性   (对象运算符):$this->property(其中property是。的名称   属性)。使用::(Double)访问静态属性   科隆):self::$property。有关详细信息,请参阅静态关键字   静态和非静态属性之间的区别。