php实现hack中的Shape特性
用php进行静态类型编程,估计是我的一个心结。
依次有几篇文章都记录了我的一些探索:
- 通过指定函数/方法形参类型提高PHP代码可靠性 http://www.cnblogs.com/x3d/p/4285787.html
- 用Yii框架中的collections体验PHP类型化编程 http://www.cnblogs.com/x3d/p/php-typed-programming.html
从PHP 7 开始,PHP支持函数和方法的参数及返回值的标量类型标注,逐渐走出了这一步。
但数据传递的过程中,基础的标量类型很多时候是不够用的。比如参数太多的时候,一般用数组或对象的方式传递,二者中用得最多是数组 - 万能的数组,但数组的结构不明确,在数据传递的过程中,对于DTO(Data Transfer Object,数据传输对象)相应数据结构的理解和验证,往往需要额外花费不少时间和精力。在我看来,Hack 语言的Shape类型很好的解决了这个问题。
hack中Shape的用法如下:
type customer = shape('id' => int, 'name' => string);
function create_user(int $id, string $name): customer {
return shape('id' => $id, 'name' => $name);
}
function ts_shape(): void {
$c = create_user(0, "James");
var_dump($c['id']);
var_dump($c['name']);
}
ts_shape();
Output
int(0)
string(5) "James"
今天动手实现类似hack中的Shape定义,hack中shape本质上是一个数组。
Shapes 是一种特殊的别名类型,代表结构固化的数组 - 固定的键名和类型。定义的Shape可用于类型标注场合。
借助于php的gettype函数,实现类似强类型的概念,不做类型casting。
支持php的基本类型:int、bool、float、string,及array、object、null。
基本用法:
class Customer extends Shape
{
public function __construct(array $data) {
parent::__construct(
['id' => self::int, 'name' => self::string, 'categories' => self::array],
$data
);
}
}
//数据访问与数组一样,只是一言不合就会抛异常,确保在开发阶段,做好数据类型分析和转换
$customer = new Customer(['id' => 102, 'name' => 'jimmy', 'categories' => [10, 21, 22]]);//如果categories写成categories2,meta中定义的categories就会被填充一个对应的默认值。
$customer['id'] = 103; //如果传'103'就会抛异常
var_dump($customer['id']);
var_dump($customer['categories']);
echo count($customer);
var_dump($customer->toArray());//PHP的array强转还不支持魔术方法定制toArray行为,只能由用户自行调用了
完整代码的查看地址:https://github.com/web3d/lang/blob/master/src/AppserverIo/Lang/Shape.php
php实现hack中的Shape特性的更多相关文章
- Java语言中的面向对象特性总结
Java语言中的面向对象特性 (总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知 ...
- ASP.NET 5与MVC 6中的新特性
差点忘了提一句,MVC 6中默认的渲染引擎Razor也将得到更新,以支持C# 6中的新语法.而Razor中的新特性还不只这一点. 在某些情况下,直接在Web页面中嵌入某些JSON数据的方式可能比向服务 ...
- PHP 5.4中的traits特性
Trait 是 PHP5. 中的新特性,是 PHP 多重继承的一种解决方案.例如,需要同时继承两个 Abstract Class, 这将会是件很麻烦的事情,Trait 就是为了解决这个问题. 简单使用 ...
- ASP.NET MVC4中的bundles特性引发服务器拒绝访问(403错误)
在ASP.NET MVC4中微软引入了bundles特性,这个特性可以将服务器端的多个Javascript或多个css文件捆绑在一起作为一个单一的URL地址供客户端浏览器调用,从而减少了页面上Http ...
- 关于C# 中的Attribute 特性
关于C# 中的Attribute 特性 作者: 钢钢 来源: 博客园 发布时间: 2011-01-09 23:30 阅读: 13921 次 推荐: 12 原文链接 [收藏] 摘要:纠结地说 ...
- 专家解读Linux操作系统内核中的GCC特性
专家解读Linux操作系统内核中的GCC特性 Linux内核使用GNU Compiler Collection (GCC)套件的几个特殊功能.这些功能包括提供快捷方式和简化以及向编译器提供优化提示 ...
- OC中的一个特性:延展
OC中的一个特性:延展其实说白了,延展就是弥补C语言中的前向申明,我们知道,在C语言中,如果你想调用一个函数的话,那么在此之前必须要声明一个这个函数,就是有前置性.OC中为了弥补C语言中的这个问题,就 ...
- Webpack 3 中的新特性
本文简短地分享下最新发布的 Webpack 3 中的新特性,供大家参考. 1. Webpack 3 的新特性 6 月 20 日,Webpack 发布了最新的 3.0 版本,并在 Medium 发布了公 ...
- Java中的继承性特性
继承性是java中的第二特性之一.而继承性最为关键的地方为:代码重用性的问题,利用继承性可以从已有的类中继续派生出新的子类,也可以利用子类扩展出更多的操作功能. 继承性的实现代码为:class 子类 ...
随机推荐
- 《R in Action》读书笔记(2)
MindMapper 原文件
- 利用C#自带组件强壮程序日志
在项目正式上线后,如果出现错误,异常,崩溃等情况 我们往往第一想到的事就是查看日志 所以日志对于一个系统的维护是非常重要的 声明 正文中的代码只是一个栗子,一个非常简单的栗子,只是说明这个框架是怎么工 ...
- JavaScript算法(冒泡排序、选择排序与插入排序)
冒泡排序.选择排序与插入排序复杂度都是二次方级别的,放在一起说吧. 介绍一些学习这三个排序方法的比较好的资料.冒泡排序看<学习JavaScript数据结构与算法>介绍的冒泡排序,选择排序看 ...
- 史上最全的 Redux 源码分析
前言 用 React + Redux 已经一段时间了,记得刚开始用Redux 的时候感觉非常绕,总搞不起里面的关系,如果大家用一段时间Redux又看了它的源码话,对你的理解会有很大的帮助.看完后,在回 ...
- 用SQL语句创建四个表并完成相关题目-10月18日更新
1. 查询Student表中的所有记录的Sname.Ssex和Class列. 2. 查询教师所有的单位即不重复的Depart列. 3. 查询Student表的所有记录. 4. 查询Score表中成绩在 ...
- Excel 导入到Datatable 中,再使用常规方法写入数据库
首先呢?要看你的电脑的office版本,我的是office 2013 .为了使用oledb程序,需要安装一个引擎.名字为AccessDatabaseEngine.exe.这里不过多介绍了哦.它的数据库 ...
- JS原生第五篇 (帅哥)
1.1 节点 1. 节点 网页是有很多的节点组成的 . 元素节点 指的是 : 标签 li span 文本节点 属性节点 父子兄弟 父 parent ...
- 服务器.htaccess 详解以及 .htaccess 参数说明(转载)
htaccess文件(或者”分布式配置文件”)提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录.作为用户,所能使用的命令受到限 ...
- Inno Steup 打包加入文件夹
在[Files]段下,添加下面代码Source: "执行文件.exe"; DestDir: "{app}"; Flags: igNoreversionSourc ...
- socket编程
一.socket地址的数据类型及相关函数 socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4.IPv6.UNIX Domain Socket.然而各种网络协议的地址格式并 ...