У меня есть класс «Коллекция», который имеет метод добавления. Метод 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
Кто-нибудь знает, как ввести подсказку для общего объекта?
В отличие от класса 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 } }