You are here: Re: [PHP] question about compositing objects « PHP « IT news, forums, messages
Re: [PHP] question about compositing objects

Posted by "Richard Lynch" on 01/14/06 01:09

On Thu, January 12, 2006 4:13 pm, jonathan wrote:
> I have a class which creates another class within it such as:
>
> class Loc{
>
> public function outputInfo()
> {
> $map=new Map();
>
> $map->setKey();
>
>
> }
>
> }
>
> In my main page can I access the $map object like this:
>
> $loc=new Loc();
>
> $loc->map->publicMapFunction();
>
> I thought I would be able to but it doesn't seem like it.

As others have noted, you probably want to initialize $loc->map to
$map inside the function.

However, you should also consider what happens if...

<?php
//Assume classes are defined, but NOTHING else.
$loc = new Loc();
$loc->map->publicMapFunction();
?>

At this point, $loc->map has *** NO VALUE *** because you didn't call
outputInfo() yet.

So you will get a NOTICE (if you have E_ALL cranked up, as you should,
though it's not the default) and then an ERROR about calling a member
function on a non-object, and your whole project/script/page comes
crashing down around your ears.

You should *PROBABLY* design your code in such a way that this can
NEVER happen.

If this is a throw-away one-day hack, then ignore me. If this code is
expected to live longer than a week, pay attention :-)

One solution is to initialize the ->map in the constructor, so that if
you get a valid Loc object, you have a valid map object.

/* PHP4 */
class Loc(){
var $map = null;
function Loc(){
$this->map = new Map();
}
}

/* PHP5 */
class Loc(){
var $map = null;
function __construct(){
$this->map = new Map();
}
}

/* Portable? for both 4&5 ??? */
class Loc(){
var $map = null;
function init(){
$this->map = new Map();
}

function Loc(){ $this->init();}
function __construct(){ $this->init();}
}

Disclaimer: I never use objects at all in PHP, so am not 100% certain
of this last example...

If you simply cannot make a valid Map() object in the constructor,
because there are other complex dependencies that cannot be resolved,
you should probably make the $loc->map attribute a PRIVATE variable,
and create a map() function to read that, so that you have to do:

$map = $loc->map();
$map->privateMapFunction();

The reason for the extra layer of the function is that you can include
error-checking in the Loc::map() function to:
1) Error out if $loc->map is NULL/invalid
2) Automagically create a Map() if $loc->map is NULL/invalid
3) Control the number of Map objects created, so you only have *ONE*
per Loc, and don't waste RAM by endlessly re-creating Map objects
..
..
..

The Loc::map() function will create a "check-point" for you to write
"gate-keeper" code to ensure that everything is kosher to to provide a
more robust body of code.

The down-side is, more code to maintain and an additional layer of
complexity for the end user.

So, if you CAN make a Map() in the Loc constructor, that's
easier/simpler.

If not, a public Map function for a private attribute is clean.

Just tossing Map objects into the map attribute willy-nilly is fine
for quickie hacks, but little else.

The fact that there is a *TON* of badly-written code out there, all
over the 'net, and in steady heavy use today, that does exactly what
I'm telling you not to do, does not invalidate this post. :-)

--
Like Music?
http://l-i-e.com/artists.htm

 

Navigation:

[Reply to this message]


Удаленная работа для программистов  •  Как заработать на Google AdSense  •  England, UK  •  статьи на английском  •  PHP MySQL CMS Apache Oscommerce  •  Online Business Knowledge Base  •  DVD MP3 AVI MP4 players codecs conversion help
Home  •  Search  •  Site Map  •  Set as Homepage  •  Add to Favourites

Copyright © 2005-2006 Powered by Custom PHP Programming

Сайт изготовлен в Студии Валентина Петручека
изготовление и поддержка веб-сайтов, разработка программного обеспечения, поисковая оптимизация