我找到了一个与购物车前端(网络浏览器端)合作的课程。
它非常简单,因为我向类发送了一个我埋在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(&#39; title&#39;)或get_item_info(&#39; price&#39;)等函数,这些函数在viewFunctions.php文件中调用如下:
function get_info($type){
echo $viewObject->get_info($type);
}
现在,关键是,这不起作用,因为我认为$ viewObject不是全局的。所以我将$ viewObject全局化为:
function get_info($type){
global $viewObject;
echo $viewObject->get_info($type);
}
但是,这也不起作用,我仍然会收到错误#34; Call to a member function get_info() on a non-object
&#34;
现在,唯一有效的是:
function get_info($type){
$viewObject = new ItemViewPackage($_GET['page']);
echo $viewObject->get_info($type);
}
但是,每次我调用这个函数时,我都不想重新实例化我的对象(对于几个信息位来说,这是几次)。我宁愿在viewFunctions.php文档的顶部实例化一次,并在每次调用此函数时使用该对象。
我是否完全错了?
提前致谢。 图(希望它有助于可视化)
答案 0 :(得分:3)
您还需要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
聚合到属性中,例如< / p>
// viewFunctions.php
include_once 'ItemViewPackage.php';
$viewObject = new ItemViewPackage($_GET['page']);
$helper = new ViewObjectHelper($viewObject);
然后您可以使用$viewObject
从Helper对象中访问$this->propertyName
。
至于减少数据库的负载:这是一个已解决的问题。 Consider using a cache.
答案 1 :(得分:2)
答案 2 :(得分:1)
在$
中创建$ viewObject的范围注意:即使它似乎在全局范围内,因为它不在显示的文件中的函数中,如果文件包含在函数中,它将在该范围内...
即
<强> file1.php 强>
include 'file2.php';
function includefile($file) {
include $file;
}
includefile('file3.php');
<强> file2.php 强>
$global = 'this is global';
<强> file3.php 强>
$notglobal = 'this is not';
答案 3 :(得分:-1)
<?php
require_once(dirname(__FILE__) . '/ItemViewPackage.php');
$viewObject = new ItemViewPackage($_GET['page']);
function get_info($type){
global $viewObject;
echo $viewObject->get_info($type);
}
这应该来自viewFunctions.php以及包含它的任何文件,例如shopping.php。所以从shopping.php我们可以做到:
echo get_info($type);
或
echo $viewObject->get_info($type)
仅此一点就在我脑海中引出了一些逻辑旗帜。不确定为什么要再次包装对象。