【问题标题】:inconsistent need for global keyword when referencing variables in other PHP scripts在其他 PHP 脚本中引用变量时对 global 关键字的需求不一致
【发布时间】:2015-04-15 00:00:34
【问题描述】:

我一直在寻找答案,但仍然无法解释我遇到的不一致。来了……

我正在用 PHP 编写一个简单的 CMS,但无法理解如何从一个 require 调用而不是另一个调用中直接引用外部变量 1. 这是我的 Db_Conn.php 脚本。

<?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();
}   
?>

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

<?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();
}
?>

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

但这是我的困惑。这是需要 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
?>

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

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

【问题讨论】:

  • 也许这可以解决问题:$GLOBALS += get_defined_vars();您可以在其中将所有定义的变量附加到 $GLOBALS 并在任何您想要的地方访问它们。您只需在需要这些变量的任何脚本上调用它。

标签: php global require


【解决方案1】:

Article_Manager 需要使用global,因为它在具有自己作用域的fetch_article 函数中调用$db_conn

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

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

【讨论】:

  • 谢谢,Chad,作为一个菜鸟,我知道有机会问一个愚蠢的问题。我一直盯着代码看不出来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
相关资源
最近更新 更多