2011-08-02 89 views
2

是否有可能檢查並查看一個對象是否已用php實例化?我有一個MySQL類,其他頁面實例化使用它的方法,我做的是做一個日誌記錄所有查詢。我注意到mysql一次打開3-4次而不是一次。所以我需要驗證對象是否實例化,如果不是,它不會創建另一個並打開另一個無用的連接。如何檢查對象是否已被實例化?

回答

3

可以使用的instanceof操作員檢查一個給定的變量是一類特殊的:

if ($db instanceof DatabaseClass) : 

瞭解更多關於在這裏:​​http://php.net/instanceof

6

聽起來像是Singleton模式的完美案例。

class Connection 
{ 
    /** 
    * @var Connection 
    */ 
    private static $instance; 

    private static $config = array(); 

    private function __construct() 
    { 
     // whatever you need in here, just keep the method private 
    } 

    public function __clone() 
    { 
     throw new RuntimeException; 
    } 

    public function __wakeup() 
    { 
     throw new RuntimeException; 
    } 

    public static setConfig(array $config) 
    { 
     self::$config = $config; 
    } 

    public static function getInstance() 
    { 
     if (null === self::$instance) { 
      self::$instance = new self(); 
     } 
     return self::$instance; 
    } 
} 
+0

你忘了'__sleep' /'__wakeup'漏洞。 – Wrikken

+0

@Wrikken在別人回答之前,我正在趕它;) – Phil

+0

哈,你仍然對我輸了:P但你得到了upvote,因爲我懶得從手冊中複製它。如果你鏈接到手冊的相關部分,我會刪除我的&upvote你的。 – Wrikken

2

只需使用is_object,作爲一類沒有類型,但只是有內存分配,所以使用is_object上一個類名只會返回一個字符串,當您通過使用new關鍵字實例化一個對象,對象在內存中創建並具有客觀類型。

測試用例:

class HelloWorld{} 

$a = is_object(HelloWorld); 
$b = is_object(new HelloWorld); 

var_dump($a, $b); 

結果:

布爾(假)布爾(真)

+0

這對我不起作用。如果沒有「新」,php會假設它是一個常量。您必須創建該類的對象並將該對象變量傳遞給is_object函數。 –

相關問題