Qual è il modo migliore per includere le librerie PHP quando si utilizza un modello di fabbrica statico?

StackOverflow https://stackoverflow.com/questions/266803

Domanda

Ho diversi schemi di fabbrica statici nella mia libreria PHP. Tuttavia, l'impronta di memoria sta sfuggendo di mano e vogliamo ridurre il numero di file richiesti durante il tempo di esecuzione. Ecco un esempio di dove siamo oggi:

require_once('Car.php');
require_once('Truck.php');

abstract class Auto
{
    // ... some stuff ...

    public static function Create($type)
    {
        switch ($type) {
            case 'Truck':
                return new Truck();
                break;
            case 'Car':
            default:
                return new Car();
                break;
        }
    }
}

Questo è indesiderabile perché Car.php E Truck.php dovranno essere inclusi anche se potrebbe essere necessario solo l'uno o l'altro. Per quanto ne so, richiedono / includi e la loro ..._ una volta che la variante include le librerie nello stesso ambito della sua chiamata. È vero?

In tal caso, credo che ciò comporterebbe una perdita di memoria:

    abstract class Auto
    {
        // ... some stuff ...

        public static function Create($type)
        {
            switch ($type) {
                case 'Truck':
                    require_once('Truck.php');
                    return new Truck();
                    break;
                case 'Car':
                default:
                    require_once('Car.php');
                    return new Car();
                    break;
            }
        }
    }

Mi sembra che nel secondo esempio, più chiamate a Create () porterebbero a più requisiti a causa dell'ambito della chiamata anche se viene utilizzato il sapore Require_once.

È vero? Qual è il modo migliore per includere le librerie in modo dinamico in php in un esempio come questi?

Grazie!

È stato utile?

Soluzione

La funzione Autoload è spesso vista come malvagia, ma funziona abbastanza bene.

Se riesci a ottenere un buon filesystem < - > mappatura classname in modo che tu possa, quando ti viene data una classe da fornire, trovarla, quindi ti farà risparmiare spese generali e caricherà le classi solo quando necessario.

Funziona anche per le classi statiche, quindi una volta che la classe statica rientra nell'ambito, non è nemmeno necessario chiamare il " è ancora incluso il file " test di richiedi una volta, perché la classe è già nella tabella dei simboli.

Quindi puoi semplicemente creare

require("autoloader.php"); 
$x = new Car();  
$x = new Bike(); 

e li introdurrà quando necessario.

Vedi Php.net/__autoload per maggiori dettagli.

Altri suggerimenti

Consiglierei di utilizzare il caricatore automatico .

Cioè, non utilizzare require_once() per richiedere una sottoclasse, ma consente al caricatore automatico di chiamare una funzione che può caricare la classe di riferimento quando si chiama new Truck() o new Car().

Per quanto riguarda la domanda di perdita di memoria, no, require_once non è compreso nel blocco di codice.

Dai un'occhiata alla __autoload () funzione .

Il punto della funzione require_once è che, indipendentemente dall'ambito, non includerai un file due volte e ridefinirai una classe causando un errore PHP. Quindi non preoccuparti per le perdite di memoria, se si verifica la richiesta obbligatoria, la classe def entra nella tabella dei simboli globali solo una volta.

Ma a parte questo, sì, usa il caricatore automatico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top