RE: [PHP-DEV] __init magic method
> -Original Message- > From: Pete Boere [mailto:p...@the-echoplex.net] > Sent: 22 January 2013 12:30 > To: internals@lists.php.net > Subject: [PHP-DEV] __init magic method > > Has there ever been any discussion on an __init magic method > for bootstraping static properties on class load? > > The usual solution I come up with is manually calling an init > method post class definition, which works, though I'd call it > slighly less than elegant: > > class Foo { > static $bar; > static function init () { > // Create $bar with expressions... > self::$bar = $bar; > } > } > Foo:init(); > > A custom autoloader could of course anticipate this but with > systems like composer that have a shared autoload, it'd be > nicer to use those than rely on a custom loader. > I'd say, that using static at all isn't elegant. There is always a way to avoid it. Jared -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
RE: [PHP-DEV] __init magic method
On Tue, 2013-01-22 at 09:39 -0600, nat...@starin.biz wrote: > I am actually going to +1 this idea I thought about discussing it, but > opted out of it because classes are most often in their own file and > if you need to do some static binding you can do it at the end of the > file after the class definition. However, I do believe this idea would > make it easier to extend classes How so? > and make the code look much cleaner. Thankfully that's subjective. Some people prefer explicit information which can easily be read over magic, though. > @Johannes In your example I'd say it would be ADBCE because I would > say it should work like as if you had each one in it's own file > autoloading them. (also I believe the function would be static) In other words: It is called at completely arbitrary times. Which makes reading code hard as well as making the implementation more complex (dependency detection) Mind that your order requires the engine to delay initialization of B and C (and E) till D is found. And then go back. That's why I listed the version with B in the end, that's a tiny bit simpler to implement, but as hard to explain. Now for a second game: What does the following script print? ABC? ACB? BAC? I guess the later as the code next to A or C might depend on the class already. I hope you see the mess this creates, whereas we nowadays have a solution which is properly defined and can easily be understood by everybody, even by people coming from other languages and just trying to understand the code which was put in front of them. > One of the potential problems I can see is the visibility > (public/private/protected) of the function as it'd likely need to be > public because it could never be auto-executed if anything else. Such things would be trivial to check during compilation phase. johannes -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] __init magic method
@Pete just FYI, PSR-1 excludes that such a logic should exist in a loaded file: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md#23-side-effects Not sure if you are interested in following the FIG on these ideas, but the guideline makes actually sense. Marco Pivetta http://twitter.com/Ocramius http://ocramius.github.com/ On 22 January 2013 16:39, wrote: > I am actually going to +1 this idea I thought about discussing it, but > opted out of it because classes are most often in their own file and if you > need to do some static binding you can do it at the end of the file after > the class definition. However, I do believe this idea would make it easier > to extend classes and make the code look much cleaner. > > @Johannes In your example I'd say it would be ADBCE because I would say it > should work like as if you had each one in it's own file autoloading them. > (also I believe the function would be static) > > One of the potential problems I can see is the visibility > (public/private/protected) of the function as it'd likely need to be public > because it could never be auto-executed if anything else. > > Software Developer > Nathan Bruer > > -Original Message- > From: Johannes Schlüter [mailto:johan...@php.net] > Sent: Tuesday, January 22, 2013 7:04 AM > To: Pete Boere > Cc: internals@lists.php.net > Subject: Re: [PHP-DEV] __init magic method > > Hi, > > On Tue, 2013-01-22 at 12:29 +, Pete Boere wrote: > > Has there ever been any discussion on an __init magic method for > > bootstraping static properties on class load? > > Adding an __init method as you wish will just add complexity and gain very > little. What complexity am I talking about? Well look at this single file: > >class A { >public function __init() { echo __CLASS__; } >} >class B extends D { >public function __init() { echo __CLASS__; } >} >class C { >public function __init() { echo __CLASS__; } >} >class D { >public function __init() { echo __CLASS__; } >} >class E { >public function __init() { echo __CLASS__; } >} >?> > > What should this print? ABCDE? Then the derived class B is initialized > before the base class D, which might have strange effects and make > debugging hard. So maybe it is ACDEB? This makes the resolution quite > complicated. > > On the other hand: You are showing a goos solution, which is clear and > works well. PHP has the global scope, we don't force everything into > classes and then create Java-style static{}-madness. > > johannes > > > > -- > 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 > >
RE: [PHP-DEV] __init magic method
I am actually going to +1 this idea I thought about discussing it, but opted out of it because classes are most often in their own file and if you need to do some static binding you can do it at the end of the file after the class definition. However, I do believe this idea would make it easier to extend classes and make the code look much cleaner. @Johannes In your example I'd say it would be ADBCE because I would say it should work like as if you had each one in it's own file autoloading them. (also I believe the function would be static) One of the potential problems I can see is the visibility (public/private/protected) of the function as it'd likely need to be public because it could never be auto-executed if anything else. Software Developer Nathan Bruer -Original Message- From: Johannes Schlüter [mailto:johan...@php.net] Sent: Tuesday, January 22, 2013 7:04 AM To: Pete Boere Cc: internals@lists.php.net Subject: Re: [PHP-DEV] __init magic method Hi, On Tue, 2013-01-22 at 12:29 +, Pete Boere wrote: > Has there ever been any discussion on an __init magic method for > bootstraping static properties on class load? Adding an __init method as you wish will just add complexity and gain very little. What complexity am I talking about? Well look at this single file: What should this print? ABCDE? Then the derived class B is initialized before the base class D, which might have strange effects and make debugging hard. So maybe it is ACDEB? This makes the resolution quite complicated. On the other hand: You are showing a goos solution, which is clear and works well. PHP has the global scope, we don't force everything into classes and then create Java-style static{}-madness. johannes -- 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
Re: [PHP-DEV] __init magic method
Hi, On Tue, 2013-01-22 at 12:29 +, Pete Boere wrote: > Has there ever been any discussion on an __init magic method for > bootstraping static properties on class load? Adding an __init method as you wish will just add complexity and gain very little. What complexity am I talking about? Well look at this single file: What should this print? ABCDE? Then the derived class B is initialized before the base class D, which might have strange effects and make debugging hard. So maybe it is ACDEB? This makes the resolution quite complicated. On the other hand: You are showing a goos solution, which is clear and works well. PHP has the global scope, we don't force everything into classes and then create Java-style static{}-madness. johannes -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] __init magic method
> > What's your use case for this kind of static properties? What if you make > them private/protected and use an accessor method to initialize them (and > avoid the overhead during autoloading)? > It's the overhead of repeatedly calling an accessor method which I'd prefer to avoid. -- Pete Boere Web Developer
Re: [PHP-DEV] __init magic method
@Pete actually, your "less than elegant" solution seems quite enough for this use case. What's your use case for this kind of static properties? What if you make them private/protected and use an accessor method to initialize them (and avoid the overhead during autoloading)? Marco Pivetta http://twitter.com/Ocramius http://ocramius.github.com/