Frage

Zunächst möchte ich keine Klasse erweitern. Ich würde das idealerweise gerne tun.

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

Ich habe ein System, bei dem die Variable $ fünf eine Containerklasse ist, die andere Bibliotheken enthält. Ich könnte dies einer lokalen Variablen von fünf zuweisen ... dh

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

Der Grund, warum ich dies vermeiden möchte, ist jedoch, dass Funktionsaufrufe ein wenig lang werden würden.

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

Es ist ein bisschen hässlich. Weitaus besser wäre.

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

Was ist die beste Lösung dafür?

War es hilfreich?

Lösung

ich denke, dass

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

wird Ihre beste Option sein, es sei denn, Sie beschließen, dass die Klasse die Helferklasse verlängert. AKA

class Something extends Helper_Class

Dies bedeutet dies jedoch Helper_Class wird jedes Mal instanziiert, wenn Sie eine Klasse instanziieren.


Eine andere Methode wäre eine pseudo-statische Klasse, die alle Helferklassen den Klassenmitgliedern zugewiesen hat

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

Dann nenn es einfach

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

Wenn $Five ist global, du könntest nur global $Five Jedes Mal, wenn Sie es verwenden möchten, aber das oben in jeder Funktion zu stellen, scheint einfach eine schlechte Codierung zu sein.


Außerdem möchte ich nur meine Ankündigung des öffentlichen Dienstes erstellen, dass globale Variablen im Allgemeinen eine schlechte Idee sind, und Sie möchten möglicherweise nach "Abhängigkeitsinjektion" oder Alternative zu Globalen suchen. AKA

public function __construct($five);

Anstatt von

global $five;

Globale verlassen sich auf eine externe Variable, die vorhanden und bereits festgelegt werden soll, während die Abhängigkeitsinjektion eine Variable verlangt, die als Instanz der fünf Klasse angenommen wird.

Wenn Sie PHP 5.1 ausführen (danke Gordon), können Sie sicherstellen, dass die Variable eine Instanz der ist FiveClass Auf diese Weise:

public function__construct(FiveClass $five);

Andere Tipps

$ Dies ist ein Hinweis auf die aktuelle Instanz der Klasse, die Sie definieren. Ich glaube nicht, dass Sie es zuweisen können. Wenn fünf ein globales sind, sollten Sie dies einfach tun können:

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

Vielleicht möchten Sie eine Art Implementierung des Abhängigkeitsinjektionsmusters:

Die Abhängigkeitsinjektion (DI) in der Computerprogrammierung bezieht sich auf den Prozess der Bereitstellung einer externen Abhängigkeit zu einer Softwarekomponente. Es handelt sich um eine spezifische Form der Kontrolle der Kontrolle, bei der das invertierte Anliegen der Prozess des Erhalts der erforderlichen Abhängigkeit ist.

Siehe auch die Dokumentation für den Symfony DI -Container. Ich kann diese DI -Container -Implementierung sehr empfehlen, wenn Sie die Art und Weise, wie Sie mit Ihren „Globalen“ umgehen, verbessern möchten.

Sie könnten auch lesen diese Frage über "beste Möglichkeiten, globale Objekte zuzugreifen".

Wie wäre es mit den relevanten Datenmitgliedern und Methoden von fünf statischen Klassenmitgliedern? Dies

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

würde das werden

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

Und Sie müssten nicht überall fünf $ verabschieden.

Sie können $ dies nicht überschreiben (wie z. B. in C ++), aber Sie können leicht eine erstellen Aggregat Verwendung __Anruf() für Methodenaufrufe und __get (), __set (), __isset () für Eigenschaften.

Beispiel für __call ():

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

Drucke Five::bar invoked.
Meiner Meinung nach ist das größte Rückstand, dass es viel schwieriger ist, "von außen" zu sehen, wozu das Objekt fähig ist.

Ich bin mir ziemlich sicher, dass Sie nicht neu zuweisen können $this, wie es eines dieser besonderen Dinge ist, die wie eine Variable im PHP aussehen, aber hinter den Kulissen etwas anders behandelt wird.

Wenn Ihre Bedenken die Semantik Ihrer Methode sind, die angerufen wird, um zu lange zu werden, würde ich machen load Ein Methodenaufruf anstelle einer Objekteigenschaft

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

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

Vielleicht besser für Sie, werden PHP Magic -Methoden verwenden?http://www.php.net/manual/en/glanguage.oop5.overloading.php#slanguage.oop5.overloading.methods

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top