【问题标题】:PHP: Set a global variable from within a functionPHP:从函数内设置全局变量
【发布时间】:2018-03-03 22:57:01
【问题描述】:

我有以下代码

$user;
if (isset($_POST['submitLogin']))
{ 
    $GLOBALS['user'] = logIn();
    // location1
}

function logIn()
{
    $user = new User("my username", "my email");
    return $user;
}

// location2

然后我想像这样显示该信息:

echo $GLOBALS['user']->__get('username');

但它只适用于 location1。 我已经通过使用全局数组并将数据从 User 实例传递到该全局数组来解决这个问题,但这违背了使用类的目的。 如果您能给我一个提示或让我走上正轨,我将非常感激。

【问题讨论】:

  • 那么问题是什么?实际发生了什么?任何错误显示?您的日志文件中有任何消息吗?
  • 听起来你在这里调戏OOP尸体……
  • 你应该先给我们看User类。
  • 代码 sn-p 是否都在同一个文件和范围内?换句话说,//location2//location1 不在不同的函数或类中。如果它位于不同的函数或类中,则可能会导致您遇到问题。

标签: php


【解决方案1】:

我不太明白你的要求。但是您始终可以通过参数将对象传递给函数,而不是使用全局变量。演示在这里:

<?php
ini_set('display_errors', true);
error_reporting(E_ALL);

class UserSignup
{
    public $username;
    public $email;

    public function __construct($username, $email)
    {
        $this->username = $username;
        $this->email    = $email;
    }
}

function process_signup_form()
{
    if ($_SERVER['REQUEST_METHOD'] == 'POST')
    { 
        $user = new UserSignup(
            $_POST['username'] ?? null,
            $_POST['email']    ?? null
        );
        if(signup($user))
            echo 'Thanks for signing up!';
    }
}

function signup(UserSignup $user)
{
    echo 'Signing up:' . $user->username . ' with email:' . $user->email;

    return true;
}

process_signup_form();
?>
<form method="post">
    <input type="text" name="username">
    <input type="email" name="email">
    <input type="submit">
</form>

【讨论】:

  • 试图将它作为参数传递,每个值和每个引用,都不起作用。我想做的是:用户在点击“帐户”时登录,他会看到他的信息,所以信息必须在某个地方:在用户实例或数组中。当显示来自数组的信息时,它在显示来自实例的信息时工作正常,它什么也不显示,它挂在第一个要显示的变量处(之后甚至不显示静态 html 代码)
【解决方案2】:

如此处所述:https://stackoverflow.com/a/132197/9439763

只要在调用 session_start() 时,类声明/定义已经被 PHP 遇到或者可以被已经安装的自动加载器找到,就可以 [在 $_SESSION 中存储一个对象]。否则它将无法从会话存储中反序列化对象。

这是问题所在,我现在通过在会话调用之前包含类声明来解决它。

<?php
require_once './model/user.class.php';
session_start();
...

谢谢大家,特别感谢@Kodos Johnson 为我指路。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多