Hi,
Hi all,
Reading our bug tracker I noticed a good feature request [1] from
2009 which
points to an interesting feature that I think makes sense for us,
since we
are now working with $f() using objects and strings, and the
array('class',
'method') is an old known forcall_user_func()
-like functions.So, I wrote a patch [2] that allow such behavior to be consistent
with
arrays. See some examples:class Hello {
public function world($x) {
echo "Hello, $x\n"; return $this;
}
}$f = array('Hello','world');
var_dump($f('you'));$f = array(new Hello, 'foo');
$f();All such calls match with the
call_user_func()
behavior related to
magic
methods, static & non-static methods.The array to be a valid callback should be a 2-element array, and it
must be
for the first element object/string and for the second string only.
(just
like our zend_is_callable() check and opcodes related to init call)Any thoughts?
what happens if I use this code.
class Foo {
public $bar;
public function __construct() {
$this->bar = array($this, 'baz');
$this->bar();
}
public function bar() {
echo 'bar';
}
public function baz() {
echo 'baz';
}
}
new Foo();
What is the output of this snippet?
Are there the same rules as for closures?
Christian
Hi,
2011/6/8 Christian Kaps christian.kaps@mohiva.com
Hi,
Hi all,
Reading our bug tracker I noticed a good feature request [1] from 2009
which
points to an interesting feature that I think makes sense for us, since we
are now working with $f() using objects and strings, and the
array('class',
'method') is an old known forcall_user_func()
-like functions.So, I wrote a patch [2] that allow such behavior to be consistent with
arrays. See some examples:class Hello {
public function world($x) {
echo "Hello, $x\n"; return $this;
}
}$f = array('Hello','world');
var_dump($f('you'));$f = array(new Hello, 'foo');
$f();All such calls match with the
call_user_func()
behavior related to magic
methods, static & non-static methods.The array to be a valid callback should be a 2-element array, and it must
be
for the first element object/string and for the second string only. (just
like our zend_is_callable() check and opcodes related to init call)Any thoughts?
what happens if I use this code.
class Foo {
public $bar;
public function __construct() {
$this->bar = array($this, 'baz'); $this->bar();
}
public function bar() {
echo 'bar';
}public function baz() {
echo 'baz';
}
}new Foo();
What is the output of this snippet?
Are there the same rules as for closures?
Christian
Yes, the same rules.
--
Regards,
Felipe Pena
Hi,
2011/6/8 Christian Kaps christian.kaps@mohiva.com
Hi,
what happens if I use this code.
class Foo {
public $bar;
public function __construct() {
$this->bar = array($this, 'baz'); $this->bar();
}
public function bar() {
echo 'bar';
}public function baz() {
echo 'baz';
}
}new Foo();
What is the output of this snippet?
Are there the same rules as for closures?
Christian
Yes, the same rules.
Hi,
I think for the sake of consistency it should be possible to use the
following code.
class Bar {
public function __construct($dispatcher) {
$dispatcher->addEventListener('onUpdate', $this->onUpdate);
}
public function onUpdate() {}
}
If a property $onUpdate exists then it will be ignored. The same rules
as for Closures or for array callbacks.
Christian
2011/6/8 Christian Kaps christian.kaps@mohiva.com
Hi,
2011/6/8 Christian Kaps christian.kaps@mohiva.com
Hi,
what happens if I use this code.
class Foo {
public $bar;
public function __construct() {
$this->bar = array($this, 'baz'); $this->bar();
}
public function bar() {
echo 'bar';
}public function baz() {
echo 'baz';
}
}new Foo();
What is the output of this snippet?
Are there the same rules as for closures?
Christian
Yes, the same rules.
Hi,
I think for the sake of consistency it should be possible to use the
following code.class Bar {
public function __construct($dispatcher) {
$dispatcher->addEventListener('onUpdate', $this->onUpdate);
}
public function onUpdate() {}
}If a property $onUpdate exists then it will be ignored. The same rules as
for Closures or for array callbacks.Christian
It works in the same way:
class foo {
public function __construct() {
$this->bar = function () { return 1; };
// $this->bar(); // error
$x = $this->bar;
$x(); // ok
$this->bar = array($this, 'baz');
// $this->bar(); // error
$x = $this->bar;
$x(); // ok
}
public function baz() {
echo 'baz';
}
}
--
Regards,
Felipe Pena
class foo {
public function __construct() {
$this->bar = function () { return 1; };
// $this->bar(); // error
$x = $this->bar;
$x(); // ok$this->bar = array($this, 'baz');
// $this->bar(); // error
$x = $this->bar;
$x(); // ok
}
public function baz() {
echo 'baz';
}
}
What he meant was passing an existing method as a callback if you
don't invoke it, i.e. passing "$this->bar" instead of array($this,
"bar"). I don't know how hard it'd be to achieve, but it sounds pretty
awesome to me.
Cheers
--
Jordi Boggiano
@seldaek :: http://seld.be/
On Wed, Jun 8, 2011 at 2:46 PM, Felipe Pena felipensp@gmail.com
wrote:class foo {
public function __construct() {
$this->bar = function () { return 1; };
// $this->bar(); // error
$x = $this->bar;
$x(); // ok$this->bar = array($this, 'baz');
// $this->bar(); // error
$x = $this->bar;
$x(); // ok
}
public function baz() {
echo 'baz';
}
}What he meant was passing an existing method as a callback if you
don't invoke it, i.e. passing "$this->bar" instead of array($this,
"bar"). I don't know how hard it'd be to achieve, but it sounds
pretty
awesome to me.Cheers
Yep, just what I meant.
Will this work:
array('foo', 'bar')('arg1', 'arg2')
?
On Wed, Jun 8, 2011 at 3:48 PM, Christian Kaps
christian.kaps@mohiva.com wrote:
class foo {
public function __construct() {
$this->bar = function () { return 1; };
// $this->bar(); // error
$x = $this->bar;
$x(); // ok$this->bar = array($this, 'baz');
// $this->bar(); // error
$x = $this->bar;
$x(); // ok
}
public function baz() {
echo 'baz';
}
}What he meant was passing an existing method as a callback if you
don't invoke it, i.e. passing "$this->bar" instead of array($this,
"bar"). I don't know how hard it'd be to achieve, but it sounds pretty
awesome to me.Cheers
Yep, just what I meant.
2011/7/14 Rune Kaagaard rumi.kg@gmail.com:
Will this work:
array('foo', 'bar')('arg1', 'arg2')
?
No, and it isn't supposed to either.
--
Regards,
Felipe Pena
It works in the same way:
class foo {
public function __construct() {
$this->bar = function () { return 1; };
// $this->bar(); // error
$x = $this->bar;
$x(); // ok$this->bar = array($this, 'baz'); // $this->bar(); // error $x = $this->bar; $x(); // ok
}
public function baz() {
echo 'baz';
}
}
OK, my mistake. I thought a property which holds a closure can be
called directly.
Thanks for clarification.
Christian