PHP中未定义的类变量

Posted

技术标签:

【中文标题】PHP中未定义的类变量【英文标题】:Undefined class variable in PHP 【发布时间】:2012-03-04 16:57:59 【问题描述】:

我已经创建了一个单独的类来连接我的数据库,并且该类在一个单独的 php 文件中:

connect.php

class connect

    function __construct()
        // Connect to database
    

    function query($q)
        // Executing query
    

$connect = new connect();

现在,我创建了 $connect 类的对象,当在 index.php 之类的文件中使用它时,它可以工作了:

index.php

require_once('connect.php');
$set = $connect->query("SELECT * FROM set");

现在,它工作正常,我不必为类重新创建对象并直接执行查询,而在另一个名为 header.php 的文件中,我有一个这样的类:

header.php

class header

    function __construct()
        require_once('connect.php');
        // Here the problem arises. I have to redeclare the object of the connection class
        // Without that, it throws an error: "undefined variable connect"
        $res = $connect->query("SELECT * FROM table");
    


为什么它在 index.php 而不是 header.php 中工作?

【问题讨论】:

除了不好的做法外,它应该可以工作。更好的方法是使用new header($connect),例如注入依赖。 require_once('connect.php'); 在类头之外和global $connect; 在头类的__construct() 中.. @ahmet2106 forget global exists please 但我会在class header 中使用__construct(connect $connect) 并在您的主文件中定义$header = new header($connect);。所以只有 require connect.php 和 header.php 在你的主文件顶部一次。 @Gordon 我不喜欢全球性的,是的,这是邪恶的,我知道 ;) 【参考方案1】:

您的问题可能在于使用require_once() 而不是require()。当您第一次包含 connect.php 时,它运行良好,因为变量已初始化并加载了类,但是当您稍后再次尝试时,require_once() 禁止重复包含,因此没有初始化任何变量。

无论如何,在构造函数中使用include() 是……很少有道理的。并且包含一个初始化局部变量的文件也是个坏主意。

正确的代码如下所示:

<?php
    require_once('connect.php');
    require_once('header.php');

    $connect = new Connect();
    $header = new Header($connect);

还有header.php:

<?php
    class Header

        protected $connection = null;

        function __construct(Connect $connection)
            $this->connection = $connection;
            $res = $this->connection->query("SELECT * FROM table");
        

    

【讨论】:

第一部分在这里不适用。 include 会将任何类定义导入全局范围。 OP 收到“未定义变量”错误,而不是“类声明可能未嵌套”。不过,给定的替代方案很好。 @Gordon 谢谢你的信息,我从来没有这样做过,所以我从来不需要解决这样的问题。我必须考虑如何将其纳入我的答案中。 @Gordon 这是我能想到的最好的编辑...如果您有任何要添加的内容,请随时扩展/编辑我的答案。 现在好多了。除此之外,我不知道 OP 做错了什么,因为我根本无法重现该问题:codepad.viper-7.com/He4kgu 对测试用例没有影响,是吗?我不会创建多个 Foo。

以上是关于PHP中未定义的类变量的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 7:foreach 循环中未定义的变量

扑动中未定义的类'UserCredential'

getParameter 方法中未定义的变量

php中未定义的删除索引[重复]

类中未定义的函数或变量

错误:laravel 视图中未定义的变量