简体   繁体   中英

Avoiding Multiple Class Instantiations of Single Class PHP?

I've got a class I wrote to work with the front end (web browser side) of a shopping cart.

It's fairly simple in that I send the class a product ID that I bury in the URL and then query a database populating the classes variables for use in retrieving the data through some public methods.

To interface with my actual physical web page I have a file I call viewFunctions.php. Wherein I instantiate my class called ItemViewPackage():

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

So, I have shoppingcartpage.php (the physical url) that requires the file viewFunctions.php that loads my class ItemViewPackage().

The output page shoppingcartpage.php calls functions like get_item_info('title') or get_item_info('price') which in the viewFunctions.php file is made like so:

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

Now, right off the bat, this isn't working because, I assume, $viewObject is not global. So I make $viewObject global like so:

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

But, this doesn't work either, I still get an error for " Call to a member function get_info() on a non-object "

Now, the only thing that works is:

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

But, I don't want to re-instantiate my object every time I make a call to this function (which is several times for several bits of information). I'd rather instantiate once at the top of my viewFunctions.php doc and use that object every time I call this function.

Am I going about this completely wrong?

Thanks in advance. DIAGRAM (hopefully it helps visualize)

图

在此输入图像描述

What for do you need viewFunctions.php anyway? It's only wrapping the ItemViewPackage . Remove that and use the ItemViewPackage directly, eg

// 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>

Then you dont have to bother with globals or Singletons . If you dont want a second instance, dont instantiate a second one. It's simple as that in PHP. If there is anything in viewFunctions.php that modifies the output of the $viewObject instance, consider making that into a class and have it aggregate the $viewObject into a property, eg

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

then you can access the $viewObject from within the Helper object with $this->propertyName .

As for reducing load to the database: this is a solved problem. Consider using a cache.

You want the singleton pattern, please see this answer:

Creating the Singleton design pattern in PHP5

This allows you to get an instance of your class in any scope, and it will also be the same instance.

What scope is the $viewObject created in?

Note: that even though it appears to be in the global scope because it is not in a function within the shown file, if the file is included from within a function it will be in that scope...

ie


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';
<?php
require_once(dirname(__FILE__) . '/ItemViewPackage.php');

$viewObject = new ItemViewPackage($_GET['page']);

function get_info($type){
    global $viewObject;

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

This should work from viewFunctions.php and any file that includes it such as shopping.php. So from shopping.php we can do either:

echo get_info($type);

or

echo $viewObject->get_info($type)

This alone raises some logical flags in my head. Not sure why you want to wrap the object again.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM