typehinting: метод должен принимать любой $ arg, являющийся объектом

У меня есть класс «Коллекция», который имеет метод добавления. Метод add должен принимать только объекты. Итак, это желаемое поведение:

$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, можно ввести методы typehint, предварительно используя $arg с именем класса. Поскольку все классы PHP являются stdClass элементами 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 

Кто-нибудь знает, как ввести подсказку для общего объекта?

Solutions Collecting From Web of "typehinting: метод должен принимать любой $ arg, являющийся объектом"

В отличие от класса Object Java, 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 ), а приведение типов к object приводит к object stdClass :

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

Я предполагаю, что в качестве обходного пути вы можете сказать, что метод генерирует исключение или умирает с фатальной ошибкой, если is_object($obj) возвращает false.

Ну, дело в том, что PHP по-прежнему является динамическим языком, а типы подсказок – вот что: подсказки. Я думаю, вам придется вернуться к старому is_object или подобным методам и выбросить пользовательское исключение.

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