php - 使用global在另一个类中使用类方法

时间:2017-01-26 14:06:05

标签: php class

我有2个班级

app/Classes/
    |
    |____ Helper/
    |        |
    |        |____ Helper.php   <- contain Helper Class
    |
    |____ User/
             |
             |____ User.php   <- contain User Class

我已经使用psr-4将类文件添加到自动加载器依赖项中。所以我可以命名为composer.json

{
    "autoload": {
        "psr-4": {
            "Classes\\": "app/Classes"
        }
    },
    "require": {
        "vlucas/valitron": "1.3.*",
        "ezimuel/php-secure-session": "dev-master"
    }
}

从终端转储composer.phar文件后。 在我的bootstrap.php中,我添加了自动加载器依赖项

//bootstrap.php
require_once APP_ROOT . '/vendor/autoload.php';

$helper = new Helper();
$user = new User();

现在我的User课程中我需要helper课程

namespace Classes\User;

Class User
{
    public function onlyAuthenticated()
    {
        if (!isset($_SESSION['user_id']) || empty($_SESSION['user_id'])) {

            global $helper;

            $helper->redirect('/index.php');
        }
    }
}

所有代码都正常运行但在global $helper;类中使用User是否安全?这是正确的方式吗?

1 个答案:

答案 0 :(得分:1)

初始化时,您需要将$helper声明为全局,以便稍后使用global关键字进行访问。

//bootstrap.php
...
global $helper;
$helper = new Helper();

那就是说,你最好不要这样做,至少对于那些我怀疑你Helper课程做的事情。

您可以在Helper中声明可以在没有全局变量的任何地方使用的静态函数。类似的东西:

class Helper{ //just some dummy code for demonstration purposes.
    public static function redirect($url){
        header("Location: " $url);
        exit();
    }
}

然后你可以这样称呼它:

Helper::redirect('/index.php');

请注意,这不那么冗长,而且我认为更清楚。它还具有不需要全局变量的优点。