2016-05-12 49 views
1

问候好人,如果对象没有实例,调用静态函数返回NULL? PHP OOP

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

它返回:致命错误:调用一个成员函数查询()在一个非对象.. 如果我调试这样的连接:var_dump(Database::$link)返回NULL 但如果我把“$ DB =新的数据库();”在该线以上,它的工作原理?

谁能教我什么,我做错了什么?

谢谢!

+0

我没有注意到:(HOST,USER,PASS,DB)是从另一个文件包含常数。 – fugitive

回答

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:构造函数/析构函数,访问器,增变器,静态方法等等。这很重要,因为它是所有您接下来要做的事情的基础。

+0

这只是一个问题,出于很多 –

+0

你能指出问题吗? @YourCommonSense – fugitive

+0

@YourCommonSense我明白,MilosM想学习。这里的主要问题不是数据库的使用,而是理解OOP的原则。 – Arcesilas