Edit report at https://bugs.php.net/bug.php?id=53573&edit=1

 ID:                 53573
 Updated by:         ni...@php.net
 Reported by:        kak dot serpom dot po dot yaitsam at gmail dot com
 Summary:            Invisible "static" property of Closure
-Status:             Open
+Status:             Wont fix
 Type:               Feature/Change Request
 Package:            Scripting Engine problem
 PHP Version:        5.3.4
 Block user comment: N
 Private report:     N

 New Comment:

As reeze pointed out this is only debugging output (var_dump is a debugging 
function). The property does not actually exist. We provide the same kind of 
functionality for various other classes. You could think of this as a "private" 
property, which is used internally, but which the user does not have access too 
(encapsulation).

I see no reason to expose this. If you need this for $this bindings, then 
switch to PHP 5.4. It will automatically bind $this and allows rebinding using 
the ->bind() method.

Closing this as won't fix. (If you have any convincing counter arguments, 
please share them and this will be reopened.)


Previous Comments:
------------------------------------------------------------------------
[2012-09-11 18:16:41] re...@php.net

In fact, closure is a class: Closure just an implementation detail.

we should forget about the class itself. the output static is just 
let you to ease debugging but not for public access

------------------------------------------------------------------------
[2011-02-16 02:04:21] olamedia at gmail dot com

Please, let Closure be standard object without any restrictions.
Let developers decide what they can use, and what must not.
PHP is already full enough of "RESERVED" "YOU MUST NOT" "YOU CAN NOT" "YOU 
SHOULD 
NOT" "ITS HARD, SO WE WILL NOT MAKE THIS FEATURE" "I DONT NEED THIS, SO PLEASE 
DON'T REQUEST THIS FEATURE"

------------------------------------------------------------------------
[2011-02-16 01:51:07] olamedia at gmail dot com

<?php
class a{
  public $c = array();
  function __call($name, $args){
    $closure = $this->c[$name]; // example
    $self = $this;
    // how can I pass $self to closure?
    $closure->static['self'] = $this // NO!, Reflection is giving empty array
    call_user_func_array($closure, $args);
  }
}
$a = new a();
$a->c['hello'] = function($x) use ($self){
  return 'Hello, '.$x.'! My name is '.get_class($self).'!';
};
$a->hello('php');

------------------------------------------------------------------------
[2010-12-19 06:03:08] kak dot serpom dot po dot yaitsam at gmail dot com

Description:
------------
var_dump($closure) displays public property named "static", but I cannot access 
to 
it with standard call: Closure object cannot have properties
It might be very useful!
Thanks.

Test script:
---------------
<?php
$a = function() {
        static $foo = 'bar';
        echo $foo."\n";
};
var_dump($a);
$a->{'static'}['foo'] = 'foo';
$a();


Expected result:
----------------
Output: foo

Actual result:
--------------
object(Closure)#1 (1) {
  ["static"]=>
  array(1) {
    ["foo"]=>
    string(3) "bar"
  }
}
PHP Catchable fatal error:  Closure object cannot have properties in 
/home/web/1.php on line 7



------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=53573&edit=1

Reply via email to