Re: [PHP-DEV] Re: $arr = array('Hello', 'world'); $arr();

2011-07-14 Thread Rune Kaagaard
Will this work:

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

?

On Wed, Jun 8, 2011 at 3:48 PM, Christian Kaps
christian.k...@mohiva.com wrote:
 On Wed, 8 Jun 2011 15:39:59 +0200, Jordi Boggiano wrote:

 On Wed, Jun 8, 2011 at 2:46 PM, Felipe Pena felipe...@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.

 --
 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] Re: $arr = array('Hello', 'world'); $arr();

2011-07-14 Thread Felipe Pena
2011/7/14 Rune Kaagaard rumi...@gmail.com:
 Will this work:

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

 ?


No, and it isn't supposed to either.

-- 
Regards,
Felipe Pena

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



Re: [PHP-DEV] Re: $arr = array('Hello', 'world'); $arr();

2011-06-08 Thread Felipe Pena
Hi,

2011/6/8 Christian Kaps christian.k...@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 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


Yes, the same rules.

-- 
Regards,
Felipe Pena


Re: [PHP-DEV] Re: $arr = array('Hello', 'world'); $arr();

2011-06-08 Thread Christian Kaps

On Wed, 8 Jun 2011 08:57:48 -0300, Felipe Pena wrote:

Hi,

2011/6/8 Christian Kaps christian.k...@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


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



Re: [PHP-DEV] Re: $arr = array('Hello', 'world'); $arr();

2011-06-08 Thread Felipe Pena
2011/6/8 Christian Kaps christian.k...@mohiva.com

 On Wed, 8 Jun 2011 08:57:48 -0300, Felipe Pena wrote:

 Hi,

 2011/6/8 Christian Kaps christian.k...@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


Re: [PHP-DEV] Re: $arr = array('Hello', 'world'); $arr();

2011-06-08 Thread Jordi Boggiano
On Wed, Jun 8, 2011 at 2:46 PM, Felipe Pena felipe...@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

-- 
Jordi Boggiano
@seldaek :: http://seld.be/

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



Re: [PHP-DEV] Re: $arr = array('Hello', 'world'); $arr();

2011-06-08 Thread Christian Kaps

On Wed, 8 Jun 2011 09:46:26 -0300, Felipe Pena wrote:


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

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



Re: [PHP-DEV] Re: $arr = array('Hello', 'world'); $arr();

2011-06-08 Thread Christian Kaps

On Wed, 8 Jun 2011 15:39:59 +0200, Jordi Boggiano wrote:
On Wed, Jun 8, 2011 at 2:46 PM, Felipe Pena felipe...@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.

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