Интерфейс PHP: укажите список параметров, но не тип параметра - PullRequest
3 голосов
/ 21 апреля 2011

Я создал интерфейс под названием iMapper. И я хочу, чтобы все мои файлы мапперов реализовывали этот интерфейс.

Но каждый преобразователь будет указывать тип параметра.

Пример:

interface iMapper
{
    public function insert($obj);
    public function update($obj);
    public function delete($obj);
}
class CarMapper implements iMapper
{
    public function insert(Car $obj){}
    public function update(Car $obj){}
    public function delete(Car $obj){}
}

Этот код генерирует следующую ошибку:

Объявление CarMapper :: insert () должно быть совместимо с iMapper :: insert ()

Является ли способ сделать интерфейс совместимым с CarMapper? (Я не хочу менять картограф.)

Спасибо

Ответы [ 4 ]

2 голосов
/ 29 июня 2013

лучше:

interface iObject {}

class Car implements iObject

interface iMapper
{
    public function insert(iObject $obj);
    public function update(iObject $obj);
    public function delete(iObject $obj);
}
class CarMapper implements iMapper
{
    public function insert(Car $obj){}
    public function update(Car $obj){}
    public function delete(Car $obj){}
}
2 голосов
/ 21 апреля 2011

"Но каждый маппер будет указывать тип параметра."- Я должен сказать, что это не может быть сделано.

Интерфейс должен быть реализован.Что это значит?Все реализующие классы должны иметь возможность использовать методы с не указанным параметром - параметр, который требовался для метода внутри интерфейса.

вызов instanceof внутри тела метода - это своего рода способвне, но это действительно не очень хороший способ.

Читайте о шаблон стратегии , держу пари, это может решить вашу проблему - http://sourcemaking.com/design_patterns/strategy/php

0 голосов
/ 21 апреля 2011

Ваш класс должен реализовать интерфейс. Но это не так, что PHP жалуется.

Вы можете использовать проверку типов в методах.

Взгляните на instanceof .

0 голосов
/ 21 апреля 2011
interface iMapper
{
    public function insert(Car $obj);
    public function update(Car $obj);
    public function delete(Car $obj);
}
class CarMapper implements iMapper
{
    public function insert(Car $obj){}
    public function update(Car $obj){}
    public function delete(Car $obj){}
}

методы интерфейса и класса должны совпадать! Подсказка того же типа должна быть использована.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...