RE: [PHP-DEV] __init magic method

2013-01-23 Thread Jared Williams
 

> -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

2013-01-22 Thread Johannes Schlüter
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

2013-01-22 Thread Marco Pivetta
@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

2013-01-22 Thread nathan
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

2013-01-22 Thread Johannes Schlüter
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

2013-01-22 Thread Pete Boere
>
> 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

2013-01-22 Thread Marco Pivetta
@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/