الطريقة الصحيحة لتعيين فئة fileInfo مخصصة إلى ايتراتور

StackOverflow https://stackoverflow.com/questions/2572707

  •  24-09-2019
  •  | 
  •  

سؤال

أحاول تعيين فئة مخصصة على مؤلف من خلال setInfoClass طريقة:

استخدم هذه الطريقة لتعيين فئة مخصصة سيتم استخدامها عند استدعاء getFileInfo و GetPathinfo. يجب اشتقاق اسم الفصل الذي تم تمريره إلى هذه الطريقة من splfileinfo.

صفي مثل هذا (مثال مبسط):

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

رمز التكرار هو:

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

حيث RecursiveDirectoryIterator عن طريق الميراث من خلال DirectoryIterator أيضا SplFileInfo كائن ، يوفر setInfoClass طريقة. لم يتم إدراجها في الدليل ، لكن الانعكاس يظهر أنه موجود:

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

كل ما يصل إلى هنا ، ولكن عند التكرار على الدليل مع

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

أحصل على النتيجة الغريبة التالية

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 تم التقاطه ، لا يمكنني الوصول إلى خصائصها. إذا قمت بإضافة طرق مخصصة ، يمكنني استدعاءها بشكل جيد ، ولكن أي خصائص غير معروفة.

إذا لم أقم بتعيين فئة المعلومات على التكرار ، ولكن إلى كائن splfileinfo (كما هو موضح في المثال في الدليل) ، فسوف يعطي نفس النتيجة غير المعروفة:

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

ومع ذلك ، سوف يعمل عندما أفعل

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

لسوء الحظ ، فإن الكود الذي أرغب في استخدامه فيه أكثر تعقيدًا إلى حد ما ويكدس بعض التكرار. إنشاء فئة myfileinfo مثل هذا ليس خيارًا.

لذلك ، هل يعرف أي شخص كيفية عمل هذا العمل أو لماذا يتصرف PHP هذا غريب؟

شكرًا.

هل كانت مفيدة؟

المحلول

لا أستطيع أن أخبرك بالضبط السبب ولكنه يعمل مع

class MyFileInfo extends SplFileInfo
{
  public $props;

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

    parent::__construct($filename);
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top