__ Autoload kullanarak atlamak nasıl?

2 Cevap

Ben birden çok sınıfları olan bir php dosyası var. Ben sınıfların herhangi örneğini zaman __ özdevinimli_yükle 'paket' dosyası özdevinimli sonra bile, çağrıldığını fark ettim. Ilk 'paket'. Php dosyası yüklü olup olmadığını mutlaka, bu sınıflar zaten yüklenmiş edildiğinde autoload __ için gereksiz yükü çünkü bu, beni endişe vericidir.

Ben muhtemelen bu yüzden burada bir örnek, olduğunu açıklayan bir hash yaptı:

<?php
class Class1{};
class Class2{};
?>

Sonra başka bir dosyada:

<?php
new Class1;
new Class2;
?>

__autoload onlar aynı dosyada yer olsa bile ... Class1 VE class2 en örnekleme her ikisi için de kullanılır.

Bunu aşmanın bir yolu var mı?

Benim açıklama çok iyi değilse üzgünüm, ben gerçekten herhangi bir yardım veya ipuçları takdir ediyorum.

2 Cevap

Bir sınıf yoksa PHP'nin özdevinimli_yükle sadece aranmalıdır. : Başka bir deyişle, en temel, örneğin, bu da aynı mantık kullanır

if( !class_exists("Class1") )
    require "path\Class1.php"; 

Aksi bulgu varsa, ben her şeyi doğru yapıyor emin olun ve bir hatayı bildirmek için denetleyin.

PHP.net / autoload dan (önemli belgeler vurgulanan):

In PHP 5, this is no longer necessary. You may define an __autoload function which is automatically called in case you are trying to use a class/interface which hasn't been defined yet. By calling this function the scripting engine is given a last chance to load the class before PHP fails with an error.

Biçimlendirme Bug, ancak vurgu "Henüz tanımlanmamış olduğu" oldu. Bir sınıf derlenmiş "Tanımlı" (çoğu durumda dedi sınıfını içeren bir dosya dahil edildiğinde) oluşur.

Class2 ilk çağrının sonucunda belirlenen aldığımda __autoload kesinlikle ikinci kez çağrıldığında DEĞİLDİR.

İlk classes.php

<?php
class Class1 {};
class Class2 {};

Şimdi dnm.php

<?php
function __autoload ($class)
{
    print "Autoloading $class\n";
    require 'classes.php';

}

$a = new Class1;
$b = new Class2;

print get_class($b);

Eğer test.php çalıştırdığınızda, sonuç:

Autoloading Class1
Class2

Farklı sonuç alıyorsanız, o zaman bize söylemediğin bir şey var.