Howard Zoopaloopa
Howard Zoopaloopa

Reputation: 3822

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)

Diagram

enter image description here

Upvotes: 3

Views: 1631

Answers (4)

Gordon
Gordon

Reputation: 316979

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

// 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, e.g.

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

Upvotes: 3

daganh
daganh

Reputation: 421

<?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.

Upvotes: -1

Jacob
Jacob

Reputation: 8334

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

i.e.


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';

Upvotes: 1

therealjeffg
therealjeffg

Reputation: 5830

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.

Upvotes: 2

Related Questions