Fonksiyonlarda Küresel PHP sınıfı?

5 Cevap php

PHP işlevleri içinde bir sınıfın bir örneğini erişmek için bir yolu var mı? Bu gibi:

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

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

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

5 Cevap

Sorunuzu doğru yorumlamak, daha sonra bunu yapmak için doğru yolu bir tek sınıf oluşturmak olduğunu.

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

Aşağıdaki gibi Sen işlevi bu çağırır:

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

Kullan global:

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

Tüm değişkenler, sadece sınıflar üzerinde çalışır.

Temiz bir şekilde belirli bir sınıfın referans ile örneği geçmek ve daha sonra erişim olacaktır.

Birçok gerçekten küresel daha iyi olmadığını iddia olsa da başka bir yolu, bir tek desen kullanmak olacaktır.

Zaten cevap, sınıf örneğini saklamak için global variable kullanabilirsiniz, ancak temiz bir uygulama için yerine Singleton pattern gibi bir şey kullanarak düşünmelisiniz gibi bana geliyor.

Sen bir tek sınıfın basit bir örnek bulabilirsiniz here.

Eğer uygulama boyunca bir sınıfın sadece tek bir örneğini kullanarak zorlamak istiyorsanız, singleton'ununu değil, küresel bir kullanmalısınız. Böyle bir şey yapabilirsiniz:

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

PHP Pattens daha fazla uygulama ayrıntıları için bkz.