从函数范围内部访问全局范围的数据 [duplicate]

Access data from global scope from inside function scope [duplicate]

提问人:apex anchor 提问时间:11/7/2023 最后编辑:mickmackusaapex anchor 更新时间:11/8/2023 访问量:69

问:

我想获取随机数并在函数之间传递它。我试图标记,但是当我将相同的变量标记到时,我无法获得相同的随机数;我什么也没得到。$randIduser_edit.php?session=$randIduser_add.php?session=

我需要一种方法在函数之间传递相同的随机数值user_add.php?session=

function get_user_edit_link() {
    $url = "http://". $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    $x = pathinfo($url);

    $MIN_SESSION_ID = 1000000000;
    $MAX_SESSION_ID = 9999999999;
    $randId = mt_rand($MIN_SESSION_ID, $MAX_SESSION_ID);
    $randId = mt_rand($MIN_SESSION_ID, $MAX_SESSION_ID);

    return $ee = $x['dirname'] . 'user_edit.php?session='. $randId;
}

function get_user_add_link() {
    $url = "http://". $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    $x = pathinfo($url);
    return $ee = $x['dirname'] . 'user_add.php?session='. $randId;
}
PHP 函数 变量 作用域 参数传递

评论

0赞 Ken Lee 11/7/2023
请在您的问题中添加您调用的代码和get_user_edit_link()get_user_add_link()
0赞 Greg Schmidt 11/7/2023
你在这里有一些基本的误解,你应该做一些关于“PHP变量范围”的阅读,以更好地理解这一点。
0赞 Álvaro González 11/7/2023
user_add.php并且不是函数;它们是 URL 端点(或页面,如果您愿意),在本例中也是文件。 和 是函数。另外,请注意,PHP 具有在页面之间传输信息的功能,称为“会话”(命名 URL 参数没有错,但可能会造成混淆)。user_edit.phpget_user_edit_link()get_user_add_link()session

答:

-1赞 Adi 11/7/2023 #1

您可以尝试创建全局变量并在每个函数中访问它。例如-

$MIN_SESSION_ID = 1000000000;
$MAX_SESSION_ID = 9999999999;
$randId = mt_rand($MIN_SESSION_ID, $MAX_SESSION_ID);

function get_user_edit_link() {
    global $randId;
}

这样,它就可以在两个函数中访问,允许您在它们之间共享相同的随机数。

评论

0赞 Adi 11/7/2023
@apexanchor 请记住,使用全局 var 有一些缺点,请务必阅读它,因为它可能会在以后引入一些问题
0赞 Adi 11/7/2023
@apexanchor很高兴我能帮忙考虑这是一个临时解决方案
1赞 Álvaro González 11/7/2023
为什么没有常规函数参数?不知从何而来的变量(并在意外/未知的位置随机变化)是维护的噩梦。
0赞 Adi 11/8/2023
@ÁlvaroGonzález是的,我知道那些噩梦,这就是我加了警告的原因。此外,我可以想象某些用例,例如单例模式或资源管理。我们可能不会经常看到它们,这是由于使用了框架,它为我们提供了如此多的东西。在这个问题的情况下,我相信的用例是缓存以实现会话的全局缓存机制,如果我没记错的话,这在框架的情况下是正确的。
-1赞 Tangentially Perpendicular 11/8/2023 #2

使用全局变量通常被认为是不好的做法。最好将值传递到需要它们作为参数的函数中:

<?php 

// declare functions.
function get_user_edit_link($randId) {
        $url = "http://". $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        $x = pathinfo($url);
        return $ee = $x['dirname'] . 'user_edit.php?session='. $randId;
}

function get_user_add_link($randId) {
        $url = "http://". $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        $x = pathinfo($url);
        return $ee = $x['dirname'] . 'user_add.php?session='. $randId;
}

// Create random ID
$MIN_SESSION_ID = 1000000000;
$MAX_SESSION_ID = 9999999999;
$randId = mt_rand($MIN_SESSION_ID, $MAX_SESSION_ID);

// Call your functions

$link = get_user_add_link($randId);
// or
$link = get_user_edit_link($randId);

评论

0赞 Adi 11/8/2023
@mickmackusa完全同意,但你能不能把副本编辑成这个问题。我相信它与这里提出的问题更具体地相关