2010-02-11 68 views
2

有没有办法在PHP中的函数内部访问一个类的实例?就像这样:全局PHP类的函数?

include("class.php"); 
$bla=new Classname(); 

function aaa(){ 
    $bla->DoSomething(); //Doesn't work. 
} 

$bla->DoSomething(); //Works. 

回答

4

如果我正确解释你的问题,那么正确的方法是创建一个单例类。

class Singleton { 
    private static $instance; 

    private function __construct() {} 
    private function __clone() {} 

    public static function getInstance() { 
     if (!Singleton::$instance instanceof self) { 
      Singleton::$instance = new self(); 
     } 
     return Singleton::$instance; 
    } 

    public function DoSomething() { 
     ... 
    } 
} 

你会在你的功能如下称之为:

function xxx() { 
    Singleton::getInstance()->DoSomething(); 
} 
+0

但如果他想要该类的多个实例呢?这里不需要单身。 – GSto 2010-02-11 20:35:43

+0

再次阅读他的问题。他特别询问“有没有办法在php中的函数内部访问一个类的实例” – wimvds 2010-02-11 20:38:43

+1

而且就像我已经在答案中所说的那样,只是一个小的链接,你应该遵循并自己决定,如果单例实际上是正确的: http://code.google.com/p/google-singleton-detector/wiki/WhySingletonsAreControversial – tDo 2010-02-11 20:46:45

6

使用global

function aaa() { 
    global $bla; 
    $bla->DoSomething(); 
} 

适用于所有的变量,而不仅仅是类。

+1

这是最直接的解决方案,将至少让你稍微耦合的代码工作,直到更优雅的代码编写。 – grantwparks 2011-08-07 19:45:21

1

如果您希望在整个应用程序中只使用一个类的单个实例,则应该使用单例而不是全局。你可以这样做:

class Classname { 
    private static $instance; 

    private function __construct() {...} 

    public function doSomething() {...} 

    // The singleton method 
    public static function singleton() { 
     if (!isset(self::$instance)) { 
      self::$instance = new self; 
     } 

     return self::$instance; 
    } 

    private function __clone() { /* do nothing here*/ } 
} 


function aaa() { 
    Classname::getInstance()->doSomething(); 
} 
+0

链接中断 – NaveenDA 2017-10-27 15:18:50

2

更简洁的方法是通过引用给定的类传递实例,然后访问它。

另一种方法是使用单例模式,尽管许多人认为它并不比全局模式更好。

1

正如已经回答的那样,您可以使用global variable来存储类实例,但在我看来,您应该考虑使用诸如Singleton pattern之类的东西来代替更清晰的实现。

你可以找到一个简单的单例类here的例子。