SplFileInfo nesneler karşılaştırılarak her zaman true döndürür

1 Cevap

Ben hemen hemen bu çirkin kafa yetiştirme sadece sızdıran soyutlama olduğuna kendimi ikna ettik, ama ben daha anlayışlı cevap yığın taşması disinda bir hata raporu dosyalama önce düşündüm ...

Ben autoloading yardımcı PHP bir sınıf yazıyorum. Ben Zend framework kullanır gibi saçma, yol-odaklı sınıf adlarını kullanarak nefret, bu yüzden yerine ardışık, bir dizin ve onun alt dizinlerinin geçmesi tüm PHP kaynak dosyaları bulmak ve sınıf için onları ayrıştırmak için bir nesne oluşturur bir sınıf yazdım sonra önbelleğe ve özdevinimli_yükle dizinini güncellemek için nesneyi sorar ki, başarısız kadar tekrar edilir tanımları.

Ben mümkün ben SplFileInfo sınıfını kullandım endekslenmiş yolları için çok, yerleşik PHP sınıfları kullanmak ister.

Sınıfların dizini güncelleştirmek için gerekli operasyonların bazıları I dizi aramak gerektirir SplFileInfo Benim nesne (I {[üzerinde karşılaştırma operatörü kullanarak küçük bir sorun haline çalıştırmak nerede, hangi tutar nesneleri 0)]} nesne.

Basitçe söylemek gerekirse, herhangi bir dosya ararken her zaman true döndürür. Ben ilk başta onun tarafından biraz şaşkın, ama ben iki makine üzerinde denedim ve bir arkadaşı onun üzerinde denemek yaşadım - aynı sonuç. Görünüşte ne olursa olsun, sen karşılaştırma (==) operatörü kullanılarak iki SplFileInfo nesneleri karşılaştırmak, doğru döner, tamamen dizinleri bulunan farklı dosyalara işaret bile. Ben dizideki her öğe üzerinde yinelemek ve bu şekilde karşılaştırmak, in_array() kullanmak veya array_search() için bir döngü kullanabilirsiniz olsun, her zaman true döndürür ve tamamen farklı bir dosyaya bana bir başvuru verir .

Ben biraz daha kurcaladım ve buldum bu iki SplFileInfo noktası nesneleri bile, (===) her zaman döndürür false operatörünü tanımlamak aynı yolu dize ile başlatıldı tam aynı dosyayı, için.

Benim kod için, bu demektir ki ben herhangi bir yeni dosyalar varsa bir dosya yeni olsa bile, dizinleyici nesne zaten bu dosya hakkında bilir ve hamle düşünüyor, görmek için sınıf dizini güncelleştirmek için gittiğinizde. Ben Yoladı dizeleri karşılaştırarak bu iş için yapılmış, ancak ettik yenilgiler bu tür ile başlamak için SplFileInfo sınıfını kullanarak amacı.

PHP kılavuzu uzantısı geliştiriciler Ben tür SplFileInfo göreli yolları gidermek ve düzgün, diğer göreli yollar ile, örneğin karşılaştırmak kadar akıllı olduğunu kabul neden olan, nesneler için karşılaştırma operatörleri aşırı söylüyor ./file ve file eşittir. Iki SplFileInfo nesneleri karşılaştırırken bu always true döndürür çünkü sadece bu örnekleri doğru dönüyordu, çıkıyor!

Bu üzerinde çalışıyorum koduna bağlı değildir. Ben bazı yeni SplFileInfo nesneler ile bir çizik kaynak dosyayı denedim ve bunları karşılaştırdık. Bu nesneler farklı dosyaları, aynı dosya, ve var olmayan dosyalara işaret olmadığını true döndürür.

Bu PHP nesneler karşılaştırma operatörleri için varsayılan davranış olmadığından, bu neden uzantısı sınıf tanımında bir şey olması zorunludur.

Herkes böyle davranıyor neden herhangi bir fikrim yok, ya da herhangi bir fikir var mı?

1 Cevap

Andrew,

Ben bazı SPL sınıfları ile kendimi deneme ve surpisingly SplFileInfo bu davranışı sergiler sadece SPL sınıf değildir yaptık. ArrayIterator, örneğin, çok aynı şekilde tepki verir. Ben daha çok (hepsi değilse) SPL sınıfları bu davranış var sanırım.

Ben bu davranış var neden olarak bir cevap yok rağmen, ben senin özel durum için bir çözüm var. Zaten bu ile kendinizi gelmiş olabilir, ama ben yine de I'ld paylaşmak düşündüm:

class MyFileInfo extends SplFileInfo
{
    private $_realPath;

    public function __construct( $path )
    {
        parent::__construct( $path );
        $this->_realPath = $this->getRealPath();
    }

}