可以在 php 中的 class 中使用 $conn 全局变量吗?
Its possible to use $conn global var into class in php?
我试图在 class 文章中使用 $conn
变量。
我创建了一个 configuration.php 文件
cnfiguration.php
try {
$conn = new PDO('mysql:host='.$dbhost.';dbname='.$dbname, $user, $pass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
我同意,这是建立数据库连接的一种 classic 方式。
我试着用 $conn
变量进入 class 就像我说的那样。
class.article.php
class Article {
global $conn;
public $article_id;
function setArticle($article_id) {
$this->article_id = $article_id;
}
function getArticle($article_id){
$getArticlee = $conn->prepare("SELECT * FROM articles WHERE id = :id");
$getArticlee->bindParam(':id', $article_id, PDO::PARAM_INT);
$getArticlee->execute();
return $getArticlee;
}
}
我要求这两个文件都按下一个顺序执行文件 (show.article.php)
- configuration.php
- class.article.php
在所有这一切之后我得到了一个错误,正在执行 show.article.php。
当我删除
global $conn;
我没有任何错误。但是我没有连接到数据库。
我需要一些解决方案来将 $conn
变量包含到 class 中,因为这只是一个 class 需要数据库连接,我将有大约 10- 15 class 具有 pdo 连接。
无法在 class 中使用 $GLOBALS。
你可以对你的条件做一些改变...
cnfiguration.php
class Config{
function __Construct(){
try {
$conn = new PDO('mysql:host='.$dbhost.';dbname='.$dbname, $user, $pass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $conn;
}
catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
}
class.article.php
class Article {
protected $conn= new Config;
public $article_id;
function setArticle($article_id) {
$this->article_id = $article_id;
}
function getArticle($article_id){
$getArticlee = $this->conn->prepare("SELECT * FROM articles WHERE id = :id");
$getArticlee->bindParam(':id', $article_id, PDO::PARAM_INT);
$getArticlee->execute();
return $getArticlee;
}
}
您可以将global $conn
放在getArticle
方法中。
...
function getArticle($article_id){
global $conn; // not recommended
$getArticle = $conn->prepare("SELECT * FROM articles WHERE id = :id");
...
}
但是,不鼓励使用这种方法,因为现在您的 Article
class 对外部状态具有隐式依赖性,并且更难推理和测试。
更好的选择是将 PDO
对象传递给 Article
构造函数并将其保留为您的方法可以调用的私有 属性。
class Article {
private $conn;
public $article_id;
...
function __construct(\PDO $conn) {
$this->conn = $conn;
}
function getArticle($article_id){
$getArticlee = $this->conn->prepare("SELECT * FROM articles WHERE id = :id");
...
}
}
我试图在 class 文章中使用 $conn
变量。
我创建了一个 configuration.php 文件
cnfiguration.php
try {
$conn = new PDO('mysql:host='.$dbhost.';dbname='.$dbname, $user, $pass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
我同意,这是建立数据库连接的一种 classic 方式。
我试着用 $conn
变量进入 class 就像我说的那样。
class.article.php
class Article {
global $conn;
public $article_id;
function setArticle($article_id) {
$this->article_id = $article_id;
}
function getArticle($article_id){
$getArticlee = $conn->prepare("SELECT * FROM articles WHERE id = :id");
$getArticlee->bindParam(':id', $article_id, PDO::PARAM_INT);
$getArticlee->execute();
return $getArticlee;
}
}
我要求这两个文件都按下一个顺序执行文件 (show.article.php)
- configuration.php
- class.article.php
在所有这一切之后我得到了一个错误,正在执行 show.article.php。 当我删除
global $conn;
我没有任何错误。但是我没有连接到数据库。
我需要一些解决方案来将 $conn
变量包含到 class 中,因为这只是一个 class 需要数据库连接,我将有大约 10- 15 class 具有 pdo 连接。
无法在 class 中使用 $GLOBALS。 你可以对你的条件做一些改变...
cnfiguration.php
class Config{
function __Construct(){
try {
$conn = new PDO('mysql:host='.$dbhost.';dbname='.$dbname, $user, $pass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $conn;
}
catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
}
class.article.php
class Article {
protected $conn= new Config;
public $article_id;
function setArticle($article_id) {
$this->article_id = $article_id;
}
function getArticle($article_id){
$getArticlee = $this->conn->prepare("SELECT * FROM articles WHERE id = :id");
$getArticlee->bindParam(':id', $article_id, PDO::PARAM_INT);
$getArticlee->execute();
return $getArticlee;
}
}
您可以将global $conn
放在getArticle
方法中。
...
function getArticle($article_id){
global $conn; // not recommended
$getArticle = $conn->prepare("SELECT * FROM articles WHERE id = :id");
...
}
但是,不鼓励使用这种方法,因为现在您的 Article
class 对外部状态具有隐式依赖性,并且更难推理和测试。
更好的选择是将 PDO
对象传递给 Article
构造函数并将其保留为您的方法可以调用的私有 属性。
class Article {
private $conn;
public $article_id;
...
function __construct(\PDO $conn) {
$this->conn = $conn;
}
function getArticle($article_id){
$getArticlee = $this->conn->prepare("SELECT * FROM articles WHERE id = :id");
...
}
}