typehinting: метод должен принимать любой аргумент $ arg, являющийся объектом - PullRequest
3 голосов
/ 18 ноября 2010

У меня есть класс 'Collection', в котором есть метод add. Метод 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, методы подсказок можно набрать, предварительно указав $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

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

Ответы [ 4 ]

5 голосов
/ 18 ноября 2010

В отличие от 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 для этой цели.

4 голосов
/ 18 ноября 2010

В 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 (например, * 1007).*) и приведение типа к object приводит к объекту stdClass:

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

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

0 голосов
/ 29 мая 2018

В PHP 7.2 теперь есть подсказка типа object. Вы можете просто сделать

class Collection {
  public function add(object $obj){
    //do stuff
  }
} 
0 голосов
/ 18 ноября 2010

Дело в том, что PHP по-прежнему динамический язык, а подсказки типов - это только подсказки.Я думаю, вам придется вернуться к старому is_object или аналогичным методам и выдать пользовательское исключение.

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