2013-04-17 94 views
0

我试图实现类似于存储库模式的东西。为此,我有一个所有Repos实现的接口和一个所有模型扩展的模型基类。如何在接口中使用多态性?

我从PHP

Fatal error: Declaration of MVCBP\Repositories\UserRepository::add() must be compatible with MVCBP\Core\RepositoryInterface::add(MVCBP\Core\Model $model) in D:\wamp\www\mvc\MVCBP\Repositories\UserRepository.php on line 9

以下错误消息我想的是,我在仓库类中的方法应根据接口接受模型的实例作为参数。不过,我想在实现中键入提示特定的模型。这在PHP中可行吗?

RepositoryInterface.php

<?php 
    namespace MVCBP\Core; 

    use MVCBP\Core\ModelInterface; 

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

UserRepository.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 
} 

ModelInterface.php

<?php 
namespace MVCBP\Core; 

interface ModelInterface {} 

user.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 
} 
+0

为什么你认为模型是一类? –

回答

0

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

UserRepository.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(); 
} 
+0

我编辑了我的代码来使用接口,但错误仍然存​​在。 –

+0

好的。但你是否改变你的RepositoryInterface在add方法中使用接口?我编辑了我的答案并为RepositoryInterface放置了代码。你能显示你的代码吗? – Soyale