Bu $ atamak için bir yolu var mı?

6 Cevap php

Her şeyden önce, ben bir sınıf uzatmak istemiyorum. Ben ideal bunu yapmak istiyorum.

public function __construct() {
 /* Set Framework Variable */
 global $Five;
 $this =& $Five;
}

Ben değişken $ Beş diğer kütüphaneleri içeren bir konteyner sınıf bir sistem var. Ben yani ... Beş yerel bir değişkene atar olabilir

public function __construct() {
 /* Set Framework Variable */
 global $Five;
 $this->Five = $Five;
}

Ancak, bu önlemek için çalışıyorum nedeni işlev çağrıları biraz uzun olacağını olmasıdır.

$this->Five->load->library('library_name');

Onun biraz çirkin. Çok daha iyi olurdu.

$this->load->library('library_name');

Bunun için en iyi çözüm nedir?

6 Cevap

Bence

$this->Five->load->library('library_name');

Eğer sınıf yardımcı sınıf uzatmak için karar sürece en iyi seçenek olacak. AKA

class Something extends Helper_Class

Ancak, bu Helper_Class Eğer bir sınıf örneğini her zaman örneği anlamına gelir.


Başka bir yöntem sınıf üyelerine yardımcı sınıfları tüm atanan bir pseudo-statik sınıfına sahip olacaktır

public function setGlobals($five)
{
    $this->loader = $five->loader;
}

Sonra sadece onu aramak

public function __construct($five)
{
    someClass::setGlobals($five);
}

$Five ise bir, sadece global $Five bunu kullanmak istediğiniz her şey, ama her fonksiyonun üstünde o koyarak sadece kötü kodlama gibi küresel görünüyor olabilir.


Ayrıca, ben sadece Global değişkenler genellikle kötü bir fikir vardır ve globalleri için 'Dependency Injection' ya alternatif aramak isteyebilirsiniz benim kamu hizmeti duyurusu yapmak istiyorum. AKA

public function __construct($five);

yerine

global $five;

Bağımlılık enjeksiyon bu beş sınıfın bir örneği olarak varsayarak bir değişken talep ederken Globaller, mevcut ve önceden ayarlanmış olması dışında bir değişken güveniyor.

PHP 5.1 (Teşekkürler Gordon) çalıştırıyorsanız, siz değişken yaparak FiveClass bir örneği olduğunu güvence altına alabilirsiniz:

public function__construct(FiveClass $five);

$ Bu tanımladığınız sınıfa Geçerli örneği için bir referanstır. Ben buna atayabilirsiniz inanmıyorum. Beş küresel ise, sadece bunu yapmak mümkün olmalı:

$Five->load->library('library_name');

Sen istiyorsun bağımlılık enjeksiyon desen uygulanması çeşit ile gidebilir:

Dependency injection (DI) in computer programming refers to the process of supplying an external dependency to a software component. It is a specific form of inversion of control where the concern being inverted is the process of obtaining the needed dependency.

Ayrıca bakınız documentation for the symfony DI container. Eğer 'küresellerle' idare şekilde geliştirmek istiyorsanız ben çok bu DI konteyner uygulanmasını tavsiye edebilir.

Ayrıca, küresel nesnelere erişmek için en iyi yollarından 'üzerine this question bir okuma olabilir.

Sen (C + + örneğin gibi) $ Bunun üzerine yazmak değil ancak kolayca özellikleri için aggregate __, yöntem çağrıları ve __ get () için __call() kullanılarak set (), __ isset () inşa edebilirsiniz.

__ Çağrı için Örnek ():

class Five {
  public function bar() {
    echo __METHOD__, " invoked\n";
  }
}

class Foo {
  protected $Five = null;

  public function __construct(Five $five=null) {
     if ( is_object($five) ) {
       $this->Five = $five;
     }
   }

  public function __call($name, $args) {
    // there's no accessible method {$name} in the call context
    // let's see if there is one for the object stored in $five
    // and if there is, call it.
    $ctx = array($this->Five, $name);
    if ( !is_null($this->Five) && is_callable($ctx) ) {
      return call_user_func_array($ctx, $args);
    }
    else {
      // ....
    }
  }
}

$foo = new Foo(new Five);
$foo->bar();

prints Five::bar invoked.
In my opinion the biggest draw back is that it is much harder to see "from the outside" what the object is capable of.

PHP bir değişken gibi görünen bu özel şeylerden biri, ama biraz farklı perde arkasında tedavi gibi ben, sen $this atayamazsın eminim.

Endişelerinizi senin yöntem arama çok uzun alma semantik iseniz, ben load bir yöntem çağrısı yerine bir nesne özelliği yapmak istiyorum

$this->load()->library('library_name');

public function load()
{
    return $this->Five;
}

Nasıl Beş statik sınıf üyeleri, ilgili veri üyeleri ve yöntemleri yapma hakkında? Bu

$this->Five->load->library('library_name');

Bu olacak

Five::load->library('library_name');

ve her yerde etrafında & $ Beş geçmek olmazdı.