微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

避免单类PHP的多类实例化?

我已经写了一个与购物车的前端(Web浏览器端)一起工作的课程.

这很简单,因为我向类发送了一个我埋在URL中的产品ID,然后查询填充类变量数据库,以便通过一些公共方法检索数据.

为了与我的实际物理网页交互,我有一个文件,我称之为viewFunctions.PHP.其中我实例化我的名为ItemViewPackage()的类:

<?PHP
require_once(dirname(__FILE__) . '/ItemViewPackage.PHP');
$viewObject = new ItemViewPackage($_GET['page']);

所以,我有shoppingcartpage.PHP(物理网址),它需要加载我的类ItemViewPackage()的文件viewFunctions.PHP.

输出页面shoppingcartpage.PHP调用get_item_info(‘title’)或get_item_info(‘price’)等函数,它们在viewFunctions.PHP文件调用如下:

function get_info($type){
    echo $viewObject->get_info($type);
}

现在,关闭,这是行不通的,因为我认为$viewObject不是全局的.所以我像这样使$viewObject全局:

function get_info($type){
    global $viewObject;
    echo $viewObject->get_info($type);
} 

但是,这也不起作用,我仍然在“非对象上调用成员函数get_info()”时出错

现在,唯一有效的是:

function get_info($type){
    $viewObject = new ItemViewPackage($_GET['page']);
    echo $viewObject->get_info($type);
}

但是,我不希望每次调用函数时都重新实例化我的对象(对于几个信息位,这几次都是这样).我宁愿在viewFunctions.PHP文档的顶部实例化一次,并在每次调用函数时使用该对象.

我完全错了吗?

提前致谢.
图(希望它有助于可视化)

解决方法:

无论如何你还需要viewFunctions.PHP吗?它只包装ItemViewPackage.删除它并直接使用ItemViewPackage,例如

// shopping.PHP
include_once 'ItemViewPackage.PHP';
$viewObject = new ItemViewPackage($_GET['page']);
<div><?PHP echo $viewObject->get_info('title'); ?></div>
<div><?PHP echo $viewObject->get_info('price'); ?></div>

然后你不必打扰globals or Singletons.如果你不想要第二个实例,不要实例化第二个实例. It’s simple as that in PHP.如果viewFunctions.PHP中有任何修改$viewObject实例输出内容,请考虑将其作为一个类并让它将$viewObject聚合到一个属性中,例如:

// viewFunctions.PHP
include_once 'ItemViewPackage.PHP';
$viewObject = new ItemViewPackage($_GET['page']);
$helper = new ViewObjectHelper($viewObject);

然后你可以使用$this-> propertyName从Helper对象中访问$viewObject.

至于减少数据库负载:这是一个解决的问题. Consider using a cache.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐