1

如何避免使用global访问 php 函数中的变量。我知道我可以将它们存储为常量,但我的变量包含 sql 并且很多。像这样...

$selectSql = 'select name from table where name = :thisName' and year = :thisYear;
$selectSqlBind = array(":thisName" => $thisName,":thisYear" => $thisYear);

这是我目前的做法

function myFunction (){
global $selectSql;
global $selectSqlBind;

$addUser = $conn->prepare($selectSql);
$addUser->execute($selectSqlBind);
//Other Stuff goes on
}

我也可以

function myFunction ($selectSql,$selectSqlBind){
$addUser = $conn->prepare($selectSql);
$addUser->execute($selectSqlBind);
//Other Stuff goes on
}

但我该怎么办

function myFunction (){
$addUser = $conn->prepare($selectSql);
$addUser->execute($selectSqlBind);
//Other Stuff goes on
}
4

2 回答 2

6

这就是你使用类的目的。例如,您可以轻松地扩展 MySQLi 类,保留所有功能,但添加您自己的功能。$this然后你会简单地通过而不是引用 MySQLi 语句$conn

<?php
    class DB extends mysqli {
        const PASSWORD_SALT = "abc123";
        public function AddUser($username, $password) {
            $addUser = $this->prepare("INSERT INTO `users` (`username`, `password`) VALUES (:username, :password)");
            $addUser->execute(array(":username" => $username, ":password" => md5(self::PASSWORD_SALT . $password)));
        }
    }
?>

如果您希望将两个逻辑分开,这也是很有可能的。

您可以通过引用$conn(来自类本身)的类变量来引用 DB 为$this->conn. 如果你想在类外使用这个变量,你必须private $conn变成public $conn然后你可以通过使用来引用它$db = new DB(); $db->conn->prepare(/*etc*/);

<?php
    class DB {
        const PASSWORD_SALT = "abc123";

        private $conn;

        public function __construct() {
            $this->conn = new mysqli("localhost", "foo", "bar", "foobar");
        }

        public function AddUser($username, $password) {
            $addUser = $this->conn->prepare("INSERT INTO `users` (`username`, `password`) VALUES (:username, :password)");
            $addUser->execute(array(":username" => $username, ":password" => md5(self::PASSWORD_SALT . $password)));
        }
    }
?>
于 2013-06-17T08:51:14.767 回答
1

您应该为此使用函数参数,因此请传递查询和绑定参数。

然而,数据库连接本身应该通过其他方法获得。要么好好看看一些 PHP 框架以及它们如何解决这个问题,要么阅读像Singleton、Registry Pattern 或 Dependency Injection Container 等设计模式。

于 2013-06-17T08:45:29.090 回答