SPL مقابل Array: متى يجب أن نستخدم SPL ومتى يجب أن نستخدم Array في PHP؟

StackOverflow https://stackoverflow.com/questions/3166405

  •  02-10-2019
  •  | 
  •  

سؤال

في Java و C ++ عندما لا نعرف الحجم - لا يتم استخدام Array كما هو الحال في PHP ، بدلاً من ذلك باستخدام LinkedList وما إلى ذلك.

في PHP موجود SPL ، ولكن في معظم الأحيان يستخدم المبرمجون الصفيف ، لماذا (لأن الناس لا يعرفون عن SPL)؟

عندما يجب أن نستخدم الصفيف في PHP وعندما يكون الفرق في هذه الحالة بين PHP و Java/C ++؟

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

المحلول

يجب أن يقوم كل طلب PHP بتهيئة جميع المتغيرات وبعد الطلب يتم تحريرها. بسبب ذلك لا يأتي في كثير من الأحيان المواقف التي تكون فيها هياكل البيانات الخاصة (مثل Maxheap أو LinkedList أو قائمة الانتظار) أكثر كفاءة من الصفيف. أيضا المصفوفات أبسط بكثير لفهم واستخدام المبتدئين.

الفرق من C ++ في PHP هو أن طول المصفوفات ديناميكي. يمكنك إضافة عناصر وقتما تشاء.

$arr=array();
$arr[]=5; //add integer to array
echo count($arr); //1
$arr[]=7;
echo count($arr); //2

يمكنك إنشاء صفيف وإضافة مجموعة أخرى بشكل ديناميكي

$arr[]=array();
$arr[2][]=5;
echo count($arr); //3
echo count($arr[2]); //1

سيؤدي ذلك إلى إنشاء مجموعة جديدة ، إضافة عنصر مع القيمة 5 وإضافته كعنصر إلى صفيف $ arr.

$arr[][]=5;

في صفائف PHP عبارة

$arr['somekey']='somevalue';

إذا كان عنصر الصفيف صحيحًا ، فإن كل عنصر يتطلب بنية قيمة (ZVAL) التي تأخذ 16 بايت. يتطلب أيضًا دلو التجزئة - الذي يستغرق 36 بايت. وهذا يعطي 52 بايت لكل قيمة. تأخذ رؤوس تخصيص الذاكرة 8 بايت أخرى*2 - والتي تعطي 68 بايت.

حول المصفوفات في PHP: http://oreilly.com/catalog/progphp/chapter/ch05.html

نصائح أخرى

أنت تطلب منا مقارنة اثنين على نحو كبير أشياء مختلفة ، تقريبا التشابه الوحيد هو أنهما (المصفوفات و SPL) المتاحة في PHP.

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

يبدو أنك أيضًا مرتبك ، أو غير واضح ، حول ماهية SPL ؛ بالتأكيد ليس تقتصر على الأدوات المستخدمة للتكرار على مجموعات من الأشياء. هل تقصد أن تسأل عن أجزاء محددة من المكتبة ، أم أنك ربما غير واضح فقط ما هو متاح فيه؟

استخدم المصفوفات القياسية ، فهو أسرع من ArrayObject.

استخدم ArrayObject فقط لتنفيذ المصفوفات المحددة الخاصة بك مع طرقك المخصصة.

ليس من الضروري وجود ارتباك ، لأنه يمكن للناس أن يقرروا استخدام "splstack" بدلاً من صفيف الفانيليا المرتبط بوظائف Array_push/pop. أو استخدم المصفوفات بطريقة كلاسيكية ،

ثم هناك spldoublylinkedlist ، splqueue ، splheap. بالإضافة إلى ArrayObject.

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

SPL بشكل عام هو مبدئي لتقليد الفصول المعيارية و "خارج الجرف" و API ، مثل وجود C ++ و Java.

IMHO جاء بعد فوات الأوان.

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