php7参数类型限定,PHP⽤Enum限定参数类型
痛点
PHP 是⼀门若类型语⾔,这是⼤家都知道的,弱类型让我们在编写代码时很舒服,但是维护它却变得不那么舒服,⼀个⼩型的 PHP 项⽬只有有限的⼏个程序员去维护的话,其实这个问题并不明显,也不会成为困难,但是当项⽬变⼤,协作的⼈数变多的时候这就是⼀个需要去正式的问题。
PHP 7 和 PHP < 7
在PHP 7 之前我们对参数没有太多的限定。
function test(array $arr, App\Model\User $user)
{
}
复制代码
PHP 7 之前我们只能对形参做这样的限制,⽆法限定基础类型。⽽ PHP7 之后我们可以对参数进⾏基础
类型限制了。
function test(array $arr, App\Model\User $user, string $string, int $int, bool $bool, float $float) : int
{
}
复制代码
可以对形参进⾏基础类型进⾏限制,并且⽅法和函数的返回值也可以提前告知。
这样的好处就是多少协作时,不需要他⼈调⽤⼀个他不熟悉或者从来没有⽤过的⽅法或者函数的时候去到定义的⼈进⾏沟通,代码已经告诉他需要传递什么样的参数给函数,减少了多余的协作沟通成本。
当然⽆论是 PHP 7 还是 php 5.* 其实都有⼀个库可以做到这些功能,那就是 SPL Type ,但是这个库虽然以 SPL 命名但并不和 SPL ⼀样默认集成 PHP ⾥,它不是 PHP 的内核组件⼀部份,因此需要独⽴去安装。
当你使⽤ PHP 5.* ⽽不是 PHP 7 的时候,想要达到参数限定可以去安装它。若你使⽤ PHP 7 这个库的功能其实已经没什么⽤了,唯⼀还⽤的就是 SplEnum 这个类。
SplEnum 这个类实现了其他编程语⾔的枚举功能,那么枚举有什么⽤呢,我们可以假设这样⼀个场景,我们有⼀个很⼤的项⽬,有百⼈的开发团队或者更多,作为最初项⽬的⽂章模块的设计开发者你定义了⼀个创建⽂章的⽅法,这个⽅法需要两个参数。⼀个参数是外部表单提交或者其他途径获得的数据,⼀个是将要创建的⽂章的类型。
你可以通过⽂档、数据库注释、⽅法注释等⼀系列⽅法告诉调⽤者该如何传参,但是如果有的⼈这些都没读或者懒得去看那么你该如何限定他们⽤不正确的⽅法调⽤这个⽅法呢?
似乎好像没有办法了。
---- # 1.定义 Enum 部分
namespace Type;
require './vendor/autoload.php';
class ArticleTypeEnum extends \MyCLabs\Enum\Enum
{
php8兼容php7吗const GENERAL = 1;
const JOB = 2;
const DISCUSS = 3;
const SHARE = 4;
const COURSE = 5;
const LIFE = 6;
const SPECIAL_COLUMN = 7;
}
---- # 2.定义⽅法部分
function createArticle(array $data, ArticleTypeEnum $articleTypeEnum){
/
/ 创建对应的类型的⽂章
}
---- # 3.调⽤部分
try{
testTypeEnum($data, new ArticleTypeEnum(ArticleTypeEnum::COURSE));
}catch (\Exception $exception){
echo $exception->getMessage();
}
复制代码
我在第⼀部分定义了枚举类,集成枚举基类 \MyCLabs\Enum\Enum ,在类中定义了⼏个⽂字类型常量。
第⼆部分是⼀个伪代码的⼀个创建⽂章的⽅法。
第三部分是调⽤部分,可以看见因为第⼆个参数已经被限定为枚举类,所以我必须传递⼀个枚举类型实例给创建⽅法,如果传递的不是枚举类的实例,那么程序就会抛出异常。
很简单的我就可以将外部调⽤时要创建的⽂章类型限定在规定范围内⽽不会出现未知的参数,或者⼀些脏数据进⼊到数据库中去,同时代码层⾯就告诉调⽤者应该如何去传递参数。
在传递第⼆个参数的时候你可能觉得⿇烦,其实这个库作者已经想到了。
---- # 3.调⽤部分
try{
testTypeEnum($data, ArticleTypeEnum::GENERAL());
}catch (\Exception $exception){
echo $exception->getMessage();
}
复制代码
这样就可以了,这是利⽤ PHP 的魔术⽅法 __callStatic() 实现的调⽤相应常量。
这样我们就可以在代码层⾯控制参数类型以提⾼我们的程序可维护性了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论