Как убедиться, что метод объекта возвращает ожидаемый объект? - PullRequest
2 голосов
/ 16 мая 2011

Я пытаюсь использовать DI, чтобы поместить один объект в другой.Это легко, используя интерфейс и подсказку типа.

Проблема в том, что объект, который я внедряю, возвращает другой объект с одним из ожидаемых методов, и этот объект не может быть подсказкой типа.Проблема выглядит примерно так:

class Db implements DbInterface {
    public function query($query) {
        return new Result($query);
    }
}

interface DbInterface {
    public function query($query);
}

class Result {
    public function getRow() {
        // get row here
    }
}

class SomeClass {
    protected $data;

    // injection is here
    public function __construct(DbInterface $db) {
        $result = $db->query($some_query);
        $this->data = $result->getRow();
    }
}

Я могу убедиться, что получил правильный объект DbInterface, но нет ли способа убедиться, что метод run () этого объекта возвращает объект правильного типа?Я посмотрел и не могу найти способ напечатать подсказку о возвращаемом результате функции.

Это может привести к проблемам позже в более сложном коде.Если кто-то напишет новую реализацию DbInterface, как он узнает, что run должен возвращать объект определенного типа, если нет способа его принудительно применить?

Ответы [ 2 ]

0 голосов
/ 16 мая 2011

подвергнуть все это испытанию.если в одном из ваших тестов указано, что тип возвращаемого значения должен быть x, то, надеюсь, тест завершится неудачно при использовании новой реализации.кроме провала теста, мы надеемся, что разработчики будут использовать тесты в качестве документации для разработчиков и посмотреть, каково это предполагаемое поведение.

0 голосов
/ 16 мая 2011

Нет, на уровне языка невозможно ограничить возвращаемое значение функции.Допускаются только подсказки типа аргументов функции - http://www.php.net/manual/en/language.oop5.typehinting.php

Что вы можете сделать, так это убедиться, что неверный тип возвращаемого значения обнаружен заранее.Скажем, в коде запуска контейнера IOC.Вы создаете экземпляр DbInterface и проверяете тип возврата run().Если это не так, выведите исключение.

...