Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:13824 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 74372 invoked by uid 1010); 11 Nov 2004 19:17:20 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 74333 invoked from network); 11 Nov 2004 19:17:20 -0000 Received: from unknown (HELO jan.prima.de) (83.97.50.139) by pb1.pair.com with SMTP; 11 Nov 2004 19:17:20 -0000 Received: from BAUMBART (p508EB096.dip.t-dialin.net [::ffff:80.142.176.150]) (IDENT: HydraIRC, AUTH: LOGIN tobi) by jan.prima.de with esmtp; Thu, 11 Nov 2004 19:15:24 +0000 Date: Thu, 11 Nov 2004 20:17:33 +0100 Reply-To: Marcus Boerger X-Priority: 3 (Normal) Message-ID: <535857716.20041111201733@marcus-boerger.de> To: Jason Perkins CC: internals@lists.php.net In-Reply-To: <5917D4B9-33F5-11D9-8B36-000D932DF2B4@sneer.org> References: <5917D4B9-33F5-11D9-8B36-000D932DF2B4@sneer.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Subject: Re: [PHP-DEV] __get() "feature" From: helly@php.net (Marcus Boerger) 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