0

我正在尝试实现类似于存储库模式的东西。为此,我有一个所有 repos 都实现的接口和一个所有模型都扩展的模型基类。

我从 PHP 收到以下错误消息

致命错误: MVCBP\Repositories\UserRepository::add() 的声明必须与 D:\wamp\www\mvc\MVCBP\Repositories\ 中的 MVCBP\Core\RepositoryInterface::add(MVCBP\Core\Model $model) 兼容第 9 行的 UserRepository.php

我想要的是我在存储库类中的方法应该根据接口接受模型的实例作为参数。但是我想在实现中输入一个特定的模型。这在 PHP 中可行吗?

存储库接口.php

  <?php
  namespace MVCBP\Core;

  use MVCBP\Core\ModelInterface;

  interface RepositoryInterface
  {
    public function add(ModelInterface $model);
  }

用户存储库.php

<?php
namespace MVCBP\Repositories;

use MVCBP\Core\PDOMySQL;
use MVCBP\Core\RepositoryInterface;
use MVCBP\Models\User;

class UserRepository extends PDOMySQL implements RepositoryInterface
{
    public function add(User $user)
    {
        //Omitted
    }

    //Omitted
}

模型接口.php

<?php
namespace MVCBP\Core;

interface ModelInterface {}

用户.php

<?php
namespace MVCBP\Models;

use MVCBP\Core\ModelInterface;
use MVCBP\Core\Validate;
use MVCBP\Repositories\UserRepository;

require_once(__DIR__ . '/../lib/password.php');

class User implements ModelInterface
{
    //Omitted
}
4

1 回答 1

0

你可以这样做。您必须修改 UserRepository 定义。您的add方法只接受MVCBP\Core\Model实例。

用户存储库.php

<?php
namespace MVCBP\Repositories;

use MVCBP\Core\PDOMySQL;
use MVCBP\Core\RepositoryInterface;

//There was another mistake. Your User class is in MVCBP\Models namespace;
//use MVCBP\Core\Models\User; -> wrong one
use MVCBP\Models\User; //correct one
use MVCBP\Core\Model;

class UserRepository extends PDOMySQL implements RepositoryInterface
{
    public function add(Model $user)
    {
        if (!$user instanceof User)
            throw new \Exception('Exception msg', 101); //example exception
        //Omitted
    }

    //Omitted
}

我更喜欢需要一个接口实例,即。

public function add(SomeInterface $user)
{
    if (!$user instanceof User)
       throw new \Exception('Exception msg', 101); //example exception
}

class User implements SomeInterface {
//some code
}

然后 ReposituryInterface.php 看起来像这样:

<?php
namespace MVCBP\Core;

use MVCBP\Core\Model;
use MVCBP\Core\SomeInterface;

interface RepositoryInterface
{
    //We must change method definition so it can take SomeInterface implementation
    public function add(SomeInterface $model);
    public function find($id);
    public function edit(Model $model);
    public function remove($id);
    public function all();
}
于 2013-04-17T20:32:29.203 回答