سؤال

أنا أتعلم PHP5 (آخر مرة راجعت PHP في PHP4 أيام) و أنا سعيد لرؤية أن PHP5 OO أكثر Java-على حد سواء من PHP4 واحد ولكن لا يزال هناك مسألة يجعلني أشعر تماما unconfortable بسبب جافا الخلفية :المصفوفات.

أنا أقرأ "محترفون PHP6" (Wrox) ويظهر مجموعتها الخاصة التنفيذ.لقد وجدت أخرى clases مثل واحد في http://aheimlich.dreamhosters.com/generic-collections/Collection.phps على أساس SPL.لقد وجدت أيضا أن هناك نوعا من جمع في SPL (ArrayObject)

ومع ذلك, أنا مندهش لأنني لا أنظر إلى الناس باستخدام مجموعات في PHP, يبدو أنهم يفضلون المصفوفات.

لذلك, أليس كذلك فكرة جيدة باستخدام مجموعات في PHP مثل الناس استخدام ArrayList بدلا من المصفوفات الأساسية في جافا ؟ بعد كل شيء, php المصفوفات ليست حقا مثل جافا المصفوفات.

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

المحلول

المجموعات في جافا منطقية للغاية لأنها لغة مكتوبة بقوة. من المنطقي أن يكون لديك مجموعة من "السيارات" وآخر من "الدراجات النارية".

ومع ذلك ، في PHP ، بسبب الطبيعة المكتوبة ديناميكيا ، من الشائع التضحية بشكليات المجموعات. المصفوفات كافية لاستخدامها كحاويات عامة لأنواع الكائنات المختلفة (السيارات ، والدراجات النارية ، وما إلى ذلك). أيضًا ، تأتي الفائدة المضافة من حقيقة أنه يمكن تحور المصفوفات بسهولة بالغة (والتي قد تكون في بعض الأحيان عيبًا كبيرًا عندما يكون التحقق من الخطأ المناسب غائبًا).

لقد جئت من خلفية Java ، ووجدت أن استخدام نمط تصميم المجموعات في PHP لا يشتري الكثير في طريق المزايا (لا يوجد متعدد الخيوط ، ولا تحسين لتخصيص الذاكرة ، ولا تكرار ، إلخ).

إذا كنت تبحث عن أي من هذه المزايا ، فمن الأفضل أن تقوم ببناء فئة غلاف حول الصفيف ، وتنفيذ كل ميزة (متكررة ، إلخ).

نصائح أخرى

أنا جدا pro جمع الكائنات في PHP, أنها يمكن أن تستخدم لإضافة نوع السلامة ، impliment سهلة الاستخدام البحث, نوع التلاعب وظيفة تمثل الصحيح OO النهج بدلا من استخدام المصفوفات و العديد من مفيدة ولكن procedual الوظائف التي تعمل عليها في اختلاف أنماط في جميع أنحاء المصدر.

لدينا مختلف المجموعات التي نستخدمها لأغراض مختلفة كل شيء بدقة ورثت تعزيز سلامة نوع ، بما يتفق معايير الترميز وعلى مستوى عال من إعادة استخدام التعليمات البرمجية.

ولكن ultimatley ، فهي كل مجموعة داخليا!

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

تعد صفائف PHP مرتبطة ... إنها أقوى بكثير من صفائف Java ، وتتضمن الكثير من وظائف القائمة <> والخريطة <>.

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

أنا أيضا كان مستاء إلى حد ما أن تجد أي نوع جمع دروس في PHP.المصفوفات يكون الزوجان من العيوب الحقيقية في تجربتي.

أولا عدد الوظائف المتاحة إلى التلاعب بها محدودة نوعا ما.على سبيل المثال, أنا بحاجة إلى أن تكون قادرة على تعسفا إدراج وإزالة العناصر من مجموعة في إعطاء مؤشر الموقف.تفعل ذلك مع المدمج في وظائف اللغة على المصفوفات في PHP هو مؤلم في أحسن الأحوال.

الثانية, كنوع من فرع من النقطة الأولى ، كتابة نظيفة قراءة التعليمات البرمجية التي تعالج المصفوفات في أي مستوى من التعقيد تتجاوز دفعة بسيطة/البوب مكرر الاشياء صعبة في أحسن الأحوال.غالبا ما أجد أن علي أن استخدام مصفوفة مؤشر وتتبع مجموعة أخرى في كثيفة البيانات تطبيقات إنشاء.

أنا أفضل العمل في إطار (خياري الشخصي هو NOLOH).ليست هناك حاجة حقيقية جمع فئة تسمى ArrayList التي لديها وظائف مثل إضافة إدراج ، RemoveAt, RemoveRange و تبديل.أتصور أخرى PHP أطر معالجة هذه المسألة أيضا.

يتم توفير تطبيق رائع للمجموعة في PHP بواسطة Varien Lib ، هذه المكتبة جزء من رمز Magento مع ترخيص OSL. (مزيد من المعلومات حول ترخيص Magento وإعادة استخدام الرمز هنا.

لا يمكن العثور على أي رمز مصدر للمكتبة ، لذا فإن أفضل طريقة لتنزيل Magento ثم البحث في/lib/varien/

yii لديها تنفيذ من java الكامل مثل مجموعة المجموعات

http://www.yiiframework.com/doc/api/1.1/clist

أستخدم أحيانًا هذا التنفيذ البسيط حقًا لإعطائي مجموعة تقريبية وجاهزة.

عادةً ما يكون الشرط الرئيسي للمجموعة هو تطبيق مجموعة من نوع واحد من الكائنات ، عليك فقط إعداد فئة أساسية مع مُنشئ لتنفيذها.

class SomeObjectCollection {

   /**
    * @var SomeObject[]
    */
   private $collection = array();

   /** 
    * @param SomeObject $object1
    * @param SomeObject $_ [optional]
    */
   function __construct(SomeObject $object1 = null, SomeObject $_ = null) 
   {
       foreach (func_get_args() as $index => $arg) {
           if(! $arg instanceof SomeObject) throw new \RuntimeException('All arguments must be of type SomeObject');
           $this->collection[] = $arg;
       }
   }

   /**
    * @return SomeObject[]
    */
   public function getAll()
   {
       return $this->collection;
   }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top