Statik fabrika deseni kullanırken PHP kitaplıkları dahil etmek en iyi yolu nedir?

4 Cevap php

Ben PHP kütüphanede birkaç statik fabrika desenleri var. Ancak, bellek izi yandan dışarı oluyor ve biz yürütme zamanı sırasında gerekli dosyaların sayısını azaltmak istiyorum. İşte bugün nerede bir örnektir:

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;
        }
    }
}

Car.php ve Truck.php sadece bir ya da diğer gerekli olabilir bile dahil edilmesi gerekir, çünkü bu istenmeyen bir durumdur. Bildiğim kadarıyla, include / gerektiren ve çağrısı olarak ... _once varyasyon aynı kapsamında kütüphaneler içerir. Bu doğru mudur?

Eğer öyleyse, ben bu bir bellek sızıntısına neden olacağına inanıyorum:

    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;
            }
        }
    }

Bu 2. örnekte, çoklu aramaları () çoklu yol açacak çünkü Require_once lezzet kullanılsa bile aramanın kapsamı gerektiren oluşturma olduğunu bana görünüyor.

Bu doğru mudur? Bu gibi bir örnekte php dinamik kütüphaneleri dahil etmek en iyi yolu nedir?

Teşekkürler!

4 Cevap

Autoload tesis genellikle Evil olarak görülebilir, ama oldukça güzel bu görevde çalışır.

Eğer iyi bir dosya sistemi alabilirsiniz <-> classname haritalama böylece can, sağlamak bulmak, gerektiğinde o havai ve sadece yük sınıfları sizi kurtaracak bir sınıf verildiğinde.

Çok statik sınıflar için çalışır, bu yüzden statik sınıf kapsamında bir kez, hatta aramak gerekmez Sınıf sembol tablosunda zaten, çünkü bir zamanlar gerektiren bir test "dosyası henüz dahil edilir".

Sonra sadece oluşturabilirsiniz

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

gerektiğinde ve sadece onları getirecektir.

Php.net/__autoload daha fazla bilgi için bkz.

Ben autoloader kullanarak öneriyoruz.

Bu alt sınıf ya gerektirecek require_once() kullanmak istemiyorum, ama autoloader sen new Truck() veya {[(2)] çağırdığınızda başvurulan sınıf yükleyebilirsiniz bir işlevi çağırmak için izin verir }.

Bellek sızıntısı sorusuna gelince, hayır, require_once kod bloğu tarafından kapsamlı değildir.

__autoload() function için bir göz atın.

Require_once fonksiyonunun noktası olursa olsun kapsam, iki kez bir dosya içerir ve bir PHP hatası neden bir sınıf yeniden tanımlamak değil olmasıdır. Require_once isabet Yani bellek sızıntıları hakkında hiçbir endişe, sınıf def global simge tablosu sadece bir kez gider.

Bunun dışında, evet autoloader kullanın.