仅当在 php 中扩展特定 class 时才允许对象作为参数

Allow object as parameter only if extends particular class in php

我如何限制 class method 只接受扩展特定 class 的 classobject

代码:

序列化器接口

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 class

请问有什么办法吗,求助。

感谢任何帮助。谢谢。

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

一些语言支持逆特性:参数的逆变,但是none承认它们的协变。

您可以手动检查类型并抛出异常。实际上这仍然是 LSP 违规,但有时它可能会有用。另一种方法是修改您的体系结构和 classes 层次结构。

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

接口序列化程序

namespace App\API\Serializers;

use Illuminate\Database\Eloquent\Model;

interface Serializer
{
    public function serialize(Model $modelOrItsSubTypes);
}

MilestoneListSerializer

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
}