PHP dosyaları yükler içeren bir dizin üzerinde yineleme ve sınıfları her dosyasında tanımlanır ne algılamaya çalışıyorum.
Aşağıdaki düşünün:
$php_files_and_content = new PhpFileAndContentIterator($dir);
foreach($php_files_and_content as $filepath => $sourceCode) {
// echo $filepath, $sourceCode
}
Yukarıdaki $php_files_and_content
değişkeni anahtar filepath bir yineleyici temsil eder ve içeriği (bu örnekte açıkça değildi sanki) dosyasının kaynak kodu.
Bu daha sonra ala, kaynak kodu tüm tanımlı sınıfları maç olacak başka bir yineleyici içine verilir:
class DefinedClassDetector extends FilterIterator implements RecursiveIterator {
public function accept() {
return $this->hasChildren();
}
public function hasChildren() {
$classes = getDefinedClasses($this->current());
return !empty($classes);
}
public function getChildren() {
return new RecursiveArrayIterator(getDefinedClasses($this->current()));
}
}
$defined_classes = new RecursiveIteratorIterator(new DefinedClassDetector($php_files_and_content));
foreach($defined_classes as $index => $class) {
// print "$index => $class"; outputs:
// 0 => Class A
// 1 => Class B
// 0 => Class C
}
'C Sınıfı' ikinci kaynak kod dosyasında tanımlanan ve böylece dizi tekrar endeksi 0 dan başlar döndü çünkü $index
sayısal sıralı değil nedenidir. Sonuçların her set ayrı bir yineleyici (ve dolayısıyla anahtar / değer çiftleri) temsil çünkü bu RecursiveIteratorIterator korunur.
Her neyse, ne şimdi yapmaya çalışıyorum bu birleştirmek için en iyi yolu bulmak olduğunu ben yeni yineleyici üzerinde yineleme zaman, ben anahtar sınıf adı (alanından $defined_classes
yineleyici) ve olduğu alabilirsiniz böyle değeri, orijinal dosya yolu, ala:
foreach($classes_and_paths as $filepath => $class) {
// print "$class => $filepath"; outputs
// Class A => file1.php
// Class B => file1.php
// Class C => file2.php
}
Ben şimdiye kadar şaşırıp Ve işte burada.
Şu anda, akla geliyor tek çözüm (orijinal filepath olurdu) Geçerli geçersiz kılan yeni bir RecursiveIterator, (dış yineleyici anahtar dönmek) yöntemi () oluşturmak için, ve anahtar () yöntemi, geri dönmek için geçerli yineleyici () değer. : Ama bu çözüm, çünkü lehine değilim
- Bu kod iğrenç bakacağız demektir (karmaşık geliyor ve bu sezgisel olmayacak
- Bazı genel iterators tanımlamak ve istenilen sonucu üretmek için böyle bir şekilde bunları birleştirmek mümkün olmak istiyorum oysa iş kuralları, sınıf içinde kodlanmış olan.
Herhangi bir fikir veya öneri minnetle aldı.
Ben de bunu daha etkin yolu, çok hızlı vardır farkında, ama bu da myselfm için yineleyicileri kullanarak ve aynı zamanda kodu yeniden teşvik bir egzersiz bir egzersiz olduğunu, bu nedenle yazılı olması yeni Iterators mümkün olduğunca az olmalıdır ve mevcut işlevselliğini kaldıraç çalışın.
Teşekkürler