Browse Source
- Added class member access on instantiation (e.g. (new foo)->bar()) support
pull/7/head
- Added class member access on instantiation (e.g. (new foo)->bar()) support
pull/7/head
7 changed files with 172 additions and 2 deletions
-
20Zend/tests/indirect_method_call_001.phpt
-
32Zend/tests/indirect_method_call_002.phpt
-
23Zend/tests/indirect_method_call_003.phpt
-
26Zend/tests/indirect_method_call_004.phpt
-
16Zend/tests/indirect_method_call_005.phpt
-
26Zend/tests/indirect_property_access.phpt
-
31Zend/zend_language_parser.y
@ -0,0 +1,20 @@ |
|||
--TEST-- |
|||
Testing indirect method call and exceptions |
|||
--FILE-- |
|||
<?php |
|||
|
|||
class foo { |
|||
public function __construct() { |
|||
throw new Exception('foobar'); |
|||
} |
|||
} |
|||
|
|||
try { |
|||
$X = (new foo)->Inexistent(3); |
|||
} catch (Exception $e) { |
|||
var_dump($e->getMessage()); // foobar |
|||
} |
|||
|
|||
?> |
|||
--EXPECT-- |
|||
string(6) "foobar" |
|||
@ -0,0 +1,32 @@ |
|||
--TEST-- |
|||
Indirect method call with chaining |
|||
--FILE-- |
|||
<?php |
|||
|
|||
class foo { |
|||
public $x = 'testing'; |
|||
|
|||
public function bar() { |
|||
return "foo"; |
|||
} |
|||
public function baz() { |
|||
return new self; |
|||
} |
|||
static function xyz() { |
|||
} |
|||
} |
|||
|
|||
var_dump((new foo())->bar()); // string(3) "foo" |
|||
var_dump((new foo())->baz()->x); // string(7) "testing" |
|||
var_dump((new foo())->baz()->baz()->bar()); // string(3) "foo" |
|||
var_dump((new foo())->xyz()); // NULL |
|||
(new foo())->www(); |
|||
|
|||
?> |
|||
--EXPECTF-- |
|||
string(3) "foo" |
|||
string(7) "testing" |
|||
string(3) "foo" |
|||
NULL |
|||
|
|||
Fatal error: Call to undefined method foo::www() in %s on line %d |
|||
@ -0,0 +1,23 @@ |
|||
--TEST-- |
|||
Testing indirect method call |
|||
--FILE-- |
|||
<?php |
|||
|
|||
class foo { |
|||
public $x = 1; |
|||
|
|||
public function getX() { |
|||
return $this->x; |
|||
} |
|||
public function setX($val) { |
|||
$this->x = $val; |
|||
return $this; |
|||
} |
|||
} |
|||
|
|||
$X = (new foo)->setX(10)->getX(); |
|||
var_dump($X); // int(10) |
|||
|
|||
?> |
|||
--EXPECT-- |
|||
int(10) |
|||
@ -0,0 +1,26 @@ |
|||
--TEST-- |
|||
Indirect method call and cloning |
|||
--FILE-- |
|||
<?php |
|||
|
|||
|
|||
class bar { |
|||
public $z; |
|||
|
|||
public function __construct() { |
|||
$this->z = new stdclass; |
|||
} |
|||
public function getZ() { |
|||
return $this->z; |
|||
} |
|||
} |
|||
|
|||
var_dump(clone (new bar)->z); |
|||
var_dump(clone (new bar)->getZ()); |
|||
|
|||
?> |
|||
--EXPECTF-- |
|||
object(stdClass)#%d (0) { |
|||
} |
|||
object(stdClass)#%d (0) { |
|||
} |
|||
@ -0,0 +1,16 @@ |
|||
--TEST-- |
|||
Testing array dereferencing from instance with ArrayObject |
|||
--FILE-- |
|||
<?php |
|||
|
|||
class foo extends ArrayObject { |
|||
public function __construct($arr) { |
|||
parent::__construct($arr); |
|||
} |
|||
} |
|||
|
|||
var_dump( (new foo( array(1, array(4, 5), 3) ))[1][0] ); // int(4) |
|||
|
|||
?> |
|||
--EXPECT-- |
|||
int(4) |
|||
@ -0,0 +1,26 @@ |
|||
--TEST-- |
|||
Testing indirect property access |
|||
--FILE-- |
|||
<?php |
|||
|
|||
class foo { |
|||
public $x = 1; |
|||
} |
|||
|
|||
class bar { |
|||
public $y = 'foo'; |
|||
} |
|||
|
|||
$x = 'bar'; |
|||
|
|||
$bar = new bar; |
|||
|
|||
var_dump((new bar)->y); // foo |
|||
var_dump((new $x)->y); // foo |
|||
var_dump((new $bar->y)->x); // 1 |
|||
|
|||
?> |
|||
--EXPECT-- |
|||
string(3) "foo" |
|||
string(3) "foo" |
|||
int(1) |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue