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

时间:2016-11-18 10:39:23

标签: php class parameters interface extend

如何限制班级method仅限object扩展特定班级的class

代码:

串行器接口

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

有没有办法做到这一点,请帮助我。

感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:1)

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

某些语言支持反转功能:参数的逆变,但没有人承认它们的协方差。

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

答案 1 :(得分:1)

将参数从DATASET ACTIVATE test1. SORT CASES BY ID. DATASET ACTIVATE test2. SORT CASES BY ID. MATCH FILES FILE=test1 /FILE=test2 /BY ID. DATASET NAME Restult. 更改为Serializer interface时,您正在更改serialize Model方法签名。您应该保留Article,如果Model延伸Article,那么您就可以将其传递给该方法。

界面序列化程序

Model

MilestoneListSerializer

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