2011-09-21 67 views
0

它很難解釋我的意思,所以在這裏舉一個例子。如何使用變量創建新的類實例

 
class mysql { 

    public function __construct(){ 
     //connect to db and select table 
    } 
    .... 
} 


class Index Extends perent_class { 

    public $mysql; 

    public function no_mysql_required(){ 

     //this function might be called and no mysql is required 

    } 

    public function mysql_required(){..} // this needs mysql. 
    public function mysql_required2(){..} // this needs mysql. 
    public function mysql_required3(){..} // this needs mysql. 

} 


選項1:
$this->mysql = new mysql();
它添加到需要的MySQL連接的所有功能,但有兩個這些功能可以被調用,並且會創建兩個連接到MySQL這是壞的。

選項2:

if(!is_object($this-mysql)) $this->mysql = new Mysql();
這將只創建一個mysql對象並解決問題,但會在函數中創建非常重複的代碼。創建&調用函數$ this-> start_mysql()也是重複的。

所以我真正想要的是每當我打電話$ this-> mysql-> function();即使尚未創建它,也會自動創建「$ this-> mysql = new Mysql」,並自動創建一次,但不會在創建新函數時重新創建它。我可能會做這個錯誤,如果有更好的解決方案,我在做什麼,請張貼它。

謝謝。

回答

0

如果我正確理解你的問題,看起來你想使用'Singleton'設計模式。這使您只能創建一個類的一個實例;試圖創建第二個實例只返回原始實例。這裏有一個代碼片段:

<?php 

class mysql { 
    private static $mysql; 

    public $testProperty; 

    private function __construct() { } // Declared private so cannot instantiate objects in client code. 

    public static function instance() { 
    if (!isset(self::$mysql)) { 
     self::$mysql = new self(); 
    } 
    return self::$mysql; 
    } 
} 

?> 

通過使用這種模式,如果一個尚未創建於mysql::instance();通話將返回mysql的對象的新實例。如果已創建,它將返回相同的實例。因此,你只有一個對象實例。通過撥打mysql::instance()進行測試:

$instance1 = mysql::instance(); 
$instance1->testProperty = 'abc'; 
var_dump($instance1->testProperty); 

$instance2 = mysql::instance(); 
var_dump($instance2->testProperty); 
1

你想要做的是爲mysql類使用單例模式。這樣你就沒有不必要的連接。因此,這將大致是這樣的

你的MySQL類

class Mysql{ 
    private function __construct(){ } 

    private static $instance; 
    . 
    . 
public static function singleton(){ 
     if (!isset(self::$instance)) { 
      $c = __CLASS__; 
      self::$instance = new $c; 
     } 

     return self::$instance; 
    } 

,現在您會在您的其他類這樣使用它。

$mysql = Mysql::singleton(); 
相關問題