仅当在 php 中扩展特定 class 时才允许对象作为参数
Allow object as parameter only if extends particular class in php
我如何限制 class method
只接受扩展特定 class 的 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
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
}
我如何限制 class method
只接受扩展特定 class 的 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
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
}