【问题标题】:MySQLi strange errorsMySQLi 奇怪的错误
【发布时间】:2016-07-14 03:52:50
【问题描述】:

我正在尝试扩展 MySQLi 类。

<?php

class DataManager extends mysqli {

    private $username = "me";
    private $password = "notgonnatellyou";
    private $dbname = "data";
    private $host = "sql.my";

    public function __construct() {
        return connect();
    }

    private function connect() {
        $connection = parent::__construct($host,$username,$password,$dbname);
        return $connection;
    }

    public function query($query) {
        autocommit(false);
        if (!($do = parent::query($query))) {
            rollback();
            return false;
        }
        else {
            commit();
            return $do;
        }
    }
}

?>

现在我收到以下错误:

致命错误:第 37 行 /me/datamanager.php 中 DataManager::connect() 的访问级别必须是公共的(如 mysqli 类)

我不明白为什么它应该公开......如果我公开它,它会说

调用未定义函数connect()

但是如你所见,我只是做了那个功能......

【问题讨论】:

  • 公开后将被称为$this-&gt;connect();或self::connect()
  • 显示你使用你的类的代码。

标签: php class oop mysqli extends


【解决方案1】:

您的第一个问题是您无法增加从基类继承的方法的私密性。如果您有一个mysqli 的实例并想在其上调用connect,如果它意外地是私有的,您会感到惊讶。这就像拥有一个没有在子类中实现的抽象方法的类。

@devpro 在他们的评论中指出的第二个问题是您必须将connect 称为$this-&gt;connect(); 而不仅仅是connect()。

您可能会发现构造函数不能返回值。构造函数的“返回值”始终是实例化类型。

此外,您对字段的引用也是错误的。您需要使用$this-&gt;host、$this-&gt;username等。

【讨论】:

  • 现在显示拒绝访问,使用密码:否。
  • @BjörnSchönrock 因为我的回答中提到的第三个问题,您没有使用密码构建连接。
  • 我的构造函数现在包含:"$this->connect();"
  • @BjörnSchönrock 确实,但你不能从构造函数返回一些东西。你基本上只是在做new mysqli();。
  • 我现在在构造函数中没有返回任何内容。我现在只有$this-&gt;connect();
猜你喜欢
  • 2013-08-14
  • 2010-11-17
  • 1970-01-01
  • 2014-03-09
  • 2014-10-11
  • 2012-04-27
  • 2013-10-30
  • 2016-09-18
  • 2012-03-18
相关资源
最近更新 更多