【问题标题】:Assigning an object to static variable将对象分配给静态变量
【发布时间】:2013-06-18 18:55:54
【问题描述】:

我做错了什么

class db
{

     static $dbintance=null;    


     public function __construct()
     {


       try
       {
       self::$dbintance=new PDO("mysql:host=host;dbname=dbname",user,password);
       }
       catch( PDOException $e)
       {
       die( '<b>Errors:</b> '.$e->getMessage());
       }

       }


     public static function isRecord($q)
       {

    $r=self::$dbintance->query($q)->fetch(PDO::FETCH_NUM);
    if($r[0]) return true; 
    if(!$r[0]) return false;
   }  

}

用法

 echo (db::isRecord("SELECT * FROM whcentral1 WHERE ItemDesc='ff'"))?'Yes':'NO';

错误

在非对象上调用成员函数 query()

【问题讨论】:

  • “我做错了什么”你使用的是单例,那就是你做错了。
  • 使用singleton 有那么糟糕吗?
  • 这很糟糕,正是因为您面临的问题。如果它是一个普通对象,那么如果不先创建它,就无法调用方法。

标签: php oop singleton


【解决方案1】:

PHP 不做静态构造函数。按照你写这个的方式,你实际上必须运行new db() 才能工作。使用静态访问器方法可能会更好,例如:

class db {

 static $dbintance=null;    


 public static function getConnection(){
   if (!self::$dbinstance) {
     try {
         self::$dbintance=new PDO("mysql:host=host;dbname=dbname",user,password);
     } catch( PDOException $e) {
         die( '<b>Errors:</b> '.$e->getMessage());
     }

  }
  return self::$dbinstance;
// etc.
}

【讨论】:

  • 它不起作用,因为您在类构造函数中初始化 PDO 对象。问题是 PHP 中的构造函数仅针对类实例运行,而您正在调用静态方法。因此,除非您在沿线某处创建类的实例,否则不会运行构造函数,因此不会设置 PDO 对象。
  • 更喜欢使用静态而不是self。在这种情况下,如果您正在执行静态方法覆盖,它不会影响仍然,它可能会咬你。php.net/manual/en/language.oop5.late-static-bindings.php
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多