如果未实例化对象,则调用静态函数 returns NULL? PHP面向对象
Calling static function returns NULL if object is not instanced? PHP OOP
大家好,
我最近 运行 OOP 遇到了一些问题。首先,我希望从头开始创建 CRUD Db class。这是一个代码:
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);
}
}
所以问题是这样的:
如果我这样调用静态 select 函数:
Database::select('users', array('username'=>'user'));
It returns: 致命错误:在 .. 中的非对象上调用成员函数 query()
如果我这样调试连接:var_dump(Database::$link)
it returns NULL
但是如果我放置“$db = new Database();”在那条线之上,它有效吗?
任何人都可以告诉我我做错了什么吗?
谢谢!
您正在调用静态方法。因此,对象 将不会 被实例化。因此,__construct()
方法 将不会 被调用。这意味着 $link
属性 不会被填充。
无论您做什么,都需要连接到您的数据库。您可以调用将连接到数据库并填充 $link
的静态方法 connect()
,或者确保在每个需要连接的方法中建立连接:
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:constructors/destructors、访问器、修改器、静态方法等。这很重要,因为它是您接下来要做的所有事情的基础。
大家好,
我最近 运行 OOP 遇到了一些问题。首先,我希望从头开始创建 CRUD Db class。这是一个代码:
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);
}
}
所以问题是这样的:
如果我这样调用静态 select 函数:
Database::select('users', array('username'=>'user'));
It returns: 致命错误:在 .. 中的非对象上调用成员函数 query()
如果我这样调试连接:var_dump(Database::$link)
it returns NULL
但是如果我放置“$db = new Database();”在那条线之上,它有效吗?
任何人都可以告诉我我做错了什么吗?
谢谢!
您正在调用静态方法。因此,对象 将不会 被实例化。因此,__construct()
方法 将不会 被调用。这意味着 $link
属性 不会被填充。
无论您做什么,都需要连接到您的数据库。您可以调用将连接到数据库并填充 $link
的静态方法 connect()
,或者确保在每个需要连接的方法中建立连接:
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:constructors/destructors、访问器、修改器、静态方法等。这很重要,因为它是您接下来要做的所有事情的基础。