2016-12-22 5 views
0

Ich habe eine Klasse, die weltweit verwendeten Methoden enthält, und sie benutzen, indem die Klasse erweitern:PHP: Wie mehrere Instanzen von erweiterten Klasse verhindern

App.php

final class App extends Core { 

    // The app class handles routing and basically runs the show 

} 

core.php

abstract class Core { 

    public function __construct() { // Here we bring in other classes we use throughout the app 
    $this->Db = new Db($this); 
    $this->Mail = new Mail($this); 
    } 

    // Then we define multiple methods used throughout the app 

    public function settings($type) { 
    // You see this used by the model below 
    } 

} 

index.php

$App = new App(); // This fires up the app and allows us to use everything in Core.php 

Bis jetzt ist das alles großartig, weil alles auf der gesamten Website von innerhalb $App gehandhabt wird. In meiner MVC-Struktur müssen die Modelle jedoch Daten aus der Datenbank abrufen und andere Einstellungen abrufen, die alle in Core enthalten sind. Wir brauchen nicht die gesamte $App Klasse von den Modellen zu verwenden, aber wir brauchen Core zu sein.

MyModel.php

class MyModel extends Core { 

    public function welcome() { 
    return 'Welcome to '.$this->settings('site_name'); 
    } 

} 

Sobald MyModel.php ins Spiel kommt, wird der Core Konstruktor ein zweites Mal ausführen. Wie kann ich den Core-Konstruktor davon abhalten, zweimal ausgeführt zu werden?

+0

Dieser Beitrag Antwort überprüfen helfen könnten: http: //stackoverflow.com/questions/23160509/check-whether-instance-of-a-class-exists-if-not-create-an- instance –

+0

Ihre App-Klasse sollte nicht auf die Datenbank zugreifen .. nur die Modelle sollten das tun .. –

+0

Schauen Sie sich auch die Dependency-Injektion an: http://stackoverflow.com/questions/130794/what-is-dependency-injection –

Antwort

1

Sie können eine statische Instanz in der Klasse core verwenden und wiederverwenden.

abstract class Core { 
    public static $instance; //create a static instance 

    public function __construct() { // Here we bring in other classes we use throughout the app 
    $this->Db = new Db($this); 
    $this->Mail = new Mail($this); 
    self::$instance = $this; // initialise the instance on load 
    } 

    // Then we define multiple methods used throughout the app 

    public function settings($type) { 
    // You see this used by the model below 
    } 

} 

in der Modellklasse, verwenden Sie es wie diese

class MyModel extends Core { 

    public function welcome() { 
    $_core = Core::instance; // get the present working instance 
    return 'Welcome to '.$_core->settings('site_name'); 
    } 

} 

Sie einen Blick auf diese singleton reference
nehmen kann zusätzlich können Sie diese explain-ci-get-instance

+0

Ihr Code hat ein paar Probleme. Erstens ist es kein Singleton, weil wir beliebig viele Klassen instanziieren können. Zweitens ist die Verwendung eines Konstrukts, um seine eigene Instanz zu erstellen und zu speichern, eine schlechte Praxis, weil es nicht ihre Aufgabe ist. Drittens müssen Sie testen, ob eine Instanz vorhanden ist oder bei Bedarf instanziiert wird. Und schließlich hat CI ein wirklich schlechtes Programmdesign, da Sie eine wirklich schlecht codierte Klasse verlinkt haben. –

Verwandte Themen