基于实现的接口强制定义函数

时间:2013-08-16 15:46:48

标签: php oop laravel eloquent

我正在使用一些数据库多态来通过eloquent / laravel连接表关系。 (注意下面的例子已经简化了,这两个对象已经扩展了一个基类,所以我不能扩展另一个实现我想要的行为,它们扩展的基类与其他与我正在尝试的无关的类共享在下面做)

class Pageable{
  public function table() {
    return $this->morphTo();
  }
}

class User {
  public function pageable() {
    return $this->morphOne('Pageable', 'table');
  }

  public function returnUrl() {
    return "http://...";
  }
}

class Company {
  public function pageable() {
    return $this->morphOne('Pageable', 'table');
  }

  public function returnUrl() {
    return "http://...";
  }  
}

我遍历pageable,然后可以检索User或Company对象,但是我需要一个泛型函数,例如returnUrl,我可以调用任何可能多态化为该关系的对象。有没有办法在上面清除它或至少创建一些故障安全检查,以确保在类中实现所有必需的方法,例如,如果他们实现PeageableInterface。例如,我可以在界面中设置需要这个returnUrl函数吗?

我如何创建这样的界面?

2 个答案:

答案 0 :(得分:3)

尝试使用特征。

在课堂上,只需执行以下操作:

use TraitWithReturnUrl;

...然后

trait TraitWithReturnUrl {
    function returnUrl() {
        // do stuff like it's on the object itself
    }
}

宾果! :)

同时查看我的Fatty库,这对于这样的东西也很有用:https://github.com/kirkbushell/fatty

在这两种情况下,您都需要PHP 5.4 +。

答案 1 :(得分:1)

Traits可能是一个更好的方法(在PHP 5.5中是新的),但你可以直接使用接口,我认为在你的情况下可能看起来像这样:

1)创建一个界面:

interface Pageable {

    public function pageable();

}

2)实施界面

class User extends Model implements UserInterface, RemindableInterface, Pageable {

    ... other methods ...

    public function pageable() {
        return $this->morphOne('Pageable', 'table');
    }

}

但是,如果方法pageable()在每个实现中都是完全相同的代码,您可能需要创建一个定义它的抽象类,然后将其用作模型的基类:

use Illuminate\Database\Eloquent\Model as BaseModel;

abstract class NewModel extends BaseModel implements Pageable {

    public function pageable() {
        return $this->morphOne('Pageable', 'table');
    }

}

然后你的课程:

class User extends NewModel implements UserInterface, RemindableInterface {

    // You now have the pageable() method available

}

希望能帮助你指明正确的方向。