佳木斯市建设局网站,网络游戏名,iis6网站域名,做企业网站支付功能但是你可以使用你自己的全局变量。使用关键字“global”你就可以把全局数据导入到一个函数的局部范围内。如果你不明白“变量使用范围”#xff0c;请你自己参考PHP手册上的相关说明。下面是一个使用“global”关键字的演示例子#xff1a;代码如下:正如你在上面的例子中看到…但是你可以使用你自己的全局变量。使用关键字“global”你就可以把全局数据导入到一个函数的局部范围内。如果你不明白“变量使用范围”请你自己参考PHP手册上的相关说明。下面是一个使用“global”关键字的演示例子代码如下:正如你在上面的例子中看到的一样“global”关键字是用来导入全局变量的。看起来它工作的很好而且很简单那么为什么我们还要担心使用“global”关键字来定义全局数据呢下面是三个很好的理由1、代码重用几乎是不可能的。如果一个函数依赖于全局变量那么想在不同的环境中使用这个函数几乎是不可能的。另外一个问题就是你不能提取出这个函数然后在其他的代码中使用。2、调试并解决问题是非常困难的。跟踪一个全局变量比跟踪一个非全局变量困难的多。一个全局变量可能会在一些不明显的包含文件中被重新定义即使你有一个非常好的程序编辑器(或者IDE)来帮助你你也得花了几个小时才能发现这个问题所在。3、理解这些代码将是非常难的事情。你很难弄清楚一个全局变量是从哪里来得它是用来做什么的。在开发的过程中你可能会知道知道每一个全局变量但大概一年之后你可能会忘记其中至少一般的全局变量这个时候你会为自己使用那么多全局变量而懊悔不已。那么如果我们不使用全局变量我们该使用什么呢下面让我们看看一些解决方案。使用函数参数停止使用全局变量的一种方法就是简单的把变量作为函数的参数传递过去如同下面所示代码如下:如果你仅仅只需要传递一个全局变量那么这是一种非常优秀甚至可以说是杰出的解决方案但是如果你要传递很多个值那该怎么办呢比如说假如我们要使用一个数据库类一个程序设置类和一个用户类。在我们代码中这三个类在所有组件中都要用到所以必须传递给每一个组件。如果我们使用函数参数的方法我们不得不这样代码如下:显然这是不值得的而且一旦我们有新的对象需要加入我们不得不为每一个函数增加多一个函数参数。因此我们需要用采用另外一种方式来解决。使用单件(Singletons)解决函数参数问题的一种方法就是采用单件(Singletons)来代替函数参数。单件是一类特殊的对象它们只能实例化一次而且含有一个静态方法来返回对象的接口。下面的例子演示了如何构建一个简单的单件代码如下:user sa;// Set second variable (which points to the same instance)$second DBConnection::getInstance();// Should print saecho $seconduser;Class DBConnection { var $user; function getInstance() { static $me; if (is_object($me) true) { return $me; } $me new DBConnection; return $me; } function connect() { // TODO } function query() { // TODO }}?上面例子中最重要的部分是函数getInstance()。这个函数通过使用一个静态变量$me来返回这个类的实例从而确保了只有一个DBConnection类的实例。使用单件的好处就是我们不需要明确的传递一个对象而是简单的使用getInstance()方法来获取到这个对象就好像下面这样代码如下:然而使用单件也存在一系列的不足。首先如果我们如何在一个类需要全局化多个对象呢因为我们使用单件所以这个不可能的(正如它的名字是单件一样)。另外一个问题单件不能使用个体测试来测试的而且这也是完全不可能的除非你引入所有的堆栈而这显然是你不想看到的。这也是为什么单件不是我们理想中的解决方法的主要原因。注册模式让一些对象能够被我们代码中所有的组件使用到(译者注全局化对象或者数据)的最好的方法就是使用一个中央容器对象用它来包含我们所有的对象。通常这种容器对象被人们称为一个注册器。它非常的灵活而且也非常的简单。一个简单的注册器对象就如下所示代码如下:_objects[$name] $object; } function get($name) { return $this_objects[$name]; }}?使用注册器对象的第一步就是使用方法set()来注册一个对象代码如下:set (db, $db);$registryset (settings, $settings);$registryset (user, $user);?现在我们的寄存器对象容纳了我们所有的对象我们指需要把这个注册器对象传递给一个函数(而不是分别传递三个对象)。看下面的例子代码如下:get(db); $settings $registryget(settings); $user $registryget(user); // Do something with the objects}?注册器相比其他的方法来说它的一个很大的改进就是当我们需要在我们的代码中新增加一个对象的时候我们不再需要改变所有的东西(译者注指程序中所有用到全局对象的代码)我们只需要在注册器里面新注册一个对象然后它(译者注新注册的对象)就立即可以在所有的组件中调用。为了更加容易的使用注册器我们把它的调用改成单件模式(译者注不使用前面提到的函数传递)。因为在我们的程序中只需要使用一个注册器所以单件模式使非常适合这种任务的。在注册器类里面增加一个新的方法如下所示代码如下:这样它就可以作为一个单件来使用比如代码如下:set (db, $db);$registryset (settings, $settings);$registryset (user, $user);function test() { $registry Registry::getInstance(); $db $registryget(db); $settings $registryget(settings); $user $registryget(user); // Do something with the objects}?正如你看到的我们不需要把私有的东西都传递到一个函数也不需要使用“global”关键字。所以注册器模式是这个问题的理想解决方案而且它非常的灵活。请求封装器虽然我们的注册器已经使“global”关键字完全多余了在我们的代码中还是存在一种类型的全局变量超级全局变量比如变量$_POST,$_GET。虽然这些变量都非常标准而且在你使用中也不会出什么问题但是在某些情况下你可能同样需要使用注册器来封装它们。一个简单的解决方法就是写一个类来提供获取这些变量的接口。这通常被称为“请求封装器”下面是一个简单的例子代码如下:_request $_REQUEST; } function get($name) { return $this_request[$name]; }}?上面的例子是一个简单的演示当然在请求封装器(request wrapper)里面你还可以做很多其他的事情(比如自动过滤数据提供默认值等等)。下面的代码演示了如何调用一个请求封装器代码如下:set (request, $request);test();function test() { $registry Registry::getInstance(); $request $registryget (request); // Print the name querystring, normally itd be $_GET[name] echo htmlentities($requestget(name));}?正如你看到的现在我们不再依靠任何全局变量了而且我们完全让这些函数远离了全局变量。结论在本文中我们演示了如何从根本上移除代码中的全局变量而相应的用合适的函数和变量来替代。注册模式是我最喜欢的设计模式之一因为它是非常的灵活而且它能够防止你的代码变得一塌糊涂。另外我推荐使用函数参数而不是单件模式来传递注册器对象。虽然使用单件更加轻松但是它可能会在以后出现一些问题而且使用函数参数来传递也更加容易被人理解。