Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:19939 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 55823 invoked by uid 1010); 10 Nov 2005 00:36:09 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 55808 invoked from network); 10 Nov 2005 00:36:09 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 10 Nov 2005 00:36:09 -0000 X-Host-Fingerprint: 80.74.107.235 mail.zend.com Linux 2.5 (sometimes 2.4) (4) Received: from ([80.74.107.235:41239] helo=mail.zend.com) by pb1.pair.com (ecelerity 2.0 beta r(6323M)) with SMTP id 31/B6-28724-8F592734 for ; Wed, 09 Nov 2005 19:36:09 -0500 Received: (qmail 32685 invoked from network); 10 Nov 2005 00:36:04 -0000 Received: from localhost (HELO ?127.0.0.1?) (127.0.0.1) by localhost with SMTP; 10 Nov 2005 00:36:04 -0000 Message-ID: <437295EC.4030406@zend.com> Date: Wed, 09 Nov 2005 16:35:56 -0800 User-Agent: Mozilla Thunderbird 1.0.5 (Windows/20050711) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Andi Gutmans CC: "Thies C. Arntzen" , internals@lists.php.net References: <81D9588B-8984-432C-91CB-9ECE28F573F0@thieso.net> <6.2.3.4.2.20051109141302.037967b0@localhost> <6.2.3.4.2.20051109150622.0379d0a0@localhost> In-Reply-To: <6.2.3.4.2.20051109150622.0379d0a0@localhost> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [PHP-DEV] object-overloading: why not allow recursive calls? (5.1) hey, in zend_object_handlers.c function zend_std_read_property we protect against calling the __get function of an object if we're already in a __get() function. (lo From: mike.n@zend.com (Mike Naberezny) The problem does not cross class boundaries. However, here are some test cases to better illustrate the question: hello1; case 'hello3': return $this->__get('hello1'); case 'hello4': return $this->testFunction(); } } function testFunction() { return $this->hello1; } } $t = new Test(); // CASE 1: Code from outside class scope gets an undefined property // which is proxied by __get(). This is the everyday usage. // string(5) "there" var_dump($t->hello1); // CASE 2: Code inside __get() gets an undefined property, // which generates a notice instead of being proxied by __get(). // NULL var_dump($t->hello2); // CASE 3: Code inside __get() calls __get() // string(5) "there" var_dump($t->hello3); // CASE 4: Code inside __get gets an undefined property through a // function, which generates a notice just like Case 2. // NULL var_dump($t->hello4); // CASE 5: Code from inside a class function gets an undefined // property which is proxied by __get() // string(5) "there" var_dump($t->testFunction()); ?> I agree with Thies that this should be changed, on the basis that the behavior is inconsistent and we don't protect against recursion otherwise. Every test case should return the string. The above examples were tested against 5.0.5 and the latest 5.1 with the same results. Mike Andi Gutmans wrote: > Thies, > > I think I might be wrong in my analysis. Seems like the problem is worse > than what I thought as it seems to cross boundaries between classes. > We'll look into it more. > > Andi > > At 02:15 PM 11/9/2005, Andi Gutmans wrote: > >> This is intentional and I think it makes it much more fool-proof for >> developers. Adding recursion protection can be very expensive and >> complicated, and it doesn't seem to make sense here. The idea is that >> once you're in the __get() method, you know exactly how your >> properties are mapped and can do the right thing. It's only this one >> method where you have your mapping anyway, not an entirely different >> place. >> >> Andi >> >> At 12:35 AM 11/4/2005, Thies C. Arntzen wrote: >> >>> hey, >>> >>> in zend_object_handlers.c function zend_std_read_property we protect >>> against calling the __get function of an object if we're already in a >>> __get() function. (look for zobj->in_get) in that function. >>> >>> i don't think we should be doing this. >>> >>> simplyfied example: >>> >> class test { >>> function __get($offset) { >>> echo "__get($offset)\n"; >>> switch ($offset) { >>> case 'name': return "name"; >>> case 'length': return strlen($this->name); >>> } >>> } >>> } >>> >>> $a = new test; >>> var_dump($a->length); >>> ?> >>> >>> outputs: >>> __get(length) >>> int(0) >>> >>> but should say: >>> __get(length) >>> __get(name) >>> int(4) >>> >>> i think recursive gets are highly useful and should be allowed. if we >>> really want to protect against recursion (here) we have two real >>> options: -a- protect against __get(ing) the same property more than >>> once in the same call-chain (mucho work), or -b- (preferred) have >>> some global infinite recursion protection in the engine (needs to be >>> done somewhen anyhow, but not now). >>> >>> so, in one sentence: as we don't protect against recustion elsewhere, >>> can we please remove this unneded roadblock? >>> >>> opinions? >>> -thies >>> >>> -- >>> PHP Internals - PHP Runtime Development Mailing List >>> To unsubscribe, visit: http://www.php.net/unsub.php >> >> >> -- >> PHP Internals - PHP Runtime Development Mailing List >> To unsubscribe, visit: http://www.php.net/unsub.php > > -- Mike Naberezny Senior PHP Developer Zend Technologies, The PHP Company 19200 Stevens Creek Blvd, Suite 100 Cupertino, CA 95014 Tel: 408-342-8891 Fax: 408-253-8801 mike.n@zend.com