Can PHP __ özdevinimli_yükle (aynı sınıftan başka __ autoload içinde) bir sınıf (?)

0 Cevap php

Tamam, bu bence ... zor biridir ve ben bir cevap duygu hiçbir basitçe var, ama bu durumda ben alternatifler için bazı cevaplar istiyorum.

Ben dinamik sınıfları oluşturabilirsiniz bir çerçevede bir çok karmaşık __ autoload () fonksiyonu var. Orada AuthActions adında bir sınıf dinamik yaratılması için gereklidir üç sınıfları - bu üç şunlardır: fRecordSet, RecordSet ve AuthAction (bu bir hayır S var unutmayın).

Benim autoloader herhangi bir sınıf bu yükler statik bir yöntem "init" bakmak ve bu çalıştırmak için çalışacağız. Benim ActiveRecord sınıf belirli bir aktif rekor desteklenen faaliyetlerin bir listesini almak için AuthActions kullanmayı dener. AuthAction (hayır S) de bu nedenle temelde Active Record yüklenir, init var içinde AuthActions çağırır ve AuthActions yüklemeye çalışır, diğer üç yükleme tetikleme ve özgün autoloader AuthAction içinde hala AuthAction yükleme sona erdiğinde sonra aramaya çalışır özgün bir yana başka autoload tetikler AuthActions henüz tamamlanmadı.

Bu netleştirmek için bazı yankı ifadeleri vardır aşağıdaki neden olur:

Attempting to load ActiveRecord
Attempting to load fActiveRecord
fActiveRecord loaded via /var/www/dotink.org/inkwelldemo/inc/lib/flourish
ActiveRecord loaded via /var/www/dotink.org/inkwelldemo/inc/lib
Attempting to load AuthActions
Attempting to load RecordSet
Attempting to load fRecordSet
fRecordSet loaded via /var/www/dotink.org/inkwelldemo/inc/lib/flourish
RecordSet loaded via /var/www/dotink.org/inkwelldemo/inc/lib
Attempting to load AuthAction
AuthAction loaded via /var/www/dotink.org/inkwelldemo/models

Ölümcül hata: Sınıf 'AuthActions' hat 24 üzerinde / var / www / dotink.org / inkwelldemo / modelleri / AuthAction.php bulunamadı

Burada sorun gerektirir üç sınıfları yerinde artık ... ama o zaten autoload 'AuthActions' çalışıyor yalnız öncül ölmek gibi görünüyor, çünkü autoload ('AuthActions') __ için sonraki çağrı başarılı olduğunu ifade - Bu PHP içine hardwrit gibi görünüyor.

Bu test hiçbir hata ile sonsuza aşağıdaki irade döngü bulundu:

function __autoload($class) {
  __autoload($class);
}

$foo = new Bar();

Aşağıda bu benzer hata olsa:

function __autoload($class) {
  $test = new Bar();
}

$foo = new Bar();

Aslında onlar aynı şey (tür) tutarında gerektiği gibi bu davranış, tutarsız görünüyor. PHP dahili tetiklenen autoloads autoload __ bir kullanıcı çağrı gibi hareket ederse () Ben bir sorun olacağını sanmıyorum (ya da ben yaptım eğer o tespiti ayrı bir sorun olacaktır sonsuza dek döngü bunun bir sorun olacağını neden sınıf) bağımlılıkları çözümlemek için yüklü elde değildi.

Kısacası, ben ... autoloads PHP tetiklenen göre bu gibi ardışık döngü autoloader ya bir yol gerekir mümkün bu basitçe değil? Muhtemelen benim özel sürümünde bir hata mı? Bu 5.2.6 etkileyen gibi görünüyor - benim testlerde 5.3.2, bu yüzden genel bir hata hayal edemez.

Güncelleme:

AuthAction üzerindeki init yöntemi () için kod aşağıda:

        /**
     * Initializes the AuthAction model
     *
     * @param array $config The configuration array
     * @return void
     */
    static public function init($config) {

        // Establish permission definitions and supported actions

        $every_permission  = 0;
        $supported_actions = array();

        foreach (AuthActions::build() as $auth_action) {
            $action_name         = $auth_action->getName();
            $action_value        = intval($auth_action->getBitValue());
            $every_permission    = $every_permission | $action_value;
            $supported_actions[] = $action_name;
            define(self::makeDefinition($action_name), $action_value);
        }
        define('PERM_ALL', $every_permission);

    }

Bunu ayrı bir sınıf olarak AuthActions aradığını nerede olduğunu görmek ve o başarısız yüklemek için orijinal girişimi içinde yüklü ediliyor çünkü sadece sakıncası olabilir. Açıkçası bu kodu kaldırabilirsiniz ve bu iş olacak - tüm ön koşul sınıflar sonra yüklü olarak AuthActions orijinal yük başarıyla tamamlanır.

O dedi, init () Bu kod için en uygun yer olduğunu, ve ben init içinde henüz yüklenmiş henüz arası bağımlı sınıfları kullanmak kuramıyorum bile () ben hala işlevselliğini tutmayı tercih ediyorum. Bu işlevselliği uygulama herhangi bir alternatif yol harika olurdu ... İdeal PHP bir "özdevinimli" olayı tetiklenir derken örneğin bir geri kayıt olabilir böyle şeyler için etkinlik olurdu. Bu kod, orijinal autoload SONRA çalıştırmak için izin verecek ve bu görünüşte anlamsız kısıtlama çözecek.

Dedi şimdi, otomatik olarak bir sınıf () o yüklü olduğu her zaman init aramak için nasıl bir öneri takdir ve hoş geldiniz edilmektedir.

0 Cevap