当前位置: 首页 > news >正文

做的比较好的购物网站/百度开户需要什么资质

做的比较好的购物网站,百度开户需要什么资质,青岛简易付网络技术有限公司,上海自助建站软件第一部分使用单件(Singletons)解决函数参数问题的一种方法就是采用单件(Singletons)来代替函数参数。单件是一类特殊的对象,它们只能实例化一次,而且含有一个静态方法来返回对象的接口。下面的例子演示了如何构建一个简单的单件:// Get insta…

第一部分

使用单件(Singletons)

解决函数参数问题的一种方法就是采用单件(Singletons)来代替函数参数。单件是一类特殊的对象,它们只能实例化一次,而且含有一个静态方法来返回对象的接口。下面的例子演示了如何构建一个简单的单件:

// Get instance of DBConnection

$db =& DBConnection::getInstance();

// Set user property on object

$db->user = 'sa';

// Set second variable (which points to the same instance)

$second =& DBConnection::getInstance();

// Should print 'sa'

echo $second->user;

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()方法来获取到这个对象,就好像下面这样:

function test() {

$db = DBConnection::getInstance();

// Do something with the object

}

?>

然而使用单件也存在一系列的不足。首先,如果我们如何在一个类需要全局化多个对象呢?因为我们使用单件,所以这个不可能的(正如它的名字是单件一样)。另外一个问题,单件不能使用个体测试来测试的,而且这也是完全不可能的,除非你引入所有的堆栈,而这显然是你不想看到的。这也是为什么单件不是我们理想中的解决方法的主要原因。

注册模式

让一些对象能够被我们代码中所有的组件使用到(译者注:全局化对象或者数据)的最好的方法就是使用一个中央容器对象,用它来包含我们所有的对象。通常这种容器对象被人们称为一个注册器。它非常的灵活而且也非常的简单。一个简单的注册器对象就如下所示:

Class Registry {

var $_objects = array();

function set($name, &$object) {

$this->_objects[$name] =& $object;

}

function &get($name) {

return $this->_objects[$name];

}

}

?>

使用注册器对象的第一步就是使用方法set()来注册一个对象:

$db = new DBConnection;

$settings = new Settings_XML;

$user = new User;

// Register objects

$registry =& new Registry;

$registry->set ('db', $db);

$registry->set ('settings', $settings);

$registry->set ('user', $user);

?>

现在我们的寄存器对象容纳了我们所有的对象,我们指需要把这个注册器对象传递给一个函数(而不是分别传递三个对象)。看下面的例子:

function test(&$registry) {

$db =& $registry->get('db');

$settings =& $registry->get('settings');

$user =& $registry->get('user');

// Do something with the objects

}

?>

注册器相比其他的方法来说,它的一个很大的改进就是当我们需要在我们的代码中新增加一个对象的时候,我们不再需要改变所有的东西(译者注:指程序中所有用到全局对象的代码),我们只需要在注册器里面新注册一个对象,然后它(译者注:新注册的对象)就立即可以在所有的组件中调用。

为了更加容易的使用注册器,我们把它的调用改成单件模式(译者注:不使用前面提到的函数传递)。因为在我们的程序中只需要使用一个注册器,所以单件模式使非常适合这种任务的。在注册器类里面增加一个新的方法,如下所示:

function &getInstance() {

static $me;

if (is_object($me) == true) {

return $me;

}

$me = new Registry;

return $me;

}

?>

这样它就可以作为一个单件来使用,比如:

$db = new DBConnection;

$settings = new Settings_XML;

$user = new User;

// Register objects

$registry =& Registry::getInstance();

$registry->set ('db', $db);

$registry->set ('settings', $settings);

$registry->set ('user', $user);

function test() {

$registry =& Registry::getInstance();

$db =& $registry->get('db');

$settings =& $registry->get('settings');

$user =& $registry->get('user');

// Do something with the objects

}

?>

正如你看到的,我们不需要把私有的东西都传递到一个函数,也不需要使用“global”关键字。所以注册器模式是这个问题的理想解决方案,而且它非常的灵活。

请求封装器

虽然我们的注册器已经使“global”关键字完全多余了,在我们的代码中还是存在一种类型的全局变量:超级全局变量,比如变量$_POST,$_GET。虽然这些变量都非常标准,而且在你使用中也不会出什么问题,但是在某些情况下,你可能同样需要使用注册器来封装它们。

一个简单的解决方法就是写一个类来提供获取这些变量的接口。这通常被称为“请求封装器”,下面是一个简单的例子:

Class Request {

var $_request = array();

function Request() {

// Get request variables

$this->_request = $_REQUEST;

}

function get($name) {

return $this->_request[$name];

}

}

?>

上面的例子是一个简单的演示,当然在请求封装器(request wrapper)里面你还可以做很多其他的事情(比如:自动过滤数据,提供默认值等等)。

下面的代码演示了如何调用一个请求封装器:

$request = new Request;

// Register object

$registry =& Registry::getInstance();

$registry->set ('request', &$request);

test();

function test() {

$registry =& Registry::getInstance();

$request =& $registry->get ('request');

// Print the 'name' querystring, normally it'd be $_GET['name']

echo htmlentities($request->get('name'));

}

?>

正如你看到的,现在我们不再依靠任何全局变量了,而且我们完全让这些函数远离了全局变量。

结论

在本文中,我们演示了如何从根本上移除代码中的全局变量,而相应的用合适的函数和变量来替代。注册模式是我最喜欢的设计模式之一,因为它是非常的灵活,而且它能够防止你的代码变得一塌糊涂。    另外,我推荐使用函数参数而不是单件模式来传递注册器对象。虽然使用单件更加轻松,但是它可能会在以后出现一些问题,而且使用函数参数来传递也更加容易被人理解。

http://www.lbrq.cn/news/969823.html

相关文章:

  • 学校门户网站建设的优势/网络推广引流是做什么工作
  • wordpress博客自媒体资讯主题/武汉seo和网络推广
  • 哪些网站做平面单页好看/搜索引擎公司排名
  • 中城投建设集团网站/手机网站seo免费软件
  • 服装商城的网站建设/网站关键词排名
  • 河南免费网站建设公司/百度一下你就知道下
  • 用手机制作动画的app/系统优化方法
  • wordpress插件webGL/seo关键词报价查询
  • 可以自己做装修效果图的网站/集合竞价口诀背熟6句
  • 中国物流网站/树枝seo
  • 网站设置在哪里找到/推广app是什么工作
  • 做门户网站的网络公司/天津放心站内优化seo
  • 网站制作的地方/百度建站多少钱
  • 团队网站怎么做/精准营销平台
  • 绥化市建设局网站/朔州网站seo
  • 网站第三方微信登陆怎么做的/安徽网络建站
  • 公司网站建设 阜阳/网站seo具体怎么做?
  • 网站建设和seo讲师要求/百度风云榜电视剧排行榜
  • 做网站放什么/地方网站建设
  • 哪些网站可以接工程做/seo搜索引擎优化知乎
  • WordPress的/seo接单
  • 网站建设公司上海做网站公司排名/网址域名注册信息查询
  • 最专业网站建设公司哪家好/爱站网长尾挖掘工具
  • dreamweaver制作网站教程/seo基础知识
  • 做公众号推送的网站/社群营销活动策划方案
  • 网站 成功案例/成都seo优化
  • 建设建设网站的/广告公司接单软件
  • 做博物馆网站最重要性/东莞百度快速排名优化
  • 做ppt的网站兼职/公司seo是什么职位
  • wordpress 浏览次数/八宿县网站seo优化排名
  • 使用YOLOv11实现水果类别检测:从数据到模型训练的全过程
  • C# --- 单例类错误初始化 + 没有释放资源导致线程泄漏
  • 深入掌握Python正则表达式:re库全面指南与实战应用
  • GitHub Pages+Jekyll 静态网站搭建(二)
  • 死锁问题以及读写锁和自旋锁介绍【Linux操作系统】
  • Jfinal+SQLite java工具类复制mysql表数据到 *.sqlite