Kullanacağımız bir sistemde "uses" adlı bir işlev var. Pascal'ı biliyorsanız, kullanım cümlesi, programınıza bağımlılıklarının neler olduğunu (C ve PHP'ye benzer şekilde) söyler. Bu işlev, içerme (_once) veya gerektiren (_once) dışındaki dosya eklerini kontrol etmek için kullanılıyor.PHP Sabit dize parametreleri belirteci
Test prosedürlerinin bir parçası olarak, statik olarak yüklenmiş dosyalar için bir bağımlılık görselleştirme aracı yazmam gerekiyor.
Statik Yüklü Örnek: uses('core/core.php','core/security.php');
Dinamik Yüklü Örnek: uses('exts/database.'.$driver.'.php');
kod değil çalışırken, statik olarak test edilir çünkü dinamik yük durumları filtrelemek için gereken
.
$inuses=false; // whether currently in uses function or not
$uses=array(); // holds dependencies (line=>file)
$tknbuf=array(); // last token
foreach(token_get_all(file_get_contents($file)) as $token){
// detect uses function
if(!$inuses && is_array($token) && $token[0]==T_STRING && $token[1]=='uses')$inuses=true;
// detect uses argument (dependency file)
if($inuses && is_array($token) && $token[0]==T_CONSTANT_ENCAPSED_STRING)$tknbuf=$token;
// detect the end of uses function
if($inuses && is_string($token) && $token==')'){
$inuses=false;
isset($uses[$tknbuf[2]])
? $uses[$tknbuf[2]][]=$tknbuf[1]
: $uses[$tknbuf[2]]=array($tknbuf[1]);
}
// a new argument (dependency) is found
if($inuses && is_string($token) && $token==',')
isset($uses[$tknbuf[2]])
? $uses[$tknbuf[2]][]=$tknbuf[1]
: $uses[$tknbuf[2]]=array($tknbuf[1]);
}
Not:
Bu
ben şu anda kullanıyorum kodudur Ben argümanları algılamak için bir devlet motorunu kullanıyorum olduğunu bilmek yardımcı olabilir.Sorunum? Fonksiyona girebilecek her türlü argüman olduğu için, onu doğru bulmak çok zor. Belki de doğru yaklaşımı kullanmıyorum, ancak, ben bu durumda en iyi token_get_all
kullanarak eminim. Bu yüzden sorun aslında o kadar iyi olmayan devlet motorum. Kolay yolu kaçırıyor olabilirim, bazı hakem değerlendirmelerini alacağımı düşündüm.
Düzenleme: Bu sefer ne yaptığımı açıklamaya yaklaşımı aldım, ancak tam olarak ne istediğimi değil. Basit kelimelerle, "uses" adlı bir işleve iletilen argüman dizisini almam gerekiyor. Mesele, argümanlar hakkında biraz spesifik olduğum; Sadece bir dizi düz diziye ihtiyacım var, hiç dinamik kod yok (sabitler, değişkenler, işlev çağrıları ...).
Neden sadece derslerin otomatik yüklenmesini kullanmadığını sorun. – Mchl
Gerçekten, regex = evil meme hakkında unutun. Bu **, onlar için bir kullanım durumudur. – mario
@Mchl - Çünkü bu özellikle sınıfları ilgilendirmiyor. @Mario - Kuşkusuz, regex ile çok iyi değilim. Her iki durumda da, PHP kodlarını ayrıştırmak için regex oluşturmak ve çalıştırmak oldukça yavaştır. – Christian