# $arr = array('Hello', 'world'); $arr();

- Thread: https://externals.io/message/53205
- Original archive: https://news-web.php.net/php.internals/53205
- Started by Christian Kaps on 2011-06-08T11:39:08+00:00
- Messages: 9
- Reply by email to internals@lists.php.net
- More for agents: search with https://externals.io/search.md?q={query} · JSON API at https://externals.io/api · documentation at https://externals.io/llms.txt

---

## #53205 — Christian Kaps — 2011-06-08T11:39:08+00:00

URL: https://externals.io/message/53205#53205

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 for `call_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

---

## #53206 — Felipe Pena — 2011-06-08T11:57:48+00:00

URL: https://externals.io/message/53205#53206 · In reply to: #53205

Hi,

2011/6/8 Christian Kaps <christian.kaps@mohiva.com>

> Hi,
>
>
>  Hi all,
> > […]
>
> 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

---

## #53207 — Christian Kaps — 2011-06-08T12:11:51+00:00

URL: https://externals.io/message/53205#53207 · In reply to: #53206

> Hi,
>
> 2011/6/8 Christian Kaps <christian.kaps@mohiva.com>
>
> > […]
> 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

---

## #53209 — Felipe Pena — 2011-06-08T12:46:26+00:00

URL: https://externals.io/message/53205#53209 · In reply to: #53207

2011/6/8 Christian Kaps <christian.kaps@mohiva.com>

> 
>
> > […]
>
> 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

---

## #53211 — Jordi Boggiano — 2011-06-08T13:39:59+00:00

URL: https://externals.io/message/53205#53211 · In reply to: #53209

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

---

## #53212 — Christian Kaps — 2011-06-08T13:42:18+00:00

URL: https://externals.io/message/53205#53212 · In reply to: #53209

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

---

## #53213 — Christian Kaps — 2011-06-08T13:48:34+00:00

URL: https://externals.io/message/53205#53213 · In reply to: #53211

> On Wed, Jun 8, 2011 at 2:46 PM, Felipe Pena <felipensp@gmail.com> 
> wrote:
> > […]
>
> 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.

---

## #53964 — Rune Kaagaard — 2011-07-14T21:03:27+00:00

URL: https://externals.io/message/53205#53964 · In reply to: #53213

Will this work:

    array('foo', 'bar')('arg1', 'arg2')

?

On Wed, Jun 8, 2011 at 3:48 PM, Christian Kaps
<christian.kaps@mohiva.com> wrote:
> 
> > […]
>
> Yep, just what I meant.

---

## #53965 — Felipe Pena — 2011-07-14T21:13:43+00:00

URL: https://externals.io/message/53205#53965 · In reply to: #53964

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
