在其他 PHP 脚本中引用变量时对 global 关键字的需求不一致
inconsistent need for global keyword when referencing variables in other PHP scripts
我一直在寻找这个问题的答案,但仍然无法解释我遇到的不一致问题。来了...
我正在 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
。我意识到不鼓励使用全局变量,所以我希望我可以使用另一种方法来封装我的代码。
Article_Manager
需要使用 global
因为它在 fetch_article
函数中调用 $db_conn
,它有自己的作用域。
在您的第二个示例中,您只是在 if 语句中调用 $article_manager
,大概已经在全局/主范围内。
一般的想法是,当您想从函数内部访问变量时,它们要么需要作为参数传入,要么在本例中为全局变量。
我一直在寻找这个问题的答案,但仍然无法解释我遇到的不一致问题。来了...
我正在 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
。我意识到不鼓励使用全局变量,所以我希望我可以使用另一种方法来封装我的代码。
Article_Manager
需要使用 global
因为它在 fetch_article
函数中调用 $db_conn
,它有自己的作用域。
在您的第二个示例中,您只是在 if 语句中调用 $article_manager
,大概已经在全局/主范围内。
一般的想法是,当您想从函数内部访问变量时,它们要么需要作为参数传入,要么在本例中为全局变量。