SORU
25 AĞUSTOS 2011, PERŞEMBE


() get_instance Codeıgniter: Neden bir değişkene atamak?

Codeıgniter, get_instance() kontrol tüm şu anda yüklü sınıfları (Denetleyici sınıf örneğini verir) içeren süper-nesne döndüren genel olarak kullanılabilen bir fonksiyon. Mevcut kaynak kodu vardır ..

get_instance() Codeigniter.php olarak tanımlanır

// Load the base controller class
require BASEPATH.'core/Controller.php';

function &get_instance()
{
    return CI_Controller::get_instance();
}

CI_Controller Controller.php olarak tanımlanır

class CI_Controller {

    private static $instance;

    /**
     * Constructor
     */
    public function __construct()
    {
        self::$instance =& $this;

        // Assign all the class objects that were instantiated by the
        // bootstrap file (CodeIgniter.php) to local class variables
        // so that CI can run as one big super object.
        foreach (is_loaded() as $var => $class)
        {
            $this->$var =& load_class($class);
        }

        $this->load =& load_class('Loader', 'core');

        $this->load->set_base_classes()->ci_autoloader();

        log_message('debug', "Controller Class Initialized");
    }

    public static function &get_instance()
    {
        return self::$instance;
    }
}

user guide for creating libraries kullanılması tavsiye edilir:

Kütüphane içinde kullanan, Codeıgniter Kaynakları

Kütüphane kullanımı içinde Codeıgniter doğal kaynaklara get_instance() işlevi. Bu işlevi, Codeıgniter süper nesne.

Denetleyici fonksiyonları içinde normalde herhangi diyeceksin mevcut Codeıgniter fonksiyonları $this yapı kullanma: $this->load->helper('url'); $this->load->library('session'); $this->config->item('base_url'); vb.

$this ancak, yalnızca doğrudan denetleyicileri içinde, çalışmalarınızı modelleri, ya da görüşleriniz. Eğer Codeıgniter sınıfları kullanmak isterseniz kendi özel sınıfları içinde aşağıdaki gibi yapabilirsiniz

İlk olarak, Codeıgniter değişkeni için nesne atayın:

$CI =& get_instance();

Bir değişken bir nesneye atanan bir kere kullanacaksın değişken yerine $this: $CI =& get_instance(); Cİ -^$. yük->('') url; $Cİ->Yardımcısı yük->('session');kütüphane Cİ -^$. config->('') base_url; vb. madde

Not: get_instance() yukarıdaki işlevi olduğunu fark edeceksiniz başvuruyla geçirildi:

$CI =& get_instance();

Bu çok önemli.Başvuru atamadan kullanmak için izin verir bir kopyasını yaratmak yerine özgün Codeıgniter nesne.

İlgili yayınlar: explain $CI =& get_instance(); / Codeigniter: Get Instance

Yani, burada asıl sorum şu:

Neden Kullanıcı Kılavuzu, bir değişken için get_instance() atama önerilir? Referans ile atama olmaz etkilerini anlamak oldukça eminim, ama neden get_instance()->load->model() gayet iyi çalışıyor zaman bir değişkene atamak için tavsiye edilir?

Nesnenin bir özelliğine atayın CI tanımlanan kullanıcı ya da üçüncü parti pek çok ders görüyorum

class MY_Class {

    private $CI;

    function __construct()
    {
        $this->CI =& get_instance();
    }
    function my_func()
    {
        $this->CI->load->view('some_view');
    }
    function my_other_func()
    {
        $this->CI->load->model('some_model');
    }
}

Kötü örnek, ama bu sık sık görüyorum. Neden sadece get_instance() doğrudan çağırmak yerine bu yöntem ile rahatsız?görünüyorgibi bir sınıf değişkeni için tüm Denetleyici nesne atama eğer bir referans bile olsa iyi bir fikir olmaz. Belki de bir önemi yok.

Yazın daha kolay oldu get_instance() sarıcı fonksiyon yazmak istiyorum ve sürekli bir değişken atamak zorunda değilim.

function CI()
{
    return get_instance();
}

Ya da:

function CI()
{
    $CI =& get_instance();
    return $CI;
}

Sonra kullanabileceğimi CI()->class->method() bir yerde olmadan güçlük atama bir değişken, çok kolay yazmak ve anlamak ne yapıyor, ve neden olabilir daha kısa, daha şık bir kod.

  • Herhangi bir nedenle bu yaklaşım için değil mi?
  • CI() iki işlev arasındaki fark, yukarıda var mı?
  • Neden bir değişkene get_instance() atamak yerine doğrudan çağırmak önerilir?
  • function &get_instance(){} 28 *tanımlandığı ne anlama geliyor? references ve uygun olduğunda bunları kullanmak ne hakkında biraz biliyorum, ama hiç bir fonksiyonu bu şekilde tanımlanan gördüm. Eğer sarıcı fonksiyon yazmak istiyorum, ama bu, kullanmalı mıyım?

Lütfen bu kadar çok olduğunu unutmayınstilbir soru, ama bir teknik. Eğer herhangi bir sorun, performans olup olmadığını bilmek istiyorumveya başka bir şekildeifade ettiğim yöntemi kullanarak.

EDİTŞimdiye kadar var:

  • Yöntem zincirleme bir değişkene atama geçici bir çözüm yani php4, kullanılamaz bu Codeıgniter php4 desteği azaldı gibi oldukça alakasız olsa da)
  • Birden fazla fonksiyonu bir nesne, bir kere çağırmak yerine geri çağrılıyor ve bir değişkene atama küçük Tepegöz.

Başka bir şey, ya da bu sadece potansiyel sorunlar nelerdir?

CEVAP
25 AĞUSTOS 2011, PERŞEMBE


Bildiğim kadarıyla, kolaylık olsun her şeyden çok. CI süper nesne kullanacağınız şansı kütüphanelerde bir sürü neden biraz daha kolay yapmak için bir değişken atamak değil mi?

Dikkate almanız gereken birkaç şey vardır...

  1. Eğer bir yardımcı bu yöntemi koymak, bu yöntemi kullanarak herhangi bir sınıf için bir bağımlılık haline gelir. Bu olmayabilir çok zor bir şey, ama eğer paylaşmak istediğiniz kitaplıkları ile herkesten olmayabilir mutlu bağımlılığı, özellikle beri var zaten standart bir şekilde işleme bu CI topluluk.
  2. get_instance() değişken sonucu depolamak yerine Yardımcısı kullanmak her zaman aradığınız, çünkü performansı üzerinde küçük bir etkiye sahiptir.
  3. Başka bir deyişle bir yardımcı yöntem olması gerektiğini size zaman kazanmak için, herkes için kim çalışıyor çoğunlukla temel MVC dosyaları CI, kurma bir yardımcı gibi bu ara daha uzun sadece o ayar bir değişkeni az yer gerekir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MyTiredBones

    MyTiredBones

    2 Temmuz 2013
  • The Slow Mo Guys

    The Slow Mo

    15 AĞUSTOS 2010
  • UniqueApps

    UniqueApps

    4 Ocak 2009