Глобальный PHP класс в функциях? - PullRequest
3 голосов
/ 11 февраля 2010

Есть ли способ получить доступ к одному экземпляру класса внутри функций в PHP? Как это:

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

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

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

Ответы [ 5 ]

6 голосов
/ 11 февраля 2010

Использование global :

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

Работает со всеми переменными, а не только с классами.

5 голосов
/ 11 февраля 2010

Если я правильно интерпретирую ваш вопрос, то правильный способ сделать это - создать одноэлементный класс.

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();
}
2 голосов
/ 11 февраля 2010

Более чистым способом было бы передать экземпляр по ссылке на данный класс и затем получить к нему доступ.

Другим способом было бы использование одноэлементного паттерна, хотя многие утверждают, что он на самом деле не лучше глобального.

1 голос
/ 11 февраля 2010

Как уже было сказано, вы можете использовать глобальную переменную для хранения экземпляра класса, но для меня это звучит так, как будто вы должны использовать что-то вроде Singleton pattern вместо чистого осуществление.

Простой пример класса синглтона можно найти здесь .

1 голос
/ 11 февраля 2010

Если вы хотите принудительно использовать только один экземпляр класса в вашем приложении, вы должны использовать одиночный, а не глобальный.Вы могли бы сделать что-то вроде этого:

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