PHP spl_autoload

3 Cevap php

i gerçekten spl_autoload için docs dont almak

bool spl_autoload_register  ([ callback $autoload_function  ] )

benim anlayış, bu php zaten yüklü değil, bir sınıf karşısında söz konusu olduğunda kayıtlı fonksiyonlarını çalıştırmak için çalışacağız. bu yüzden, örneğin,

public function autoload() {
    require ('nonLoadedClass.php');
}
spl_autoload_register(autoload);
$x = new nonLoadedClass();

çalıştırmak için gerekli neden olur? bu yüzden de çok özdevinimli_yükle fonksiyonları kayıt yaptırabilir?

public function autoloadXXX() {...}
public function autoloadYYY() {...}
public function autoloadZZZ() {...}
spl_autoload_register('autoloadXXX');
spl_autoload_register('autoloadYYY');
spl_autoload_register('autoloadZZZ');

doktrin durumunda,

require_once(dirname(__FILE__) . '/lib/vendor/doctrine/Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));

bir dizi geçti, bu yüzden o (gerekli olan) Doktrini sınıf içinde autoload işlevi çalıştırmak için çalışacağız tahmin edilir?

3 Cevap

spl_autoloader_register kodu-bilinmemektedir sınıfını kullanmak için çalışırken zaman çağrılacak bir geri çağırma işlevi / yöntem, kaydeder.

A callback işlevi çeşitli yollarla tanımlanabilir:

  • basit bir işlev adı: 'my_function'
  • bir sınıfın statik bir yöntem: array('MyClass', 'myMethod')
  • Bir sınıfın bir örneğinin yöntemi: array($myObject, 'myMethod')

Doktrini durumunda, ikinci bir çözüm gibi görünüyor: PHP bilmeyen bir sınıf kullanılırsa, autoloader bir parametre olarak o sınıf adı geçen, Doctrine::autoload arayacak.


so i can also register many autoload functions?

Evet, yapabilirsiniz, ile spl_autoload_register :

If there must be multiple autoload functions, spl_autoload_register() allows for this. It effectively creates a queue of autoload functions, and runs through each of them in the order they are defined.

Ama biz genelde biz her sınıf için tek autoloading fonksiyon / metot tanımlamak gerekmez; oldukça verimsiz olurdu sanırım.

Bunun yerine, biz dahil edilmelidir hangi dosya karar, autoloading işlevi tarafından alınan sınıf adını kullanın.

Örneğin, bir autoload işlevi aşağıdaki gibi görünebilir:

function my_autoloader($className)
{
    require LIBRARY_PATH . '/' . $className . '.php';
}

Hile dosyaları içerdikleri sınıfların adını ise, bu anında çok daha kolay hale gelir olmak ;-)

Bu sınıflar genellikle PEAR kuralını kullanarak adlandırılır neden: dosyaya My_Class_Name haritaları My/Class/Name.php

Tüm ifadesi doğrudur.

spl_autoload_register Birden özdevinimli_yükle fonksiyonları kaydetmek için izin verir. Eğer PHP ortama yüklenmiş henüz bir sınıfın bir nesnesi oluşturmak veya kullanmayı deneyin durumda, PHP bu sınıf için arayan tüm özdevinimli_yükle fonksiyonları çalışacaktır.

Vereceğiniz Doktrini örnek bir sınıf içinde bir yöntemi kaydetmek için callback denen şeyi kullanıyor. Bir geri basitçe (statik yöntemler için) sınıf adını ya da (non-statik yöntemleri için) bu sınıfın bir örneğini ve yöntem ismi içeren bir dizidir.

Ne diyelim doğru. Bilinmeyen bir sınıf örneği zaman denir. Daha sonra gerekli dosyayı gerektiren / eklemek için şans.

Işlevi bir sınıfta bulunduğu zaman, bir dizi geçmek zorunda. Bunun yerine Doktrini sınıfının bir örneğinin Doktrini sınıfında geçmek çünkü bu durumda statik bir fonksiyon.