2016-11-18 6 views
1

Как я могу ограничить класс method только object из class, который расширяет определенный класс?Разрешить объект как параметр, только если расширяет определенный класс в php

Код:

Serializer Интерфейс

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 класс

Есть ли способ сделать это, пожалуйста, помогите мне.

Любая помощь приветствуется. Благодарю.

ответ

1

Вы меняете знак метода Serializer interfaceserialize при изменении параметра от Model до Article. Вы должны сохранить Model, и если Article расширяет Model, вы сможете передать его методу.

Интерфейс Serializer

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

Нет, вы не можете этого сделать. Интерфейс определяет контракт: все реализации метода должны принимать любой экземпляр класса Model. Вы нарушаете этот договор, если ограничиваете тип аргумента. Это нарушение Liskov substitution principle.

Некоторые языки поддерживают обратную функцию: контравариантность параметров, но ни одна из них не допускает их ковариации.

Вы можете вручную проверить тип и выбросить исключение. На самом деле это все еще нарушение LSP, но иногда это может быть полезно. Другой способ - пересмотреть вашу архитектуру и иерархию классов.