【问题标题】:Allow object as parameter only if extends particular class in php [duplicate]仅当扩展 php 中的特定类时才允许对象作为参数 [重复]
【发布时间】:2017-04-02 04:20:47
【问题描述】:

如何限制类 method 仅采用扩展特定类的 class 中的 object

代码:

序列化接口

namespace App\API\Serializers;

use Illuminate\Database\Eloquent\Model;

interface Serializer
{
    public function serialize(Model $model);
}
namespace App\API\Serializers;

use App\API\Serializers\Serializer;
use App\Models\Article;

class MilestoneListSerializer implements Serializer
{
    public function serialize(Article $article)
    {

    }
}

我想将Article 作为参数传递,它正在扩展Illuminate\Database\Eloquent\Model

有什么办法吗,请帮帮我。

感谢任何帮助。谢谢。

【问题讨论】:

    标签: php class parameters interface extend


    【解决方案1】:

    不,你不能这样做。接口定义了契约:方法的所有实现都应该接受模型类的任何实例。如果限制参数类型,您将违反此合同。这违反了Liskov substitution principle

    一些语言支持逆向特征:参数逆变,但没有一个承认它们的协方差。

    您可以手动检查类型并引发异常。事实上,这仍然是违反 LSP 的,但有时它可能有用。另一种方法是修改您的架构和类层次结构。

    【讨论】:

      【解决方案2】:

      当您将参数从 Model 更改为 Article 时,您正在更改 Serializer interface serialize 方法签名。您应该保留Model,如果Article 扩展Model,那么您将能够将其传递给方法。

      接口序列化器

      namespace App\API\Serializers;
      
      use Illuminate\Database\Eloquent\Model;
      
      interface Serializer
      {
          public function serialize(Model $modelOrItsSubTypes);
      }
      

      里程碑列表序列化器

      namespace App\API\Serializers;
      
      use App\API\Serializers\Serializer;
      use App\Models\Article;
      
      class MilestoneListSerializer implements Serializer
      {
          public function serialize(Model $modelOrItsSubTypes)
          {
              // ... Use Model methods here
          }
      }
      

      文章

      namespace App\Somenamespace;
      
      use Illuminate\Database\Eloquent\Model;
      
      class Article extends Model
      {
          //.. Overrides here
      }
      

      【讨论】:

        猜你喜欢
        • 2014-06-18
        • 2013-10-24
        • 2017-07-09
        • 2011-04-21
        • 1970-01-01
        • 2013-06-23
        • 1970-01-01
        • 1970-01-01
        • 2013-03-28
        相关资源
        最近更新 更多