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

时间:2011-04-14 04:57:51

标签: php

我找到了一个与购物车前端(网络浏览器端)合作的课程。

它非常简单,因为我向类发送了一个我埋在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文档的顶部实例化一次,并在每次调用此函数时使用该对象。

我是否完全错了?

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

Diagram

enter image description here

4 个答案:

答案 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)

你想要单身人士模式,请看这个答案:

Creating the Singleton design pattern in PHP5

这允许您在任何范围内获取您的类的实例,它也将是同一个实例。

答案 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)

仅此一点就在我脑海中引出了一些逻辑旗帜。不确定为什么要再次包装对象。