Re: __get() "feature"

From: Date: Thu, 11 Nov 2004 19:17:33 +0000
Subject: Re: __get() "feature"
References: 1  Groups: php.internals 
Request: Send a blank email to internals+get-13824@lists.php.net to get a copy of this message
Hello Jason, Thursday, November 11, 2004, 4:21:23 PM, you wrote: > I've ran into an issue using __get() and want to ascertain if this is > how it was intended to work or if it's a bug. The general notion of > what I'm attempting to accomplish using __get() is that a given object > will potentially contain other objects, but these contained objects > aren't known (or generated) until runtime. > For example, we'll instantiate a sales_order object and then, using its > has_a() method, add a customer object to it. To prevent cascades of > objects being instantiated, I'd plan to use lazy initialization - the > customer object won't be instantiated until the first time that it's > accessed through the customer class. The problem that I'm having is > that lazy initialization in PHP 5 is accomplished via the __get() > method which is called when an attribute (or contained class in this) > isn't available - it's passed the name of the property that wasn't > found and that's not enough information for me to return the attribute > of the contained object that was being accessed. Here's some quickly > written code with extra code stripped that'll demonstrate what I mean: > <? > class sales_order { > ... > public function has_a( $class ) { > $this->relationships[ $class ] = 'has_a'; > } > public function __get( $class ) { > if(array_key_exists( $class, $this->relationships )) { > if( $this->relationships[ $class ] == 'has_a') { > $this->$class = new $class( $this->id ); > return; Change the above line to: return $this->$class; > } > } > } > } > So if $attribute exists in the relationships array, it's instantiated > (and, yeah, I plan to move the contained objects into a declared array. > one thing at a time :) ) > $sales_order = new sales_order; > $sales_order->has_a( customer ); > print $sales_order->customer->name; > The last line fails, because __get is passed only 'customer' and not > 'customer->name' - I have no way of knowing what attribute of customer > was being accessed, so I can't return the requested data. Running this > code: > $sales_order = new sales_order; > $sales_order->has_a( customer ); > print $sales_order->customer->name; > print $sales_order->customer->name; > the fourth line works, because the customer object was instantiated > during line three (line three still fails to return a value). Is this > an issue with __get() or is this how it was intended to work? > -- > Jason N Perkins -- Best regards, Marcus mailto:helly@php.net

« previous php.internals (#13824) next »