簡體   English   中英

PHP避免在函數內部使用全局

[英]PHP Avoid using global inside a function

我如何避免使用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
}

這就是您要使用的類。 例如,您可以輕松地擴展MySQLi類,保留所有功能,但添加自己的功能。 然后,您只需通過$this而不是$conn來引用MySQLi語句:

<?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 (從類本身)引用$this->conn來引用數據庫。 如果要在類外使用此變量,則必須將private $conn轉換為public $conn ,然后可以使用$db = new DB(); $db->conn->prepare(/*etc*/);來引用它$db = new DB(); $db->conn->prepare(/*etc*/); $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)));
        }
    }
?>

為此,您應該使用函數參數,因此請傳遞查詢和綁定參數。

但是,數據庫連接本身應通過其他方法獲得。 要么仔細研究一些PHP框架以及它們如何解決此問題,要么繼續閱讀Singleton ,Registry Pattern或Dependency Injection Container等設計模式

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM