php - 如果未实例化对象,调用静态函数将返回 NULL? PHP面向对象

标签 php mysql oop mysqli crud

大家好,

我最近遇到了一些 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')); 

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

谁能告诉我哪里做错了?

谢谢!

最佳答案

您正在调用一个静态方法。因此,该对象不会 被实例化。因此,__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:构造函数/析构函数、访问器、修改器、静态方法等。这很重要,因为它是您接下来要做的所有事情的基础。

关于php - 如果未实例化对象,调用静态函数将返回 NULL? PHP面向对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37185859/

相关文章:

php - Codeigniter - 如何连接 ORACLE、MySQL 和 SQL Server?

php - 在 fedora linux 上使用 mysqli

mySQL - 使用来自三个表的数据和列创建一个新表

mysql - 这个语法有什么问题?我应该如何让它发挥作用?

php - 根据用户的角色和状态登录 laravel

java - 为什么代码会产生以下结果?

java - 尽管我们可以继承它们,为什么我们转向访问父类(super class)成员?

php - ajax发布问题

php - jQuery UI 自动完成不会显示返回的 json (PHP)

ruby - 在 Ruby 中,(类的)实例变量必须首先在 "initialize"中定义才能工作吗?