在其他PHP脚本中引用变量时对global关键字的不一致需求

时间:2015-02-13 20:24:19

标签: php global require

我已经找到了答案,但仍无法解释我遇到的不一致。在这里...

我在PHP中编写一个简单的CMS,无法理解我如何直接从一个require调用中引用外部变量而不是另一个<?php if(!class_exists('Db_Conn')){ class Db_Conn{ var $pdo; public function __construct(){ $init_array = parse_ini_file('conf.ini'); try{ $this->pdo = new PDO('mysql:host=' . $init_array['host'] . ';dbname=' . $init_array['database'], $init_array['user'], $init_array['password']); } catch(PDOException $ex){ exit('Database Error!'); } } } $db_conn = new Db_Conn(); } ?> 调用 1.这是我的Db_Conn.php脚本。

<?php
require_once('class-db_conn.php');

if(!class_exists('Article_Manager')){
    class Article_Manager{
        public function fetch_article($article_id){
        global $db_conn;
        $query = $db_conn->pdo->prepare("SELECT * FROM articles WHERE article_id = ?");
        $query->bindValue(1, $article_id);
        $query->execute();
        return $query->fetch();
    }


    }
    $article_manager = new Article_Manager();
}
?>

2。这是我的简化article_manager脚本,它需要以前的数据库连接脚本。

<?php
require_once('includes/class-article_manager.php');

if (!isset($_GET['id'])){
    //no page set, back to index
    header('Location: index.php');
    exit();
} else {
    $id = $_GET['id'];
    $selected_article = $article_manager->fetch_article($id);
    //...some code left out
?>

在这个脚本中,我只能通过global关键字引用$ db_conn变量。这是有道理的,并且有很多关于避免全局变量的线程。

但这是我的困惑。这是需要article_manager的第三个脚本。

require

当我global article_manager脚本时,我不必使用全局。我可以简单地调用$ article_manager变量的函数而不需要全局引用。

有人可以告诉我这里发生了什么事吗?为什么我不必在第二个例子中使用{{1}}。我意识到不鼓励使用全局变量,所以我希望我可以使用另一种方法来保持我的代码封装。

1 个答案:

答案 0 :(得分:0)

Article_Manager需要使用global,因为它在$db_conn函数中调用fetch_article,并且具有自己的范围。

在您的第二个示例中,您只是在if语句中调用$article_manager,可能已经在全局/主要范围内。

一般的想法是,当你想要从一个函数中访问变量时,它们需要作为参数传递,或者在这种情况下是一个全局变量。