折言支持一种特殊的函数调用语法,允许将参数放在函数名后面的花括号或者方括号中,这种语法类似于某些现代编程语言中的块参数语法。
function div($obj) {
return "<div>" + $obj->body + "</div>";
}
// 传统函数调用
$html = div($config);
// 参数后置调用语法
$html = div {
"body": "内容"
}当解析器遇到 div { ... } 这种语法时:
div被识别为函数名- 花括号
{ ... }内的内容被解析为参数 - 花括号内的内容被解析为对象/字典结构
- 该对象作为参数传递给
div函数
参数后置调用支持嵌套结构:
function span($obj) {
return "<span>" + $obj->body + "</span>";
}
$html = div {
"body": span {
"body": "内容"
}
}在这个例子中:
span { "body": "内容" }创建一个对象,包含body属性- 这个对象作为参数传递给
span函数 span函数的返回值作为div函数的body参数
function createComponent($config) {
return "<div class='" + $config->class + "'>" +
"<h1>" + $config->title + "</h1>" +
"<p>" + $config->content + "</p>" +
"</div>";
}
$component = createComponent {
"class": "card",
"title": "欢迎",
"content": "这是一个组件"
}function createConfig($options) {
return {
"debug": $options->debug ?? false,
"timeout": $options->timeout ?? 5000
};
}
$config = createConfig {
"debug": true,
"timeout": 10000
}
// 调用配置中的函数
$config->onSuccess("数据加载完成");花括号内的内容被解析为键值对结构:
$obj = {
"key1": "value1",
"key2": "value2",
"number": 123,
"boolean": true
}花括号内支持各种数据类型:
$config = {
"string": "文本",
"number": 42,
"boolean": true,
"array": [1, 2, 3],
"function": function($x) { return $x * 2; },
"nested": {
"inner": "嵌套值"
}
}namespace components;
function createCard($config) {
return "<div class='card'>" +
"<h3>" + $config->title + "</h3>" +
"<p>" + $config->content + "</p>" +
"</div>";
}
$card = createCard {
"title": "欢迎",
"content": "这是一个卡片组件"
}function createAppConfig($options) {
return {
"debug": $options->debug ?? false,
"timeout": $options->timeout ?? 5000,
"retries": $options->retries ?? 3,
"api": $options->api ?? "https://api.example.com"
};
}
$appConfig = createAppConfig {
"debug": true,
"timeout": 10000,
"api": "https://myapi.com"
}function createEventHandler($handlers) {
return {
"onClick": $handlers->onClick ?? function() {},
"onSubmit": $handlers->onSubmit ?? function() {},
"onError": $handlers->onError ?? function($error) {
echo "错误: " + $error;
}
};
}
$handlers = createEventHandler {
"onClick": function($event) {
echo "按钮被点击了";
},
"onSubmit": function($form) {
echo "表单提交: " + $form->data;
}
}function createQuery($params) {
return "SELECT " + $params->fields +
" FROM " + $params->table +
" WHERE " + $params->where;
}
$query = createQuery {
"fields": "id, name, email",
"table": "users",
"where": "status = 'active'"
}- 可读性: 参数结构更清晰,易于理解
- 简洁性: 比传统函数调用更简洁
- 结构化: 参数以结构化方式组织
- 嵌套支持: 支持深层嵌套的参数结构
- 类型安全: 支持类型检查和类型提示
// 传统方式
$html = div(array(
"body" => "内容",
"class" => "container"
));
// 参数后置调用
$html = div {
"body": "内容",
"class": "container"
}// 传统方式 - 难以阅读
$component = createComponent(array(
"class" => "card",
"title" => "欢迎",
"content" => "这是一个组件",
"handlers" => array(
"onClick" => function($event) { /* ... */ },
"onSubmit" => function($form) { /* ... */ }
)
));
// 参数后置调用 - 更清晰
$component = createComponent {
"class": "card",
"title": "欢迎",
"content": "这是一个组件",
"handlers": {
"onClick": function($event) { /* ... */ },
"onSubmit": function($form) { /* ... */ }
}
}- 函数定义: 函数必须能够接受对象/字典类型的参数
- 属性访问: 在函数内部使用
->操作符访问参数属性 - 类型检查: 支持静态类型检查,提供更好的开发体验
- 作用域: 花括号内的变量遵循正常的作用域规则
- 错误处理: 如果函数不接受对象参数,会抛出类型错误
// JavaScript - 对象字面量作为参数
const html = div({
body: "内容",
class: "container"
});
// 折言语法
$html = div {
"body": "内容",
"class": "container"
}# Python - 字典作为参数
html = div({
"body": "内容",
"class": "container"
})
# 折言语法
$html = div {
"body": "内容",
"class": "container"
}这种函数参数后置调用语法让折言在保持 PHP 兼容性的同时,提供了更现代和直观的函数调用体验,特别适合需要传递复杂参数结构的场景。
function hello(array $args): string {
return "Hello ". $args->join("")
}
// 传统函数调用
$str = hello(["w", "o", "r", "l", "d"])
// 参数后置调用语法
$str = hello ["w", "o", "r", "l", "d"]当解析器遇到hello [...]这种语法时:
hello被识别为函数名- 方括号
[...]内的内容被解析为参数 - 方括号内的内容被解析为数组结构
- 该数组作为参数传递给
hello函数
不要和数组访问混淆,方括号形式参数后置的函数名跟参数之间需要空白符,而数组访问则不需要。
// 数组访问
array arr = ["a", "b", "c"]
echo arr[0], "\n" // 输出 a
// 参数后置调用
function foo(array $param) {
return $param
}
echo foo [0], "\n" // 输出 [0]