【问题标题】:Calling static function returns NULL if object is not instanced? PHP OOP如果对象没有实例化,调用静态函数返回NULL? PHP 面向对象
【发布时间】:2016-09-08 05:24:49
【问题描述】:

问候好人,

我最近遇到了一些 OOP 问题。首先,我希望从头开始创建 CRUD Db 类。这是一个代码:

class  Database{

    public static $link;
    public $message;
        public function __construct () {

        try {
            self::$link = mysqli_connect(HOST, USER, PASS, DB);

            if (!self::$link) {
                echo self::$link->error;
            }


        } catch (Exception $e) {
            die(" Failed connecting to DB") ;
        }
    }

    public static function query($SQL){

        return self::$link->query($SQL);

    }
        public static function select($table, array $columns){
        $columns=implode(",",$columns);
        $result=self::query("SELECT $columns FROM $table");


        return self::$link->fetch($result);
    }

}

所以问题是这样的:

如果我这样调用我的静态选择函数:

Database::select('users', array('username'=>'user')); 

它返回:致命错误:在..中的非对象上调用成员函数 query() 如果我像这样调试连接:var_dump(Database::$link) 它返回 NULL 但如果我放置“$db = new Database();”在那条线之上,它有效吗?

谁能告诉我我做错了什么?

谢谢!

【问题讨论】:

  • 我没有注意到:(HOST, USER, PASS, DB) 是从另一个文件中包含的常量。

标签: php mysql oop mysqli crud


【解决方案1】:

您正在调用静态方法。所以,对象不会被实例化。所以,__construct() 方法 不会 被调用。这意味着不会填充 $link 属性。

无论您做什么,都需要连接到您的数据库。您可以调用静态方法connect(),它将连接到数据库并填充$link,或者确保在每个需要连接的方法中建立连接:

public static function connect()
{
    try {
        self::$link = mysqli_connect(HOST, USER, PASS, DB);
        if (!self::$link) {
            echo self::$link->error;
        }
    } catch (Exception $e) {
        die(" Failed connecting to DB") ;
    }
}

public function select(SQL)
{
    if (!static::$link) {
        static::connect();
    }

    // your stuff

}

这是你想学习的好东西。在处理此类特定项目之前,您需要熟悉 OOP:构造函数/析构函数、访问器、修改器、静态方法等。这很重要,因为它是您接下来想要做的所有事情的基础。

【讨论】:

  • @YourCommonSense 我了解 MilosM 想学习。这里的主要问题不是数据库的使用,而是对 OOP 原则的理解。
  • @Arcesilas 感谢您的明确解释!我认为静态调用数据库会创建一个实例,因为它的 db 对象是在构造函数中创建的,因此 $link 将保存 DB 对象再次感谢您的帮助;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
相关资源
最近更新 更多