首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的本地PHP函数不能看到$test变量,以及如何获得它的值?

为什么我的本地PHP函数不能看到$test变量,以及如何获得它的值?
EN

Stack Overflow用户
提问于 2020-11-10 09:32:47
回答 2查看 142关注 0票数 0

我使用PHP HereDoc和NowDoc语句在我的网站中构建网页,HereDocs用于需要将PHP变量值替换到web页面中的部件,NowDocs用于使用$字符指定jQuery语句和jQuery对象变量的部件。然而,这使得我的HTML、CSS和JavaScript/jQuery难以阅读和维护。

为了解决这个问题,我认为我应该编写一个替换函数来执行HereDoc语句所做的PHP变量替换,但是对于那些使用字符串表达式或NowDoc语句分配值的变量。这样,${variable-name}在字符串中指定的PHP变量将被它们的值替换,而jQuery语句和$前缀变量(这些变量的值被期望为jQuery对象)不会替代jQuery变量,否则,如果没有名称匹配的jQuery语句或变量名的PHP变量,或者在名称匹配时出现运行时逻辑错误,则通常会导致PHP编译器错误。

下面是我的代码和一个测试NowDoc:

  • 将包含${test}变量的长字符串分配给PHP数组变量中的一个元素,然后
  • 将数组作为参数传递给我的NowHereDoc函数,以执行PHP变量/值替换。

但是,当我运行下面的代码来构建我的网页时,$test变量在函数中是不可见的,取而代之的是NULL而不是所需的值。

代码语言:javascript
复制
<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库函数,它可以返回一个给定名称为字符串的值,但我不记得函数的名称。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-10 13:11:30

虽然没有模板解决方案(可能稍后会出现),但我找到了到达函数,这是我记得看到的,但不记得它的名称。它获得在调用时在作用域内的已定义变量的列表。或者,可以创建一个手动变量列表并将其传递给函数,因为不需要get_define_vars()函数返回的定义变量列表中的大多数变量。

代码语言:javascript
复制
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 );

再次感谢你的帮助,马特和CBroe。

票数 0
EN

Stack Overflow用户

发布于 2020-11-10 09:39:42

要将全局变量导入到函数中,可以这样做:

代码语言:javascript
复制
// global scope
$test = 'my string';

function myFunction() {
    global $test;
}

或者,如果您有一个匿名函数,可以从父作用域中提取变量,如下所示:

代码语言:javascript
复制
function myOuterFn() {
    $test = 'my string';
    $myInnerFn = function() use ($test) {
        echo $test;
    };
}

响应您的评论,如果您在内容中循环以将任何引用的变量提取到一个var名称数组中,则可以循环该数组并从全局导入它们,如本例所示:https://3v4l.org/rH8J0

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64766210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档