Bir Iterasyon özel bir Fileınfo sınıfı ayarını Doğru yolu

1 Cevap php

Ben setInfoClass yöntemi ile bir Iterasyon özel bir sınıf ayarlamak çalışıyorum:

GetFileInfo ve getPathInfo denir zaman kullanılacak bir özel sınıf ayarlamak için bu yöntemi kullanın. Bu metoda sınıf adı SplFileInfo türetilmiş olmalıdır.

Benim sınıf Bu (basitleştirilmiş örnek) gibi:

class MyFileInfo extends SplFileInfo
{
    public $props = array(
        'foo' => '1',
        'bar' => '2'
    );
}

Yineleyici kod şudur:

$rit = new RecursiveIteratorIterator(
           new RecursiveDirectoryIterator('/some/file/path/'),
           RecursiveIteratorIterator::SELF_FIRST);

Yana RecursiveDirectoryIterator is by inheritance through DirectoryIterator also an SplFileInfo object, it provides the setInfoClass yöntemi. Bu kılavuzda listelenen, ancak yansıma orada olduğunu gösteriyor değil:

shell$ php --rc RecursiveDirectoryIterator
// ...
Method [ <internal:SPL, inherits SplFileInfo> public method setInfoClass ] {  
  - Parameters [1] {
    Parameter #0 [ <optional> $class_name ]
  }
}

Tüm buraya kadar iyi, fakat dizindeki üzerinde yineleme zaman

$rit->getInnerIterator()->setInfoClass('MyFileInfo');
foreach($rit as $file) {
    var_dump( $file );
}

Ben şu garip sonuç almak

object(MyFileInfo)#4 (3) {
  ["props"]=>UNKNOWN:0
  ["pathName":"SplFileInfo":private]=>string(49) "/some/file/path/someFile.txt"
  ["fileName":"SplFileInfo":private]=>string(25) "someFile.txt"
}

MyFileInfo kaldırdı iken Yani, ben bu özellikleri bulunuyor erişemiyor. Ben özel yöntem eklerseniz, ben onları iyi çağırabilirsiniz, ancak herhangi bir özellikleri BİLİNMEYEN vardır.

Ben yineleyici bilgileri sınıf set yoksa, ama SplFileInfo nesnesine (kılavuzda örnekte gösterildiği gibi), aynı BİLİNMEYEN sonucu verecektir:

foreach($rit as $file) {
    // $file is a SplFileInfo instance
    $file->setInfoClass('MyFileInfo');
    var_dump( $file->getFileInfo() );
}

Ben ne zaman Ancak, bu iş olacak

foreach($rit as $file) {
    $file = new MyFileInfo($file);
    var_dump( $file );
}

Ne yazık ki, bu kullanmak istediğiniz kod biraz daha karmaşık olduğunu ve biraz daha Yineleyicilerde yığar. Böyle MyFileInfo sınıf oluşturma bir seçenek değildir.

Yani, herkes bu çalışma almak için nasıl biliyor veya neden PHP bu garip davranır?

Teşekkürler.

1 Cevap

Ile çalışır ama neden tam olarak söyleyemem

class MyFileInfo extends SplFileInfo
{
  public $props;

  public function __construct($filename) {
    $this->props = array(
      'foo' => '1',
      'bar' => '2'
    );

    parent::__construct($filename);
  }
}