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