yükleme php sınıfları ve kullanım performansını 'uzanır'

5 Cevap php

I have an includes.php page that I load at the start of every page of my website. As I develop the website, the number of classes that I am using is growing. So I end up with something like this:

$db = new DB($config);
$login = new Login($db, $config);
$form = new Form($db, $config);

And the list goes on and on. I have two questions about this practice:

İlk olarak, (Ben her sayfada bir $ formu olmayabilir) belli bir sayfada bir sınıfını kullanarak olabilir göz önüne alındığında, ne kadar gerçekten önemli mi, performans-bilge, her zaman bu sınıfı yüklemek için herhangi bir sayfa yüklendiğinde ?

İkinci olarak, ben tüm diğer sınıfların yanı sıra, bir değişken $ config sınıf örneği $ db geçirerek fark etmişsinizdir. Her sınıfın php kodu, ben böyle bir şey yapmak:

public $db;
public $config;

public function __construct($db, $config, $smarty){
    $this->db = $db;
    $this->config = $config;
}

Daha sonra sınıf yöntemleri, ben gibi 'bu' ile veritabanı ve yapılandırma dosyaları ele:

public function myfunction(){
  $this->db;
  $this->config;
}

Ne zaman her sınıf db kullanır varsayarak, yerine sınıfa $ db geçen daha 'uzanır' kullanmalıyım? Performans açısından herhangi bir şekilde her sınıf zarar vermek $ db geçen mu?

Teşekkürler!

5 Cevap

When should I use 'extends' rather than passing $db to the class, assuming every class uses the db?

Mantıklı zaman - ve öyle sadece!

Siz düşünün en az iki şey var:

  • "class A extends B" kind of means "class A **is a** B"
    • Daha açık bir şekilde, a Car a MotorVehicule arasından seçilir; a MotorVehicule a Vehicule arasından seçilir; a Bus a MotorVehicule arasından seçilir; Bisiklet bir Vehicule olduğunu
    • Bununla birlikte, bir Ball a Vehicule değil
    • Senin durumunda, bir Form kesinlikle olmayan bir DataBase! Ayrıca, bir Login olduğu
  • In PHP, a class can only extend one class
    • Sen hem Vehicule olmak bir şey var ve bir Animal edemez
    • Ancak a Car is a MotorVehicule, burada, kendisini, is a Vehicule :-)

Veritabanı nesnesi durumunda, sınıfların (in your case, it's more a connection to a DB), mosts kendilerini bir veritabanı bağlantısı "olarak" olmaz. Yani, bu sınıfı genişletir olmamalıdır.

Ancak, "has a" DB bağlantısı) bir DB bağlantısı (a Form kullanıyorsunuz; böylece, onlar DB bağlantısını temsil eden bir özelliği olmalıdır. Yani ne yapıyorsun bulunuyor.


Instead of passing $db to each constructor, you might use

  • ya Singleton tasarım deseni
  • veya Kayıt tasarım deseni
  • ya da bazı global değişken tür, ama bu hemen hemen aynı şey ... Sadece kötü olma (not OOP and all that)!

But passing the $db object is great for unit-testing, mock objects, and all that...
I think it could be considered as being the Dependancy Injection design pattern, btw (not sure, but looks like it)


Sınıflar çok yükleme hakkında, diğer insanlar cevap verdi:

  • Eğer autoloading kullanın
  • Eğer yapabilirsen, APC gibi bir opcode önbellek kullanın

Bunların ikisi de dikkate almalı büyük öneriler ;-)


Son bir şey:

Does passing $db to every class hurt in any way in terms of performance?

Belki bir little biraz yapar; ancak, honnestly, eğer dışında sen google ve milyonlarca kullanıcıya sahip ... Kimin umurunda?

If you are doing a couple of DB queries, those will take LOTS of time, comparing to passing one more parameter to even a dozen methods !
So, the small amount of time used passing paremeters can probably be neglected :-)

Eğer böyle bir şey denediniz mi?

function __autoload($class_name) {
 require_once("includes/php/class." . $class_name . ".php");
 }

So it only loads the class name when the class name is encountered. (Change the path to suit your php classes... mine are like class.Object.php, with the class name "Object").

If yükleme ve komut dosyalarını ayrıştırma size yaşam döngüsü bu kısmını hızlandırmak için apc gibi bir bytekod önbelleği kullanabilir bir darboğaz haline gelir.

Neden dahil gereken sadece dosyaları dahil değil? Ayrıca, ihtiyaç duyduğunuz yerde size sadece ihtiyacınız olan nesneleri örneğini deneyin. Olduğu gibi, sizin includes.php sen her zaman ihtiyaç olmayabilir örnekleme bir sürü yapıyor.

$db referans olarak geçirilir, bu performansını etkilemez. (Ben PHP5'ta hakkında çok şey bilmiyorum, ama PHP4 ile '&' değiştirici ile referans bir kavram yoktu.)

Burada ('extends') devralma kullanmak isterdim nasıl tam olarak emin değilim. Siz iki alan $db ve $config tanımlamak, ancak aksi takdirde fazla bir değişiklik olmaz kullanabilirsiniz.

Aslında başka bir sınıftan yararlı bir şey devralır istiyorsun Ayrıca, sizi kısıtlayabilir.

Sizin tasarım bağlı olarak, $config küresel hale düşünebilirsiniz. 1'den fazla yapılandırma aynı anda etkin olduğu bir durum var mı? Muhtemelen ancak küresel $db değişkeni tanıtmak için iyi bir fikir olmaz. Bu, örneğin, aynı anda birden fazla veritabanı bağlantısı gerekebilir olduğunu akla.