سؤال

أحاول تمديد مجموعة 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);  

تقول رسالة الخطأ "التعديل غير المباشر للممتلكات المحملة الزائدة" ، ومهما كان ذلك ، فهو أمر جيد - لا يُسمح لك بتعديل القيمة الفارغة بأي طريقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top