الطريقة الصحيحة لتعيين فئة fileInfo مخصصة إلى ايتراتور
سؤال
أحاول تعيين فئة مخصصة على مؤلف من خلال 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);
}
}