لا يعمل ArrayObject الممتد بشكل صحيح
-
23-09-2019 - |
سؤال
أحاول تمديد مجموعة SPL ArrayObject ولكني ضربت القليل من العقبة. باستخدام ArrayObject غير المعدل ، يعمل هذا الرمز:
$a = new ArrayObject();
$a[1][2] = 'abc';
print_r($a);
تسفر عن هذا المخرج:
ArrayObject Object
(
[storage:ArrayObject:private] => Array
(
[1] => Array
(
[2] => abc
)
)
)
ومع ذلك ، إذا قمت بتمديد ArrayObject وحملت طريقة الإزاحة
class ExtendedArray extends ArrayObject {
function offsetGet($i) {
return parent::offsetGet($i);
}
}
$a = new ExtendedArray();
$a[1][2] = 'abc';
print_r($a);
ثم يفشل هكذا:
ExtendedArray Object
(
[storage:ArrayObject:private] => Array
(
)
)
ما الذي يتطلبه الأمر لجعل صفتي الصفية الممتدة مع صفائف متعددة الأبعاد؟
المحلول
بالنسبة لي ، فإن المقتطف رقم 1 مكسور إلى حد ما ، وليس رقم 2. أنت تصل إلى عنصر لا يوجد ، ويمنحك الرمز رقم 2 بالضبط ما يتوقعه المرء: تحذير. السبب في أن #1 kinda "يعمل" هو quirk ، أو اثنين من المراوغات من PHP. أولاً ، عند تطبيق [] = المشغل على NULL ، يتم تحويل هذا الفارغ "بطريقة سحرية" إلى صفيف - دون كلمة واحدة من التحذير من مترجم.
$a = null;
$a[1] = 'foo'; // "works"
print_r($a);
ثانياً ، لا ينطبق هذا (عن قصد أم لا) على خام يتم إرجاعه من __get أو الإزاحة.
class foo {
function __get($s) { return null; }
}
$a = new foo;
$a->x[1] = 'foo'; // error
print_r($a);
تقول رسالة الخطأ "التعديل غير المباشر للممتلكات المحملة الزائدة" ، ومهما كان ذلك ، فهو أمر جيد - لا يُسمح لك بتعديل القيمة الفارغة بأي طريقة.