【问题标题】:php oop variable scopephp oop 变量作用域
【发布时间】:2011-01-20 08:42:22
【问题描述】:

所以我有一个类.. 在它的构造函数中,我包含了通过 mysqli 扩展将我连接到我的数据库的代码:

class MyClass
{
    public function __construct()
    {
        include("dbconnect");
    }
}

dbconnect 如下所示:

$host = "localhost";
$user = "user";
$pass = "123";
$database = "myDatabase";

$mysqli = new mysqli($host, $user, $pass, $database);
$mysqli->set_charset('utf8-bin');

现在我的问题是:由于 mysqli 可以使用 OOP-Style,我如何访问 MyClass 中的变量?

function doIt()
{    
    $query = "SELECT * FROM myTable";    
    $result = $mysqli->multi_query($query);
}

调用这个函数会导致

注意:未定义变量:mysqli in ... 在线的 ... 致命错误:在非对象上调用成员函数 multi_query() 在...在线...

所以看起来变量的范围是不对的。有谁知道如何解决这一问题?如果 MyClass 不需要对 mysqli 的额外引用或其他内容,那将是最好的,因为我想将其分开。

【问题讨论】:

  • 只是一个警告:如果您的文件只是命名为 'dbconnect' 仅此而已,并且它位于 webroot 中,则网络服务器可能会决定与全世界共享您的数据库密码。为配置数据提供 .php 文件类型是一种很好的做法,这样如果它由 Web 服务器运行,则不会发生任何事情。
  • 感谢提示 :) 实际上,它没有放在 webroot 中,也受 .htaccess 保护。但无论如何,我正在考虑使用连接类。

标签: php oop scope


【解决方案1】:

您正在寻找的是“全局”关键字。不过,总的来说,我会避免使用全局变量并重新考虑您的设计。

【讨论】:

  • 不,我没有寻找全局这个词。我寻找的是类似上面的帖子......
【解决方案2】:

该变量与函数内的任何其他变量具有相同的范围:它仅在函数内有效。一旦函数返回,它就消失了。如果您想为类中的其他函数“持久化”一个变量,请将其设为类成员:

class MyClass {
    var $member = null;

    function foo() {
        $localVar = $this->member;
        $this->anotherMember = 'bar';  // $anotherMember is now available for other functions
    }
}

通过include 重用代码并不好,因为它无法让您控制变量的使用方式。我会考虑重组这件事,比如创建一个建立数据库连接的函数,然后returns 数据库句柄。

【讨论】:

  • 是的,可以做到这一点..也许我会..但是因为我只使用包含来管理我在一个文件中的数据库连接,而不是为了别的(而且永远不会为了别的; ) ),我认为没关系.. 是的,我可以把整个东西放在一个 Connection-Class 中,但我很懒 ^^
  • @Thomas Laziness 是程序员的必要属性,但它也会让他的程序变得一团糟……;)
  • 你说得对。很多时候,我因此而对自己感到恼火。关于这一点,我会将连接放入一个专门的类中,即使这样做并不是一个好点(除了上面提到的);)
【解决方案3】:

$mysqli 变量仅在构造函数范围内可用。像这样改变你的构造函数:

class MyClass
{
    public function __construct()
    {
        include("dbconnect");
        $this->mysqli = $mysqli;
    }
}

现在您可以在该对象的其他方法中使用$this->mysqli

【讨论】:

  • 好吧,没关系,我可以忍受 :) 非常感谢!!
猜你喜欢
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-18
  • 2013-09-08
  • 1970-01-01
  • 2011-05-09
相关资源
最近更新 更多