سؤال

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

$x=5;//arbitrary non-object
$obj=new Foo; //arbitrary object

$collection=new Collection;
$collection->add($obj); //should be acceptable arg, no matter the actual class
$collection->add($x); //should throw an error because $x is not an object

وفقا لدليل PHP ، يمكن للمرء أن يكتب الأساليب عن طريق توجيه $arg مع اسم الفصل. نظرًا لأن جميع فصول PHP أطفال stdClass, ، اعتقدت أن توقيع الطريقة سيعمل:

public function add(stdClass $obj);

لكنه فشل مع "الوسيطة يجب أن تكون مثيل stdClass".

إذا قمت بتغيير التوقيع إلى فئة الوالدين المحددة من قبلي ، فهذا يعمل:

class Collection {
  public function add(Base $obj){
    //do stuff
  }
}

$collection->add($foo); //$foo is class Foo which is an extension of Base

هل يعرف أي شخص كيفية كتابة تلميح لكائن عام؟

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

المحلول

على عكس جافا Object الفصل ، php ليس لديه فئة قاعدة للكائنات. الكائنات لا ترث stdClass: إنه تطبيق كائن افتراضي ، وليس فئة أساسية. لذلك ، لسوء الحظ ، لا يمكنك كتابة تلميح لجميع الكائنات في PHP. عليك أن تفعل شيئًا مثل:

class MyClass {
    public function myFunc($object) {
        if (!is_object($object))
             throw new InvalidArgumentException(__CLASS__.'::'.__METHOD__.' expects parameter 1 to be object");
    }
}

لحسن الحظ ، يحدد PHP بالفعل InvalidArgumentException الفصل لهذا الغرض.

نصائح أخرى

لا يوجد فئة الجذر في PHP. الكائنات لا ترث من stdClass:

class Foo {}
var_dump(new Foo instanceof stdClass); // bool(false)
var_dump(get_parent_class(new Foo));   // bool(false)

من الواضح أنه لا توجد طريقة معروفة في PHP لكتابة تلميح ل object بالرغم من object هو نوع البيانات في PHP (مثل array) ، و typecasting object ينتج stdClass هدف:

echo get_class((object) "string"); // stdClass

أعتقد كحل بديل ، يمكنك معرفة الطريقة لرمي استثناء أو الموت بخطأ مميت إذا is_object($obj) يعود خطأ.

حسنًا ، الشيء هو أن PHP لا تزال لغة ديناميكية ، والتلميحات النوع هي فقط: تلميحات. أعتقد أنه سيتعين عليك العودة إلى القديم is_object أو طرق مماثلة ورمي استثناء مخصص.

class Collection {
  public function add(Base $obj){
    if(!is_object($obj))
    throw new Exception("Parameter must be an object");
    // do stuff
  }
}

في PHP 7.2 يوجد الآن object اكتب تلميح. يمكنك ببساطة القيام به

class Collection {
  public function add(object $obj){
    //do stuff
  }
} 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top