NYCPHP Meetup

NYPHP.org

[nycphp-talk] Working with recursive "single-referenced" methods and static variables

Phil Powell phillip.powell at adnet-sys.com
Tue Feb 24 18:41:51 EST 2004


Dan Cech wrote:

> Phil Powell wrote:
>
>> [CODE]
>> class DepartmentTree {
>>
>> function &buildTree($id) {
>>   static $html;
>>   if (!isset($html)) {
>>    // DO STUFF HERE TO $html
>>   }
>>   // DO MORE STUFF
>>   if ($condition_is_met) $this->buildTree($newID);
>>   $this->html = $html;
>>  }
>>
>> }
>> [/CODE]
>>
>> The above (and greatly paraphrased from the 100-line actual class) 
>> class and method, in its real form, totally works inasmuch as it 
>> successfully always creates an HTML hierarchial tree of departments 
>> mapped with child departments.  I have no problem with this.. as long 
>> as I only use the class once.
>>
>> However, there is a case where I need the entire contents of the 
>> departments table dumped out into a resultset, and to do that I 
>> figured I would just loop through a query of records that have no 
>> parent ID; each id in each row I seed into $tree->buildTree():
>>
>> [CODE]
>> for ($i = 0; $i < @sizeof($result); $i++) {
>> $tree->buildTree($result[$i]->id);
>> $this->deptArray += $tree->convert_to_array();
>> $tree->clearTreeHTML();
>> }
>> [/CODE]
>>
>> The "convert_to_array()" method will convert the contents of 
>> $this->html from HTML content to an array, keeping the original 
>> hierarchial order; the "clearTreeHTML()" method will set $this->html 
>> to NULL or "".
>>
>> Problem is, it does not do that, because apparently "static $html" 
>> keeps an instance of it running in the single-referenced instance of 
>> "buildTree" method. Based on how best I can explain my problem, and 
>> sorry I can't explain it any better w/o dumping the actual code line 
>> by line, how have you all figured out the best way to generate 
>> multiple, unique instances from a single-referenced method that uses 
>> a static local variable?
>
>
> If you are always going to use $tree as an object, and not call 
> DepartmentTree::buildTree (), then just remove the 'static $html;' and 
> '$this->html = $html;' lines and replace all instances of '$html' with 
> '$this->html'.
>
> This is the normal method for object oriented design, the only reason 
> to use static variables is if you are trying to do something tricky 
> like the singleton class.
>
> Your code would then be:
>
> class DepartmentTree {
>
>   var $html;
>
>   function &buildTree($id) {
>     if (!isset($this->html)) {
>      // DO STUFF HERE TO $this->html
>     }
>     // DO MORE STUFF
>     if ($condition_is_met) {
>       $this->buildTree($newID);
>     }
>   }
>
>   function clearTreeHTML () {
>     $this->html = NULL;
>   }
>
>   function convert_to_array () {
>     // PUT YOUR ARRAY CONVERSION HERE
>     return (array) $this->html;
>   }
> }
>
> Which will perform as expected.
>
> Dan
>
> _______________________________________________
> talk mailing list
> talk at lists.nyphp.org
> http://lists.nyphp.org/mailman/listinfo/talk
>
Thanx Dan, but that did not fix my problem.  I can only do ONE instance 
of buildTree() method regardless of it being "non-singleton" or "static" 
or anything.  If I call it once with a specific ID then all is fine; if 
I call with all IDs, then it only gets the first ID it finds and stops 
dead right there, even with a list of IDS.

Phil

-- 
Phil Powell
Web Developer
  ADNET Systems, Inc.
  11260 Roger Bacon Drive, Suite 403
  Reston, VA  20190-5203
Phone: (703) 709-7218 x107   Cell: (571) 437-4430   FAX: (703) 709-7219
EMail:  Phillip.Powell at adnet-sys.com      AOL IM: SOA Dude








More information about the talk mailing list