النوع: يجب أن تقبل الطريقة أي $ arg التي هي كائن
-
26-09-2019 - |
سؤال
لدي "مجموعة" الفصل ، والتي لديها طريقة إضافة. يجب أن تقبل طريقة إضافة الكائنات فقط. لذلك هذا هو السلوك المطلوب:
$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
}
}