Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 字符串中变量的命名绑定?_Php_Data Binding_String - Fatal编程技术网

Php 字符串中变量的命名绑定?

Php 字符串中变量的命名绑定?,php,data-binding,string,Php,Data Binding,String,我正在寻找类似sprintf()的函数,除了使用sprintf()可以按参数顺序绑定值之外,我还需要一些可以按名称绑定变量的函数。因此,如果我有字符串“Hello$name!很高兴让您访问,$name!”,您可以传递一个数组或其他内容,并从中获取结果字符串 类似于PDO语句,但仅用于普通字符串,而不是数据库查询。我可以使用什么?也许您可以使用,例如在匿名函数中将自由变量绑定为参数,该函数返回一个字符串,其中包含填充自由变量的值。这将与闭包内的函数配合使用,在闭包中,数组中的键将成为本地范围内的实

我正在寻找类似sprintf()的函数,除了使用sprintf()可以按参数顺序绑定值之外,我还需要一些可以按名称绑定变量的函数。因此,如果我有字符串
“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。”,我不同意几乎总是存在一个问题