--- /dev/null
+--TEST--
+ZE2 __call()
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class Caller {
+ var $x = array(1, 2, 3);
+
+ function __call($m, $a) {
+ echo "Method $m called:\n";
+ var_dump($a);
+ return $this->x;
+ }
+}
+
+$foo = new Caller();
+$a = $foo->test(1, '2', 3.4, true);
+var_dump($a);
+
+?>
+--EXPECT--
+Method test called:
+array(4) {
+ [0]=>
+ int(1)
+ [1]=>
+ string(1) "2"
+ [2]=>
+ float(000000002)
+ [3]=>
+ bool(true)
+}
+array(3) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+ [2]=>
+ int(3)
+}
--- /dev/null
+--TEST--
+ZE2 __clone()
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class MyCloneable {
+ static $id = 0;
+
+ function MyCloneable() {
+ $this->id = self::$id++;
+ }
+
+ function __clone() {
+ $this->name = $that->name;
+ $this->address = "New York";
+ $this->id = self::$id++;
+ }
+}
+
+$original = new MyCloneable();
+
+$original->name = "Hello";
+$original->address = "Tel-Aviv";
+
+echo $original->id . "\n";
+
+$clone = $original->__clone();
+
+echo $clone->id . "\n";
+echo $clone->name . "\n";
+echo $clone->address . "\n";
+
+?>
+--EXPECT--
+0
+1
+Hello
+New York
--- /dev/null
+--TEST--
+ZE2 __set() and __get()
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+class Setter {
+ public $n;
+ public $x = array('a' => 1, 'b' => 2, 'c' => 3);
+
+ function __get($nm) {
+ echo "Getting [$nm]\n";
+
+ if (isset($this->x[$nm])) {
+ $r = $this->x[$nm];
+ echo "Returning: $r\n";
+ return $r;
+ }
+ else {
+ echo "Nothing!\n";
+ }
+ }
+
+ function __set($nm, $val) {
+ echo "Setting [$nm] to $val\n";
+
+ if (isset($this->x[$nm])) {
+ $this->x[$nm] = $val;
+ echo "OK!\n";
+ }
+ else {
+ echo "Not OK!\n";
+ }
+ }
+}
+
+$foo = new Setter();
+
+// this doesn't go through __set()... should it?
+$foo->n = 1;
+
+// the rest are fine...
+$foo->a = 100;
+$foo->a++;
+$foo->z++;
+var_dump($foo);
+
+?>
+--EXPECT--
+Setting [a] to 100
+OK!
+Getting [a]
+Returning: 100
+Setting [a] to 101
+OK!
+Getting [z]
+Nothing!
+Setting [z] to 1
+Not OK!
+object(setter)(2) {
+ ["n"]=>
+ int(1)
+ ["x"]=>
+ array(3) {
+ ["a"]=>
+ int(101)
+ ["b"]=>
+ int(2)
+ ["c"]=>
+ int(3)
+ }
+}
--- /dev/null
+--TEST--
+ZE2 class constants and scope
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class ErrorCodes {
+ const FATAL = "Fatal error\n";
+ const WARNING = "Warning\n";
+ const INFO = "Informational message\n";
+
+ static function print_fatal_error_codes() {
+ echo "FATAL = " . FATAL;
+ echo "self::FATAL = " . self::FATAL;
+ }
+}
+
+/* Call the static function and move into the ErrorCodes scope */
+ErrorCodes::print_fatal_error_codes();
+
+?>
+--EXPECT--
+FATAL = Fatal error
+self::FATAL = Fatal error
--- /dev/null
+--TEST--
+ZE2 dereferencing of objects from methods
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class Name {
+ function Name($_name) {
+ $this->name = $_name;
+ }
+
+ function display() {
+ echo $this->name . "\n";
+ }
+}
+
+class Person {
+ private $name;
+
+ function Person($_name, $_address) {
+ $this->name = new Name($_name);
+ }
+
+ function getName() {
+ return $this->name;
+ }
+}
+
+$person = new Person("John", "New York");
+$person->getName()->display();
+
+?>
+--EXPECT--
+John
--- /dev/null
+--TEST--
+ZE2 factory objects
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class Circle {
+ function draw() {
+ echo "Circle\n";
+ }
+}
+
+class Square {
+ function draw() {
+ print "Square\n";
+ }
+}
+
+function ShapeFactoryMethod($shape) {
+ switch ($shape) {
+ case "Circle":
+ return new Circle();
+ case "Square":
+ return new Square();
+ }
+}
+
+ShapeFactoryMethod("Circle")->draw();
+ShapeFactoryMethod("Square")->draw();
+
+?>
+--EXPECT--
+Circle
+Square
--- /dev/null
+--TEST--
+ZE2 object references
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class Foo {
+ var $name;
+
+ function Foo() {
+ $this->name = "I'm Foo!\n";
+ }
+}
+
+$foo = new Foo;
+echo $foo->name;
+$bar = $foo;
+$bar->name = "I'm Bar!\n";
+
+// In ZE1, we would expect "I'm Foo!"
+echo $foo->name;
+
+?>
+--EXPECT--
+I'm Foo!
+I'm Bar!
--- /dev/null
+--TEST--
+ZE2 singleton
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class Counter {
+ private $counter = 0;
+
+ function increment_and_print() {
+ echo ++$this->counter;
+ echo "\n";
+ }
+}
+
+
+class SingletonCounter {
+ private static $m_instance = NULL;
+
+ static function Instance() {
+ if (self::$m_instance == NULL) {
+ self::$m_instance = new Counter();
+ }
+ return self::$m_instance;
+ }
+}
+
+SingletonCounter::Instance()->increment_and_print();
+SingletonCounter::Instance()->increment_and_print();
+SingletonCounter::Instance()->increment_and_print();
+
+?>
+--EXPECT--
+1
+2
+3
--- /dev/null
+--TEST--
+ZE2 errors caught as exceptions
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class MyException {
+ function MyException($_errno, $_errmsg) {
+ $this->errno = $_errno;
+ $this->errmsg = $_errmsg;
+ }
+
+ function getErrno() {
+ return $this->errno;
+ }
+
+ function getErrmsg() {
+ return $this->errmsg;
+ }
+}
+
+function ErrorsToExceptions($errno, $errmsg) {
+ throw new MyException($errno, $errmsg);
+}
+
+set_error_handler("ErrorsToExceptions");
+
+// make sure it isn't catching exceptions that weren't
+// thrown...
+
+try {
+} catch (MyException $exception) {
+ echo "There was an exception: " . $exception->getErrno() . ", '" . $exception->getErrmsg() . "'\n";
+}
+
+try {
+ trigger_error("I will become an exception", E_USER_ERROR);
+} catch (MyException $exception) {
+ echo "There was an exception: " . $exception->getErrno() . ", '" . $exception->getErrmsg() . "'\n";
+}
+
+?>
+--EXPECT--
+There was an exception: 256, 'I will become an exception'
--- /dev/null
+--TEST--
+ZE2 namespaces
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+namespace Foo {
+ var $bar;
+
+ function SomeFunction() {
+ echo "I'm Foo::SomeFunction()! Foo::\$bar is set to: " . Foo::$bar;
+ }
+
+ class SomeClass {
+ function __construct() {
+ echo "I'm Foo::SomeClass::__construct()!\n";
+ echo Foo::$bar;
+ }
+ }
+}
+
+Foo::$bar = "I'm Foo::\$bar!\n";
+Foo::SomeFunction();
+$someClass = new Foo::SomeClass;
+
+?>
+--EXPECT--
+I'm Foo::SomeFunction()! Foo::$bar is set to: I'm Foo::$bar!
+I'm Foo::SomeClass::__construct()!
+I'm Foo::$bar!