Hi Marcus,


> And I could say that what the two of you designed ofr PHP is not a design

> but a very confusing incoherent implementation that is based on the lack

> of being able to get support for something else in the underlying c

> implementation.



Huh? The current implementation is by design, not because of any

limitations on C level. If you are refering to the following sentence in

your answer to Stanislav:



> If this really was to be bound to a $this at the creation, then we'd put it

> into the scope binding list and not have it be handled implicitly. But then

> we cannot do that with the current c level api.



The fact is: We could very easily. We decided against it (it's somewhere in

the internals archives from over half a year ago, I'm too lazy to look for

it).



So, if I get you, you say: "If $this is only bound at closure creation time,

then you should add $this to use()", i.e.:



$f = function () use ($this) { ... };



Well, if you rather want that syntax instead of static/non-static, you

could simple edit zend_compile.c and do the following:



 - change zend_do_begin_lambda_function_declaration: set fn_flags to

   ZEND_ACC_STATIC by default (and remove the is_static parameter

   from that function)

 - change zend_do_fetch_lexical_variable: In the case $this was

   specified as a lexical variable, remove the ZEND_ACC_STATIC flag

   from the function flags and return immediately (and remove the

   current error    message)

 - remove the T_STATIC from the grammar definition in zend_lang*.y



Unified diff of that should be max. 100 lines long.



So, this is NOT a limitation on the C level, this is a deliberate

design decision. And, btw., it is not a design decision I care about

very much - if there's a majority to change it, I've no problem with

that.



> You took somethign very special and made it behave somewhat

> different making it even more specific and different from anyone's

> expectations, excluding people that understand the underlying c level

> issues.



No, we did not do any such thing. People who do a lot of Javascript

expect the behaviour you describe (i.e. re-binding), but that does

not necessarily mean everybody does. And if you read postings made by

beginners with Javascript in beginners' web forums or beginners'

mailing lists, the re-binding of the this variable is a VERY confusing

thing for beginners and not natural at all. You may have grown

accustomed to this behaviour, but please do not make the mistake of

thinking that your expectations are the expectations of the rest of

the world. I do acknowledge that some people like you will expect

this behaviour due to their background in Javscript.



I also posted in HUGE DETAIL why I find your approach to be *very*

problematic. I also went into detail on why you find your approach

more natural and why Javascript is different than PHP in this aspect

so you can't simply copy the concept from one to another. I also

added a proposal which contains an alternative that may not be ideal

but may satisfy all the needs. But instead of really replying to

that, you simply took the first sentence, used my admittedly not

very ideal wording as polemic and repeated your statement from

before. I don't think this will get us anywhere.



So, I would be very happy if you could 1) acknowledge that what you

would expect is not necessarily that what everybody else would

expect (some others certainly, but not everybody), 2) realize that

many (albeit not all) things in the current implementation are NOT

there because of C limitations but are deliberate (see above for an

example) and 3) have another look at my previous posting, think

about it for some time and THEN reply to it. Because the intention

behind my posting was NOT to say "you're wrong, you ..." but rather

to say "I get where you are coming from but have a look at this

example, your proposal will cause additional problems. And your

expectations do not necessarily match mine. But I don't want to

dismiss your idea completely, so here's an alternative idea that

came to my mind, please think about it."



Regards,

Christian



PS: By the way, Python does not rebind closures that enclose the

current object handle either:



class Foo:

  def __init__ (self, v):

    self.v = v



  def getClosure (self):

    def closure (w):

      return self.v + w

    return closure



o1 = Foo (2)

o2 = Foo (3)

# both are o1.getClosure not o2!

o1.xyz = o1.getClosure()

o2.xyz = o1.getClosure()

print o1.xyz (2)   # 4

print o2.xyz (2)   # 4



(Yes, that's due to the different concept of the 'self' variable

in Python compared to the way PHP and Javascript use $this, but it

just demonstrates that one has to look at the other concepts that

are implemented in the language in order to get something

consistent. That's precisely my argument for PHP, too.)




-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to