php - php定义的json结构类型提示
问题描述
我想在 php 中输入提示这个 json 结构:
{
"settings": {
"signup": {
"logging": true,
"forcePrompt": false,
"completedSteps": [
1,
2,
3
]
},
"trash": {
"retentionDays": 30,
"enabled": true
}
}
}
有什么方法可以用一个“设置”类来做到这一点,而不必为每个嵌套属性(注册、垃圾)定义单独的类。
在打字稿中,我可以这样定义:
{
settings: {
signup: {
logging: boolean,
forcePrompt: boolean,
completedSteps: number[]
},
trash: {
retentionDays: number,
enabled: boolean
}
}
}
解决方案
不,但是您可以自己滚动并非常接近。例如,我有一个作为设置存储并为此扩展ArrayObject
的类,所以它是非常标准的非异国情调的东西。
如果您只检查叶属性就可以了(例如“属性 X 是布尔值吗?”而不是“属性 X 作为属性 Y 的子属性是布尔值”?),您可以像这样进行基本类型检查(我'已经稍微缩短了示例代码,你会在这里找到完整的代码):
// Your data
$data = '{
"settings": {
"signup": {
"logging": true,
"forcePrompt": false,
"completedSteps": [
1,
2,
3
]
},
"trash": {
"retentionDays": 30,
"enabled": true
}
}
}
';
// We'll use this for type hinting
$defaults = '{
"settings": {
"signup": {
"logging": true,
"forcePrompt": false,
"completedSteps": []
},
"trash": {
"retentionDays": 1,
"enabled": true
}
}
}
';
/**
* Basic collection object.
*
* Usage:
* ------
* $collection->acme_social->twitter->client_id
*/
class Collection extends \ArrayObject {
/**
* Initialize and turn all levels of the given
* array into a collection object.
*
* @param Array $data
*/
public function __construct(array $data, array $defaults = []) {
parent::__construct($data, \ArrayObject::ARRAY_AS_PROPS);
// Turn all arrays into Collections
$iterator = new \RecursiveIteratorIterator(
new \RecursiveArrayIterator($this), \RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $key => $value) {
// Evaluate types
array_walk_recursive($defaults, function ($v, $k) use ($key, $value) {
if ($key == $k) {
$expected = gettype($v);
$given = gettype($value);
if ($expected != $given) {
throw new InvalidArgumentException("{$k} needs to be of type {$expected}, {$given} given.");
}
}
});
if (is_array($value)) {
$iterator->getInnerIterator()->offsetSet($key, new static($value));
}
}
}
}
try {
$collection = new Collection(json_decode($data, true), json_decode($defaults, true));
}
catch(Exception $e) {
var_dump($e->getMessage());
}
推荐阅读
- azure-active-directory - 使用 MSAL 实现 AAD 身份验证时,我将使用 navigateToLoginRequestUrl 选项做什么?
- php - 我正在寻找一种从电影数据库中获取数据的方法
- html - Html:尝试将导航块与 svg 图像并列
- gremlin - Gremlin 在遍历路径时根据传入边缘过滤掉去边缘
- node.js - 如何使用 MySQL db 部署 Strapi?
- java - 将 .txt 文件传输到数组时出错(线程异常)
- excel - VBA 输入框没有正确显示字符串?
- python - 两个相同的链接在从中解析用户名时表现不同
- javascript - 当光标离开子元素悬停父元素时如何防止父元素的鼠标悬停?
- javascript - 在 onClick 函数中调度三个动作然后使用该响应映射数据是否同步