【问题标题】:calling a function with require but variables and arrays are undefined使用 require 调用函数,但变量和数组未定义
【发布时间】:2013-03-22 00:07:33
【问题描述】:

为什么用 require 调用时看不到我的变量?

function.php

<?php
function paginator(){

    $links  = array("index.php", "services.php", "content.php","contact_us.php" );
    $trimslug = substr(strrchr($_SERVER['PHP_SELF'], "/"), 1); 

        foreach ($links as $key => $value) {
            if ($value == $trimslug ) {
                $GLOBALS['$page'] = $key;
            }
        }
    $page = $GLOBALS['$page'];
    $next = $page+1;
    $previous = $page-1;
}



?>  

content.php

<?php
session_start();
require './functions.php';
paginator();
?>


<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Pagination</title>
</head>
<body>

<h2>Now on Page : <?php echo $page?></h2>

<a href="<?php echo $links[$next] ?>" >Next</a>
<br><br><br>

<a href="<?php  echo $links[$previous]?>" >Previous</a>
<br>


</body>
</html>

我希望在使用 require 函数时能够看到我的变量,因为这段代码将出现在每一页上。这可能是一个非常难以理解的概念,但我真的希望有人能正确地说明这个概念。

这似乎有效,谢谢大家。

<?php

    $links  = array("index.php", "services.php", "content.php","contact_us.php" );
    $trimslug = substr(strrchr($_SERVER['PHP_SELF'], "/"), 1); 
    $page = null;

    function paginator(){
    global $links,$trimslug,$next,$previous,$page;

        foreach ($links as $key => $value) {
        if ($value == $trimslug ) {
            // $GLOBALS['$page'] = $key;
            $page = $key;
        }
    }
$next = $page+1;
$previous = $page-1;
}

?>

【问题讨论】:

    标签: php arrays variables scope require


    【解决方案1】:

    paginator里面的变量只在函数范围内,不在php文件内。如果您想在该函数之外访问它们,只需将这些变量移到该函数之外。例如

    $page=null;
    $links=...
    function paginator(){
    ...
    }
    

    【讨论】:

    • 我试过了...此时我很困惑...如果我将所有变量命名在函数范围之外,那么函数内部会留下什么?
    • 关键概念是一旦函数调用结束,函数内部定义的变量就会丢失。在函数(或全局)之外定义它们使它们在您的 function.php、分页器函数和 content.php 中可用。 “require”命令基本上合并了function.php和content.php。
    【解决方案2】:

    这是因为变量是在函数paginator()的范围内定义的;

    如果您希望它们在 content.php 范围内可访问,请像这样声明它们:

    global $variable = 'value';
    

    或者,只需在 function.php 中声明它们,而不需要在 content.php 中的后续调用。

    【讨论】:

    • 如果代码不在函数中,它就可以工作。但为了更干净一点,我试图让它成为一个函数,现在我遇到了问题......由于某种原因,我仍然无法理解这个概念。如果我调用要求页面(function.php)然后在前几行中调用该函数,它应该通过程序并像不是函数调用一样工作......不是吗?我什至试图返回 $page .... 那也没有用...我在这里遗漏了一个关键概念!
    • 如何使用该功能变得更干净。我不明白这一点。不过,如果你想用函数来实现它,请按照建议使用 global 关键字。
    • 我还要感谢您参与回答!但我只能感谢一个人。
    • 没关系。无论哪种方式,解决方案实际上都是相同的。使用 global 关键字指定范围是全局的,并且使用 NULL 预定义变量也可以有效地做同样的事情。事实上,如果你使用 global,它更容易维护,因为你不必去预定义你将来可能使用的每个新变量。关于您之前评论中提到的理解检查php.net/manual/en/language.variables.scope.php
    【解决方案3】:

    PHP 中的变量仅限于函数的范围,除非通过参数调用或添加到全局数组中。

    全局数组是不好的做法,只是说。

    您总是可以将变量放入私有类并根据需要调用它,尽管这对初学者来说相当棘手。

    【讨论】:

    • 为什么全局变量不好?如您所见,我在函数中使用 $GLOBALS['$page'] 来保留 $key 的值?有没有更好的办法 ?使用全局数组时是否存在安全风险?
    • 是的。尽管归根结底是对用户输入数据进行清理,但将内容放在全局中可能会造成安全漏洞,尤其是在打印错误时。作为参数传递 [i.e.function myFunction($argument)] 更安全一些。或者至少我是这么说的。
    猜你喜欢
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多