سؤال

بعد إجراء القليل من الأبحاث ، صادفت في النهاية إجابة سؤال كنت قريبًا لأطرحه هنا على أي حال ؛ كيف تعمل مع المصفوفات عبر __get و __set الأساليب السحرية في PHP؟ كلما كنت أحاول تعيين قيمة باستخدام شيء مثل $object->foo['bar'] = 42; يبدو أنه تجاهلها بصمت.

على أي حال ، الجواب بسيط ؛ ال __get الطريقة تحتاج ببساطة إلى العودة بالرجوع إليها. وبعد رمي أمبير والأمهات أمامه ، من المؤكد أنها تعمل.

سؤالي في الواقع ، هو لماذا؟ لا يمكنني أن أفهم لماذا يعمل هذا. كيف __get العودة بالرجوع لها التأثير __set العمل مع المصفوفات متعددة الأبعاد؟

تحرير: بالمناسبة ، تشغيل PHP 5.3.1

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

المحلول

في هذه الحالة بالذات ، __set لا يتم استدعاء في الواقع. إذا قمت بتفكيك ما يحدث ، فيجب أن يكون الأمر أكثر منطقية:

$tmp = $object->__get('foo');
$tmp['bar'] = 42

إذا __get لم ترد مرجعًا ، ثم بدلاً من تعيين 42 إلى فهرس "الشريط" للكائن الأصلي ، فأنت تُعين بمؤشر "الشريط" لـ a ينسخ من الكائن الأصلي.

نصائح أخرى

في PHP عند إرجاع قيمة من دالة ، يمكنك التفكير في إعداد نسخة من هذه القيمة (ما لم تكن فئة). في حالة ما اذا __get ما لم ترد الشيء الفعلي الذي تريد تحريره ، يتم إجراء جميع التغييرات على نسخة يتم تجاهلها بعد ذلك.

ربما أكثر وضوحا:

//PHP will try to interpret this:
$object->foo['bar'] = 42

//The PHP interpreter will try to evaluate first 
$object->foo

//To do this, it will call 
$object->__get('foo')
// and not __get("foo['bar']"). __get() has no idea about ['bar']

//If we have get defined as &__get(), this will return $_data['foo'] element 
//by reference.
//This array element has some value, like a string: 
$_data['foo'] = 'value';

//Then, after __get returns, the PHP interpreter will add ['bar'] to that
//reference.
$_data['foo']['bar']

//Array element $_data['foo'] becomes an array with one key, 'bar'. 
$_data['foo'] = array('bar' => null)

//That key will be assigned the value 42
$_data['foo']['bar'] = 42

//42 will be stored in $_data array because __get() returned a reference in that
//array. If __get() would return the array element by value, PHP would have to 
//create a temporary variable for that element (like $tmp). Then we would make 
//that variable an array with $tmp['bar'] and assign 42 to that key. As soon 
//as php would continue to the next line of code, that $tmp variable would 
//not be used any more and it will be garbage collected.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top