PHP için ithalat paket veya autoloading?

5 Cevap php

Eğer bir PHP projesinde dosyaları da dahil olmak üzere ne çözüm önerirsiniz?

  1. Manuel aramalar gerektiren / fonksiyonları dahil değildir - özdevinimli_yükle fonksiyonları ile her şeyi yükler
  2. Paket ithal gerekli.

İşte API ithal paketi:

import('util.html.HTMLParser');
import('template.arras.*');

Bu işlev bildiriminde Eğer yıldız sembolü dizenin sonunda bulunursa, örneğin, sadece bunlardan birini veya hepsini içeren özel bir paket (klasör) dosyaları aracılığıyla döngü, nokta (paket hiyerarşi delimeter) ile dize patlayabilir ('Template.arras. *').

Ben paket ithal yöntemi görebilirsiniz yararlarından biri, daha iyi nesne ayrışma ve sınıf gruplandırma kullanmaya zorlamak olabilir.

Ben özdevinimli_yükle yöntemi görebilirsiniz sorunlardan biri - özdevinimli_yükle fonksiyon okunabilir / çok açık çok büyük değil, olabilir olmasıdır.

Bu konuda ne düşünüyorsunuz?

  • Bu yöntemlerin her ne fayda / sakıncaları adlandırabilirsiniz?
  • Nasıl proje için en iyi çözüm bulabilirsiniz?
  • Paket yönetim kullanılması durumunda herhangi bir performans sorunları olacaktır olmadığını nasıl bilebilirim?

5 Cevap

Ben __ autoload () yoğun kullanın. Bizim uygulamada kullanmak autload işlevi eski sınıfların geriye dönük uyumluluk için birkaç tweaks vardır, ama autoload () oldukça seemlessly çalışmak için izin yeni sınıflar oluştururken genelde bir uylaşımını:

  • Consistent Class Naming: kendi dosyasında her sınıf, her sınıf bir çizgi ile ayrılmış deve-dava ile adlandırılır. Bu sınıf yoluna eşler. Örneğin, Some_CoolClass sonra bizim sınıf dizinde 'Bazı / CoolClass.class.php' eşler. Bazı çerçeveler bu kuralı kullanabilirsiniz düşünüyorum.
  • Explicitly Require External Classes: biz kullanmak herhangi bir harici kütüphaneleri adlandırma üzerinde kontrol yok, çünkü biz PHP'nin require_once () işlevini kullanarak yükleyebilirsiniz.

Ben require_once kullanabilirsiniz (".. / Yol-to-auto-load-script.php.inc") otomatik yük ile

Ben daha kolay programaticaly anda talep ediliyor ne sınıf ismi belirlemek için yapar tüm sınıfları ve inc dosyaları için standart bir adlandırma kuralı var.

for example, all classes have a certain extension like inc.php
(so I know that they'll be in the /cls directory)
and
all inc files start with .ht (so they'll be in the /inc directory)

SınıfAdı, ben o dosya aslında nerede olduğunu belirlemek için kullanın: Otomatik yük bir parametre kabul eder. Ben her zaman (benim için otomatik yük kırmak gibiydi), alt alt sayfalara için hesap ".. /" ekleyerek ve sonunda bir kez bulunan gerçek kod dosyasını require_once'ing, benim hedef dizini ne olduğunu öğrendikten sonra döngü.

Ben kuvvetle yerine aşağıdaki yapıyor öneririz:

Statik bir dizi, SınıfAdı => filepath / classFile içine tüm sınıfları atmak. Otomatik yük fonksiyonu yük sınıfları için kullanabilirsiniz.

Bu her zaman dosyaları asgari miktar yük sağlar. Bu da tamamen aptal sınıf adlarını önlemek anlamına gelir ve ayrıştırma adları dedi.

Yavaşsa, bazı hızlandırıcı atabilir ve bu daha bir sürü sizi kazanacaktır, hala yavaş ise, sık kullanılan dosyalar sadece ortak dosyaları içine atıldığı bir 'derleme' süreci aracılığıyla şeyler çalıştırabilirsiniz, ve özdevinimli_yükle referanslar doğru yere işaret edecek güncellenebilir.

Sana inanmak zor bulmak sizin autoloading çok yavaş sorunları, içine çalışan başlarsanız, paketlerine göre bu kadar bölünmüş, ve çoklu autoloading fonksiyonlara sahip olabilir, dizinin sadece alt kümeleri gerekli olan bu yol, bu iyi çalışır eğer senin paketler yazılım modülleri etrafında tanımlanmıştır (giriş, yönetici, e-posta, ...)

I __autoload() bir hayranı değilim. Nispeten yeni ikinci parametre geçmeden kütüphaneler (örneğin bazı PEAR kütüphaneleri), developersuse class_exists() bir sürü. Eğer herhangi bir eski kodu da bu sorunu olabilir. Bir __autoload() tanımlanmış varsa, bu uyarıları ve hatalara neden olabilir.

Kitaplıkların olsa açık ve başa çıkmak için eski kodu yoksa, bu harika bir araçtır. Ben sorunu bu işlevselliği yerine __autoload() ile olduğunu düşünüyorum çünkü bazen, PHP onlar class_exists() davranışını başardı hakkında biraz akıllı olsaydı.

Kendi paketleme sistemi Rolling muhtemelen kötü bir fikirdir. Ben size açık manuel veya içerir autoload (ya da bu konuda bir kombinasyonu) ile birlikte gitmek öneririz.