Php 字符串中变量的命名绑定?
我正在寻找类似sprintf()的函数,除了使用sprintf()可以按参数顺序绑定值之外,我还需要一些可以按名称绑定变量的函数。因此,如果我有字符串Php 字符串中变量的命名绑定?,php,data-binding,string,Php,Data Binding,String,我正在寻找类似sprintf()的函数,除了使用sprintf()可以按参数顺序绑定值之外,我还需要一些可以按名称绑定变量的函数。因此,如果我有字符串“Hello$name!很高兴让您访问,$name!”,您可以传递一个数组或其他内容,并从中获取结果字符串 类似于PDO语句,但仅用于普通字符串,而不是数据库查询。我可以使用什么?也许您可以使用,例如在匿名函数中将自由变量绑定为参数,该函数返回一个字符串,其中包含填充自由变量的值。这将与闭包内的函数配合使用,在闭包中,数组中的键将成为本地范围内的实
“Hello$name!很高兴让您访问,$name!”
,您可以传递一个数组或其他内容,并从中获取结果字符串
类似于PDO语句,但仅用于普通字符串,而不是数据库查询。我可以使用什么?也许您可以使用,例如在匿名函数中将自由变量绑定为参数,该函数返回一个字符串,其中包含填充自由变量的值。这将与闭包内的函数配合使用,在闭包中,数组中的键将成为本地范围内的实变量,这是评估格式字符串中引用的变量所必需的
或者可能有一个使用eval
的相对简单的版本(这只是一个示例,不是测试代码):
PHP的作用域控制机制有点吓人,所以您可能需要验证这不会将变量到处泄漏到作用域中。它也值得输入。也许您可以使用,例如在匿名函数中将自由变量绑定为参数,该函数返回一个字符串,其中包含填充自由变量的值。这将与闭包内的函数配合使用,在闭包中,数组中的键将成为本地范围内的实变量,这是评估格式字符串中引用的变量所必需的
或者可能有一个使用eval
的相对简单的版本(这只是一个示例,不是测试代码):
PHP的作用域控制机制有点吓人,所以您可能需要验证这不会将变量到处泄漏到作用域中。这也值得一提。PHP内置了对双引号字符串内变量求值的支持。虽然不能“传入”数组,但可以将当前变量范围视为字符串生成器“函数”的输入 编辑: 更灵活的解决方案可能是将代码抽象为闭包。这不依赖于
eval
,可能会运行得更快
$hello_two = function ( array $params ) {
extract( $params );
return "Hello $name1 and $name2!";
}
//Hello User and Kendall
$hello_two( array( "var1" => "User", "var2" => "Kendall" ) );
PHP内置了对双引号字符串内部变量求值的支持。虽然不能“传入”数组,但可以将当前变量范围视为字符串生成器“函数”的输入 编辑: 更灵活的解决方案可能是将代码抽象为闭包。这不依赖于
eval
,可能会运行得更快
$hello_two = function ( array $params ) {
extract( $params );
return "Hello $name1 and $name2!";
}
//Hello User and Kendall
$hello_two( array( "var1" => "User", "var2" => "Kendall" ) );
preg_replace/e或preg_replace_回调是您的最佳选择
$vars = array('name' => 'Joe', 'age' => 25);
$str = "@name is @age years old";
echo preg_replace('/@(\w+)/e', '$vars["$1"]', $str);
preg_replace/e或preg_replace_回调是您的最佳选择
$vars = array('name' => 'Joe', 'age' => 25);
$str = "@name is @age years old";
echo preg_replace('/@(\w+)/e', '$vars["$1"]', $str);
是的,我知道,但我需要一个函数来实现这一点,这样我就可以在多个地方重复使用我的模板字符串。换句话说,我不希望在编写本文时绑定变量。使用这个php功能会使字符串成为一次性的,我不能重复使用它。这似乎要求每个格式字符串有一个单独的闭包。这真的是被问到的吗?@Gian是的,在PHP运行之前,每个字符串都需要编译成操作码才能获得良好的性能。闭包提供了一种围绕PHP字符串构建结构“移动”的可移植方式。任何需要评估的内容都需要PHP编译器在每次运行代码时读取它,不管它运行了多少次。这不是我要问的。我建议您必须为希望使用的每个不同格式字符串编写一个新函数。这似乎有点脆弱。我同意eval不是一个很好的解决方案,但我正在尝试思考是否有更好的通用方法(即,根据格式字符串和数据值数组进行参数化)。是的,我知道,但我想要一个这样做的函数,这样我就可以在多个地方重复使用我的模板字符串。换句话说,我不希望在编写本文时绑定变量。使用这个php功能会使字符串成为一次性的,我不能重复使用它。这似乎要求每个格式字符串有一个单独的闭包。这真的是被问到的吗?@Gian是的,在PHP运行之前,每个字符串都需要编译成操作码才能获得良好的性能。闭包提供了一种围绕PHP字符串构建结构“移动”的可移植方式。任何需要评估的内容都需要PHP编译器在每次运行代码时读取它,不管它运行了多少次。这不是我要问的。我建议您必须为希望使用的每个不同格式字符串编写一个新函数。这似乎有点脆弱。我同意eval不是一个很好的解决方案,但我正在尝试思考是否有更好的通用方法(即根据格式字符串和数据值数组进行参数化)。
eval
不是一个解决方案,而是一个问题。同意。这就是为什么我建议在第一个实例中使用闭包,然后说如果OP想要一个printf方式的通用解决方案,那么有一个使用eval的“相对简单的版本”。如果您实际实现的是系统级通用功能,则可以使用eval。“如果您实际实现的是系统级通用功能,则可以使用eval。”,我不同意几乎总是有更好的方法eval
很难维护,对性能和安全性不利。eval
不是解决方案,而是一个问题。同意。这就是为什么我建议在第一个实例中使用闭包,然后说如果OP想要一个printf方式的通用解决方案,那么有一个使用eval的“相对简单的版本”。如果您实际实现的是系统级通用功能,则可以使用eval。“如果您实际实现的是系统级通用功能,则可以使用eval。”,我不同意几乎总是存在一个问题