سؤال

في التحديثات الأخيرة إلى PHP، أضافوا في واجهات مختلفة للسماح بمعالجة كائن كصفيف، مثل ArrayAccess، ITERACTOR، عد، إلخ.

سؤالي هو، هل سيكون من المنطقي أن يعمل ما يلي:

function useArray(array $array)
{
    print_r($array);
}

useArray(new ArrayObj(array(1,2,3,4,5));

اعتبارا من الآن، يلقي PHP خطأ في تلميح النوع، كما $array ليس من الناحية الفنية صفيف. ومع ذلك، فإنه ينفذ جميع الواجهات التي تجعلها متطابقة أساسا إلى صفيف.

echo $array[0]; // 1
$array[0] = 2;
echo $array[0]; // 2

منطقيا، يجب أن يكون الكائن قادرا على استخدامه في أي مكان يمكن استخدام صفيف، لأنه ينفذ نفس الواجهة كصفيف.

هل أنت مرتبك في منطقتي، أو هل من المنطقي أنه إذا كان كائن ينفذ نفس الواجهة كصفيف، فينبغي أن تكون قادرا على استخدامها في كل نفس الأماكن؟

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

المحلول

هل أنت مرتبك في منطقتي، أو هل من المنطقي أنه إذا كان كائن ينفذ نفس الواجهة كصفيف، فينبغي أن تكون قادرا على استخدامها في كل نفس الأماكن؟

أ array هو نوع متغير PHP الخاص - ليس كائن - على هذا النحو لا ينفذ أي واجهات. ArrayObject هو كائن كامل ينفذ العديد من الواجهات (Countable, ArrayAccess, وما إلى ذلك) ويمكنك كائن يتصرف مثل صفيف في حالات معينة (مثل في حلقة Foreach). لذلك في حين أنهم لا ينفذون نفس الواجهات التي هم أحيانا تتصرف نفسه.

سيكون الحل المثالي ل PHP لدعم توقيعات الوظائف المتعددة:

function useArray(array $array) { }
function useArray(ArrayObject $array) { }

ولكن حتى نحصل على ذلك (إذا حصلنا على ذلك)، فستضطر فقط إلى التحقق من أنواع متغيرة خارج تعريف الوظيفة:

function useArray($array) {
 if (is_array($array) || $array instanceof ArrayObject) {
   // Do some stuff
 } else {
   throw new Exception('I require an array or an array-like structure!');
 }
}

أو محاولة القيام به arrayTypee الاشياء مع $array حجة وتعامل مع أي تحذيرات / أخطاء ذلك useArray قد تولد.

نصائح أخرى

توضح تلميح النوع الخاص بك من النوع "صفيف" ولكنك تمر في "Arrayobj"

function useArray(array $array)
...
useArray(new ArrayObj

لذلك نعم سوف يشكو.

هل أنت مرتبك في منطقتي، أو هل من المنطقي أنه إذا كان كائن ينفذ نفس الواجهة كصفيف، فينبغي أن تكون قادرا على استخدامها في كل نفس الأماكن؟

إذا كان الكائن ينفذ نفس الواجهة كطبقة أخرى، فسيكون يمكنك استخدامها بالتبادل، لكنها لا تزال صالحة للمترجم للشكوى بالشكوى من تلميح الكتابة، نظرا لها من نفس النوع.

فقط لأن كائنين ينفذان نفس الواجهة لا يعني أنهم من نفس النوع.

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