为什么我的本地 PHP 函数看不到 $test 变量,如何获取它的值?
Why can't my local PHP function see the $test variable, and how can I get its value?
我正在使用 PHP HereDoc 和 NowDoc 语句在我的网站中构建网页,对于需要将 PHP 变量值替换到网页中的部分,使用 HereDocs和 NowDocs 部分使用 $ 字符指定 jQuery 语句和 jQuery 对象变量在我的 JavaScript 中。然而,这使得我的 HTML、CSS 和 JavaScript/jQuery 难以阅读和维护。
为了解决这个问题,我想我会编写一个替换函数来执行 HereDoc 语句执行的 PHP 变量替换,但对于值是用字符串表达式或 NowDoc 语句分配的变量。这样,字符串中由 ${variable-name} 指定的 PHP 变量将被替换为它们的值,并且 jQuery 语句和 $ 前缀变量的值预计为 jQuery 对象不会替换 PHP 变量,否则通常会导致 PHP 当没有名称与 jQuery 语句或变量名称匹配的 PHP 变量时出现编译器错误,或者当名称匹配时出现 运行 时间逻辑错误。
这是我的代码和一个测试 NowDoc:
- 将包含${test}PHP变量的长字符串赋给PHP数组变量中的一个元素,然后
- 将数组作为参数传递给我的 NowHereDoc 函数以执行 PHP variable/value 替换。
但是,当我 运行 使用以下代码构建我的网页时,$test PHP 变量在函数内部不可见,并且 NULL 被替换而不是所需的值。
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
<?php
//
// PHP
//
function NowHereDoc( &$_array_ ) { // By Ref array parameter minimizes data movement when calling this function.
$_l_ = count( $_array_ );
$_s_ = $_array_[ $_l_ - 1 ]; // Get the last element's string value.
// Find each ${...} and substitute the variable's value ...
$_i1_ = 0;
while( ( $_i1_ = strpos( $_s_, '${', $_i1_ ) ) !== FALSE ) { // Get index of start of a variable name specified
// by ${...} or FALSE when there aren't any {more},
// then stop looping.
$_i2_ = strpos( $_s_, '}', $_i1_ ); // Get index of end of the ${...} just found.
$_l_ = $_i2_ - $_i1_ + 1; // Get length of ${...}.
$_var_ = substr( $_s_, $_i1_, $_l_ ); // Get the variable's name as a string.
$_v_ = str_replace( [ '{', '}' ], '', $_var_ ); // Remove { and } from the variable name.
$_val_ = "$_v_"; // Get the value of the specified variable -- this
// doesn't find the variable, instead returns NULL!
// Substitute the variable's value into the original string, $_s_
// $_s_ = substr_replace( $_s_, $$_var_, $_i1_, $_l_ ); // Replace the single occurance of the variable
// with its value. This could to replace occurances
// not with in comments, not yet implemented in
// function.
$_s_ = str_replace( $_var_, $_val_, $_s_ ); // Replace all occurances of the variable with its
// value.
} // End of while( ( $_i1_ = strpos( $_s_, '${', $_i1_ ) ) !== FALSE ) ...
$_array_[ $_l_ - 1 ] = $_s_; // Set the last element's string value to the
// updated string in $_s_.
}
// No Variable substitutions allowed in a NowDoc.
$strMAINs[] = <<<'MAIN'
<!-- ======================================================
======================================================
=
= HTML - ${test} - This should be substituted with hi
=
======================================================
====================================================== -->
<p>to be set by this following script</p>
<script id="scriptId">
//
// JavaScript!
//
// The following jQuery statement shouldn't be changed.
//
var $jQVar = $( 'p' ).html( 'there' );
</script>
MAIN;
//
// PHP
//
$test = 'hi';
NowHereDoc( $strMAINs );
?>
<!-- HTML -->
<b>Test of my PHP NowHereDoc function</b>
如何通过指定为字符串值的名称访问 PHP 变量,这些名称在从内部调用 NowHereDoc 函数的函数中是全局的或局部的,而不必将它们作为参数传递或将它们指定为函数中的全局变量?我记得看到一个 PHP 库函数可以 return 给定一个字符串名称的值,但我不记得函数的名称了。
谢谢
要将全局变量导入您的函数,您可以这样做:
// global scope
$test = 'my string';
function myFunction() {
global $test;
}
或者如果你有一个匿名函数,你可以像这样从父作用域中引入变量:
function myOuterFn() {
$test = 'my string';
$myInnerFn = function() use ($test) {
echo $test;
};
}
为了回应您的评论,如果您循环遍历内容以将任何引用的变量提取到 var 名称数组中,您可以循环遍历该数组并从全局导入它们,如本例所示:https://3v4l.org/rH8J0
虽然不是模板解决方案,可能稍后会出现,但我找到了 get_defined_vars() 函数,那是我记得看过的部分,但不记得它的内容姓名。它获取调用时范围内的已定义变量的列表。或者,可以创建手动变量列表并将其传递给函数,因为不需要 get_define_vars() 函数返回的已定义变量列表中的大多数变量.
function NowHereDoc( &$_vars_, &$_array_ ) { // a by-ref array of variables and their values from the caller's scope.
//
// a by-ref array specifying the web-content as a string that
// contains one or more PHP variables in the ${...} format who's
// values are to be substituted for the variable name.
//
// & By-Ref prefix minimizes data movement when calling this function.
//
$_l_ = count( $_array_ );
$_s_ = $_array_[ $_l_ - 1 ]; // Get the last element's string value.
// Find each ${...} and substitute the variable's value ...
$_i1_ = 0;
while( ( $_i1_ = strpos( $_s_, '${', $_i1_ ) ) !== FALSE ) { // Get index of start of a variable name specified
// by ${...} or FALSE when there aren't any {more},
// then stop looping.
$_i2_ = strpos( $_s_, '}', $_i1_ ); // Get index of end of the ${...} just found.
$_l_ = $_i2_ - $_i1_ + 1; // Get length of ${...}.
$_var_ = substr( $_s_, $_i1_, $_l_ ); // Get the variable's name as a string.
$_v_ = str_replace( [ '$', '{', '}' ], '', $_var_ ); // Remove { and } from the variable name.
$_val_ = $_vars_[ $_v_ ]; // Get the value of the specified variable.
// Substitute the variable's value into the original string, $_s_
// $_s_ = substr_replace( $_s_, $_val_, $_i1_, $_l_ ); // Replace the single occurance of the variable
// with its value. This could to replace occurances
// not with in comments, not yet implemented in
// function.
$_s_ = str_replace( $_var_, $_val_, $_s_ ); // Replace all occurances of the variable with its
// value.
} // End of while( ( $_i1_ = strpos( $_s_, '${', $_i1_ ) ) !== FALSE ) ...
$_array_[ $_l_ - 1 ] = $_s_; // Set the last element's string value to the
// updated string in $_s_.
}
// No variable substitutions.
$strMAINs[] = <<<'MAIN'
<!--
=======================================================================
=======================================================================
=
= ${test1} ${test2} // ${test1} ${test2} should be substituted with hi there
=
=======================================================================
=======================================================================
-->
MAIN;
$test1 = 'hi';
$test2 = 'there';
$vars = get_defined_vars();
NowHereDoc( $vars, $strMAINs );
再次感谢 Matt 和 CBroe 的帮助。
我正在使用 PHP HereDoc 和 NowDoc 语句在我的网站中构建网页,对于需要将 PHP 变量值替换到网页中的部分,使用 HereDocs和 NowDocs 部分使用 $ 字符指定 jQuery 语句和 jQuery 对象变量在我的 JavaScript 中。然而,这使得我的 HTML、CSS 和 JavaScript/jQuery 难以阅读和维护。
为了解决这个问题,我想我会编写一个替换函数来执行 HereDoc 语句执行的 PHP 变量替换,但对于值是用字符串表达式或 NowDoc 语句分配的变量。这样,字符串中由 ${variable-name} 指定的 PHP 变量将被替换为它们的值,并且 jQuery 语句和 $ 前缀变量的值预计为 jQuery 对象不会替换 PHP 变量,否则通常会导致 PHP 当没有名称与 jQuery 语句或变量名称匹配的 PHP 变量时出现编译器错误,或者当名称匹配时出现 运行 时间逻辑错误。
这是我的代码和一个测试 NowDoc:
- 将包含${test}PHP变量的长字符串赋给PHP数组变量中的一个元素,然后
- 将数组作为参数传递给我的 NowHereDoc 函数以执行 PHP variable/value 替换。
但是,当我 运行 使用以下代码构建我的网页时,$test PHP 变量在函数内部不可见,并且 NULL 被替换而不是所需的值。
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
<?php
//
// PHP
//
function NowHereDoc( &$_array_ ) { // By Ref array parameter minimizes data movement when calling this function.
$_l_ = count( $_array_ );
$_s_ = $_array_[ $_l_ - 1 ]; // Get the last element's string value.
// Find each ${...} and substitute the variable's value ...
$_i1_ = 0;
while( ( $_i1_ = strpos( $_s_, '${', $_i1_ ) ) !== FALSE ) { // Get index of start of a variable name specified
// by ${...} or FALSE when there aren't any {more},
// then stop looping.
$_i2_ = strpos( $_s_, '}', $_i1_ ); // Get index of end of the ${...} just found.
$_l_ = $_i2_ - $_i1_ + 1; // Get length of ${...}.
$_var_ = substr( $_s_, $_i1_, $_l_ ); // Get the variable's name as a string.
$_v_ = str_replace( [ '{', '}' ], '', $_var_ ); // Remove { and } from the variable name.
$_val_ = "$_v_"; // Get the value of the specified variable -- this
// doesn't find the variable, instead returns NULL!
// Substitute the variable's value into the original string, $_s_
// $_s_ = substr_replace( $_s_, $$_var_, $_i1_, $_l_ ); // Replace the single occurance of the variable
// with its value. This could to replace occurances
// not with in comments, not yet implemented in
// function.
$_s_ = str_replace( $_var_, $_val_, $_s_ ); // Replace all occurances of the variable with its
// value.
} // End of while( ( $_i1_ = strpos( $_s_, '${', $_i1_ ) ) !== FALSE ) ...
$_array_[ $_l_ - 1 ] = $_s_; // Set the last element's string value to the
// updated string in $_s_.
}
// No Variable substitutions allowed in a NowDoc.
$strMAINs[] = <<<'MAIN'
<!-- ======================================================
======================================================
=
= HTML - ${test} - This should be substituted with hi
=
======================================================
====================================================== -->
<p>to be set by this following script</p>
<script id="scriptId">
//
// JavaScript!
//
// The following jQuery statement shouldn't be changed.
//
var $jQVar = $( 'p' ).html( 'there' );
</script>
MAIN;
//
// PHP
//
$test = 'hi';
NowHereDoc( $strMAINs );
?>
<!-- HTML -->
<b>Test of my PHP NowHereDoc function</b>
如何通过指定为字符串值的名称访问 PHP 变量,这些名称在从内部调用 NowHereDoc 函数的函数中是全局的或局部的,而不必将它们作为参数传递或将它们指定为函数中的全局变量?我记得看到一个 PHP 库函数可以 return 给定一个字符串名称的值,但我不记得函数的名称了。
谢谢
要将全局变量导入您的函数,您可以这样做:
// global scope
$test = 'my string';
function myFunction() {
global $test;
}
或者如果你有一个匿名函数,你可以像这样从父作用域中引入变量:
function myOuterFn() {
$test = 'my string';
$myInnerFn = function() use ($test) {
echo $test;
};
}
为了回应您的评论,如果您循环遍历内容以将任何引用的变量提取到 var 名称数组中,您可以循环遍历该数组并从全局导入它们,如本例所示:https://3v4l.org/rH8J0
虽然不是模板解决方案,可能稍后会出现,但我找到了 get_defined_vars() 函数,那是我记得看过的部分,但不记得它的内容姓名。它获取调用时范围内的已定义变量的列表。或者,可以创建手动变量列表并将其传递给函数,因为不需要 get_define_vars() 函数返回的已定义变量列表中的大多数变量.
function NowHereDoc( &$_vars_, &$_array_ ) { // a by-ref array of variables and their values from the caller's scope.
//
// a by-ref array specifying the web-content as a string that
// contains one or more PHP variables in the ${...} format who's
// values are to be substituted for the variable name.
//
// & By-Ref prefix minimizes data movement when calling this function.
//
$_l_ = count( $_array_ );
$_s_ = $_array_[ $_l_ - 1 ]; // Get the last element's string value.
// Find each ${...} and substitute the variable's value ...
$_i1_ = 0;
while( ( $_i1_ = strpos( $_s_, '${', $_i1_ ) ) !== FALSE ) { // Get index of start of a variable name specified
// by ${...} or FALSE when there aren't any {more},
// then stop looping.
$_i2_ = strpos( $_s_, '}', $_i1_ ); // Get index of end of the ${...} just found.
$_l_ = $_i2_ - $_i1_ + 1; // Get length of ${...}.
$_var_ = substr( $_s_, $_i1_, $_l_ ); // Get the variable's name as a string.
$_v_ = str_replace( [ '$', '{', '}' ], '', $_var_ ); // Remove { and } from the variable name.
$_val_ = $_vars_[ $_v_ ]; // Get the value of the specified variable.
// Substitute the variable's value into the original string, $_s_
// $_s_ = substr_replace( $_s_, $_val_, $_i1_, $_l_ ); // Replace the single occurance of the variable
// with its value. This could to replace occurances
// not with in comments, not yet implemented in
// function.
$_s_ = str_replace( $_var_, $_val_, $_s_ ); // Replace all occurances of the variable with its
// value.
} // End of while( ( $_i1_ = strpos( $_s_, '${', $_i1_ ) ) !== FALSE ) ...
$_array_[ $_l_ - 1 ] = $_s_; // Set the last element's string value to the
// updated string in $_s_.
}
// No variable substitutions.
$strMAINs[] = <<<'MAIN'
<!--
=======================================================================
=======================================================================
=
= ${test1} ${test2} // ${test1} ${test2} should be substituted with hi there
=
=======================================================================
=======================================================================
-->
MAIN;
$test1 = 'hi';
$test2 = 'there';
$vars = get_defined_vars();
NowHereDoc( $vars, $strMAINs );
再次感谢 Matt 和 CBroe 的帮助。