我已经写了一个与购物车的前端(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.