سؤال

PHP، كما نعلم جميعا، يتم كتابتها بشكل فضفاض للغاية.لا تتطلب منك اللغة تحديد أي نوع لمعلمات الوظيفة أو متغيرات الفئة.يمكن أن تكون هذه ميزة قوية.

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

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

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

وأيضًا كيف يمكنك فعل كل هذا أثناء حساب الميراث في Php؟يعتبر:

<?php
class InterfaceClass
{
#...
}

class UsesInterfaceClass
{
   function SetObject(&$obj) 
   {
       // What do I put here to make sure that $obj either
       // is of type InterfaceObject or inherits from it       

   }
}
?>

ثم يقوم مستخدم هذا الكود بتنفيذ الواجهة بفئته المحددة:

<?php

class ConcreteClass extends InterfaceClass
{
}



?>

أريد أن تكون مثيلات ConcreteClass، وجميع الكائنات المستقبلية غير المعروفة المعرفة من قبل المستخدم، مقبولة أيضًا لـ SetObject.كيف تجعل هذا مسموحًا به في التحقق من النوع الصحيح؟

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

المحلول

في الواقع، بالنسبة للفصول الدراسية، يمكنك تقديم تلميحات للنوع في PHP (5+).

 <?php
 class UsesBaseClass
 {
      function SetObject(InterfaceObject $obj) 
      {
      }
 }
 ?>

سيعمل هذا أيضًا بشكل صحيح مع الميراث كما تتوقع.

جانبًا، لا تضع كلمة "كائن" في أسماء صفك...

نصائح أخرى

كإضافة إلى استجابة Eran Galperin، يمكنك أيضًا استخدام تلميح النوع لإجبار المعلمات على أن تكون صفائف - وليس مجرد كائنات من فئة معينة.

<?php
class MyCoolClass {
   public function passMeAnArray(array $array = array()) {
      // do something with the array  
   }  
 }  
 ?>

كما ترون يمكنك كتابة تلميح إلى أن ::passMeAnArray() تتوقع الطريقة array بالإضافة إلى توفير قيمة افتراضية في حالة استدعاء الطريقة بدون أي معلمات.

بالنسبة للأنواع البدائية، يمكنك أيضًا استخدام الدالات is_* :

public function Add($a, $b)
{
  if (!is_int($a) || !is_int($b))
    throw new InvalidArgumentException();
  return $a + $b;
}

كما ترى، هناك إجابات متعددة حول نوع التلميح. هذا هو الحل التقني.ولكن يجب عليك أيضًا التأكد من أن التصميم بأكمله معقول وبديهي.وهذا سيجعل مشاكل الكتابة والأخطاء أكثر ندرة.

تذكر أنه حتى هذه الأنواع من الفشل سيتم طرحها في وقت التشغيل.تأكد من أن لديك اختبارات للكود.

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

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

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

ولكن قد تكون وجهة نظر Pythonista ...

@عيران جالبيرينتعد استجابة 's هي الطريقة المفضلة للتأكد من أن الكائن الذي تستخدمه من النوع الصحيح.

ومن الجدير بالذكر أيضًا حالة عامل التشغيل - يكون مفيدًا عندما تريد التحقق من أن الكائن هو واحد من أنواع متعددة.

يمكنك ضبط إعداد error_reporting ini في ملف php.ini الخاص بك أو استخدام وظيفة error_reporting لتعيينه في وقت التشغيل

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