2011-09-21 68 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(); 
相关问题