php global vars,它们可以设置在另一个函数中,以便你可以调用它们吗?

时间:2014-05-17 19:24:51

标签: php function globals

我已经开始在函数中使用我需要的“全局”变量。既然我使用PDO,我通常需要将pdo连接称为函数中的全局变量。但是我经常使用一些我经常使用的变量而且我想知道,我能以某种方式将所有全局变量设置在一个单独的函数中并从另一个需要全局变量的函数中调用该函数吗?或者我需要使用像include这样的东西吗?

global $pdo,$foo,$bar;

我知道有一种称为注册全局的东西,但是afaik并不是你想要的道路。当然我可以在每个函数中调用我的全局变量..只是想我可以从另一个函数调用它们或者某些东西会更容易。当然,如果我调用一组全局变量并且我不使用所有这些函数,它在某些函数中会有点无关紧要。对此有何想法或意见?哪种方式更可取?

最好的问候

2 个答案:

答案 0 :(得分:2)

我不知道为什么不使用全球变量(阅读它)。但只需在任何需要的地方访问$GLOBALS数组。您可以设置和检索它们:

function test() {
    echo $GLOBALS['var']; //1
    $GLOBALS['var'] = 2;
    $GLOBALS['new_var'] = 'yes';
}

$var = 1;
test();
echo $var; //2
echo $new_var; //yes

答案 1 :(得分:2)

更新
我刚刚意识到我并没有真正回答你的实际问题:虽然技术上可以在函数中设置/添加/重新分配全局变量, 那样,疯狂就是谎言 想象一下以下场景:要使用一组与db相关的函数,可以调用这个init_db函数,该函数设置所有必需的全局变量。好极了,你可能在想。但是在调用此函数和调用其他函数的第一个函数之间,任何事情都可能发生在那些精心准备的全局变量上。

因此,您最终将使用这些函数中的每一个来检查它们所需的全局变量,如果其中一个不具有对它们有意义的值,您可能会再次调用init_db 。一遍又一遍地解决覆盖应用程序重要组件的代码。有效地隐藏错误,甚至没有提到代码注入攻击! 此外,想想这句话:

  

调试是第一次编写代码的两倍。因此,如果您尽可能巧妙地编写代码,那么根据定义,您不够聪明,无法对其进行调试。 - Brian Kernighan

这里不到15行代码。请记住,一个真正的应用程序很容易包含一千多倍的代码,分布在多个文件中,并回答我:你能否在任何给定的时间预测任何一个变量将保留什么?

function initGlobals()
{//not possible:
    global $newGlobal;
    $newGlobal = 123;
}
function foobar()
{
    global $newGlobal;
    initGlobals();//?? what will happen to $newGlobal?
}
initGlobals();
$newGlobal = 'I changed the value';
foobar();

我认为很明显,使用全局变量可能是最好的方法来确保,如果代码中有错误,那么负责解决问题的人最终将会陷入困境。庇护...
如果你不喜欢把你的余生都放在一个带衬垫的牢房里,把头撞在墙上,喃喃自语“他们到处都是,但他们的价值观是我想要的,怎么可能他们改变了?他们怎么能这样对我?“ ......简而言之:

如果你重视理智,你或其他人的理智,那么请不要使用全局


首先:如果你有需要设置某个变量的函数(就像在你的情况下是一个全局$pdo变量),那么调用者传递PDO会不会更有意义实例到你的功能首先?这样,您的代码不依赖于存在名为$pdo的全局变量PDO实例:

function doStuff(PDO $pdo, $foo, $bar)
{
    //do stuff
}

但实际上,这听起来像是在你的代码中,某些函数开始变得复杂:你有一系列与DB相关的函数,它们都需要相同的连接(由PDO对象表示)。 /> 对我来说,这听起来像是一个很好的用例:

class MyDBClass
{
    protected $pdo = null;//here's the connection, hidden from the outside, accessible to all methods in this class
    public function __construct(PDO $db)|
    {//pass pdo instance once, and store it on the instance
        $this->pdo = $db;
    }
    public function doStuff($foo, $bar)
    {//all methods can now use $this->pdo freely:
        $stmt = $this->pdo->prepare('SELECT * FROM tableX WHERE foo = :foo AND bar = :bar');
        $stmt->execute(
            array(
                ':foo' => $foo,
                ':bar' => $bar
            )
        );
        return $stmt->fetchAll(PDO::FETCH_OBJ);
    }
    //add more methods here
}
//use like this:
$db = new MyDBClass(new PDO());//create PDO instance
$db->doStuff('foo value', 'bar');