views:

77

answers:

5

Hi,

is there a way to access one instance of a class inside functions in php? like this:

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


function aaa(){
$bla->DoSomething();  //Doesnt Work
}

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

thanks!

+2  A: 

Use global:

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

Works on all variables, not just classes.

Tatu Ulmanen
+1  A: 

If you want to enforce using only a single instance of a class throughout your application, you should use a singleton, not a global. You could do something like this:

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();
}

See PHP Pattens for more implementation details.

Justin Johnson
+2  A: 

The cleaner way would be to pass the instance by reference to the given class and then access it.

Another way would be to use a singleton pattern, though many argue that it's not really better than a global.

tDo
+1  A: 

As already answered, you could use a global variable to store the class instance, but it sounds to me like you should consider using something like the Singleton pattern instead for a cleaner implementation.

You can find a simple example of a singleton class here.

Veeti
+1  A: 

If I interpret your question correctly, then the proper way to do this is create a singleton class.

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() {
        ...
    }
}

You would call this in your function as follows :

function xxx() {
    Singleton::getInstance()->DoSomething();
}
wimvds
but what if he wants to have more than one instance of that class? a singleton is unnecessary here.
GSto
Read his question again. He specifically asks "is there a way to access one instance of a class inside functions in php"
wimvds
And like I already said in the answer, just a small link you should follow and decide for yourself if singleton is really the right way:http://code.google.com/p/google-singleton-detector/wiki/WhySingletonsAreControversial
tDo
True, he should indeed first look at all the options and decide whether or not the singleton approach is the way to go, but that exercise is left to the poster of the question. It's not something I can decide for him...
wimvds