--- /dev/null
+--TEST--
+A private method can only be called inside the class
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class pass {
+ private static function show() {
+ echo "Call show()\n";
+ }
+
+ public static function do_show() {
+ pass::show();
+ }
+}
+
+pass::do_show();
+pass::show();
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Call show()
+
+Fatal error: Call to private method pass::show() from context '' in %s on line %d
--- /dev/null
+--TEST--
+A private method cannot be called in another class
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class pass {
+ private static function show() {
+ echo "Call pass::show()\n";
+ }
+
+ public static function do_show() {
+ pass::show();
+ }
+}
+
+pass::do_show();
+
+class fail {
+ public static function show() {
+ echo "Call fail::show()\n";
+ pass::show();
+ }
+}
+
+fail::show();
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Call pass::show()
+Call fail::show()
+
+Fatal error: Call to private method pass::show() from context 'fail' in %s on line %d
--- /dev/null
+--TEST--
+A private method cannot be called in a derived class
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+ini_set("error_reporting",2039);
+class pass {
+ private static function show() {
+ echo "Call show()\n";
+ }
+
+ protected static function good() {
+ pass::show();
+ }
+}
+
+class fail extends pass {
+ static function ok() {
+ pass::good();
+ }
+
+ static function not_ok() {
+ pass::show();
+ }
+}
+
+fail::ok();
+fail::not_ok(); // calling a private function
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Call show()
+
+Fatal error: Call to private method pass::show() from context 'fail' in %s on line %d
--- /dev/null
+--TEST--
+A private method cannot be called in a derived class
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class pass {
+ private function show() {
+ echo "Call show()\n";
+ }
+
+ protected function good() {
+ $this->show();
+ }
+}
+
+class fail extends pass {
+ public function ok() {
+ $this->good();
+ }
+
+ public function not_ok() {
+ $this->show();
+ }
+}
+
+$t = new fail();
+$t->ok();
+$t->not_ok(); // calling a private function
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Call show()
+
+Fatal error: Call to private method pass::show() from context 'fail' in %s on line %d
--- /dev/null
+--TEST--
+A private method cannot be called in a derived class
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class pass {
+ private static function show() {
+ echo "Call show()\n";
+ }
+
+ public static function do_show() {
+ pass::show();
+ }
+}
+
+class fail extends pass {
+ static function do_show() {
+ fail::show();
+ }
+}
+
+pass::do_show();
+fail::do_show();
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Call show()
+
+Fatal error: Call to private method pass::show() from context 'fail' in %s on line %d
--- /dev/null
+--TEST--
+A private method cannot be called in a derived class
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class pass {
+ private function show() {
+ echo "Call show()\n";
+ }
+
+ public function do_show() {
+ $this->show();
+ }
+}
+
+class fail extends pass {
+ function do_show() {
+ $this->show();
+ }
+}
+
+$t = new pass();
+$t->do_show();
+
+$t2 = new fail();
+$t2->do_show();
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Call show()
+
+Fatal error: Call to private method pass::show() from context 'fail' in %s on line %d
\ No newline at end of file
--- /dev/null
+--TEST--
+A private method cannot be called in a derived class
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class pass {
+ private static function show() {
+ echo "Call show()\n";
+ }
+
+ public static function do_show() {
+ pass::show();
+ }
+}
+
+class fail extends pass {
+ static function do_show() {
+ pass::show();
+ }
+}
+
+pass::do_show();
+fail::do_show();
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Call show()
+
+Fatal error: Call to private method pass::show() from context 'fail' in %s on line %d
--- /dev/null
+--TEST--
+A private method cannot be called in a derived class
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class pass {
+ private function show() {
+ echo "Call show()\n";
+ }
+
+ public function do_show() {
+ $this->show();
+ }
+}
+
+class fail extends pass {
+ function do_show() {
+ $this->show();
+ }
+}
+
+$t = new pass();
+$t->do_show();
+
+$t2 = new fail();
+$t2->do_show();
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Call show()
+
+Fatal error: Call to private method pass::show() from context 'fail' in %s on line %d
\ No newline at end of file
--- /dev/null
+--TEST--
+A private method can be overwritten in a second derived class
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+class first {
+ private static function show() {
+ echo "Call show()\n";
+ }
+
+ public static function do_show() {
+ first::show();
+ }
+}
+
+first::do_show();
+
+class second extends first {
+}
+
+second::do_show();
+
+class third extends second {
+}
+
+third::do_show();
+
+class fail extends third {
+ static function show() { // cannot be redeclared
+ echo "Call show()\n";
+ }
+}
+
+echo "Done\n";
+?>
+--EXPECTF--
+Call show()
+Call show()
+Call show()
+Done
--- /dev/null
+--TEST--
+A private method can be overwritten in a second derived class
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class first {
+ private function show() {
+ echo "Call show()\n";
+ }
+
+ public function do_show() {
+ $this->show();
+ }
+}
+
+$t1 = new first();
+$t1->do_show();
+
+class second extends first {
+}
+
+//$t2 = new second();
+//$t2->do_show();
+
+class third extends second {
+ private function show() {
+ echo "Call show()\n";
+ }
+}
+
+$t3 = new third();
+$t3->do_show();
+
+echo "Done\n";
+?>
+--EXPECTF--
+Call show()
+Call show()
+Done
\ No newline at end of file
--- /dev/null
+--TEST--
+A derived class does not know about privates of ancestors
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class Bar {
+ public static function pub() {
+ Bar::priv();
+ }
+ private static function priv() {
+ echo "Bar::priv()\n";
+ }
+}
+class Foo extends Bar {
+ public static function priv() {
+ echo "Foo::priv()\n";
+ }
+}
+
+Foo::pub();
+Foo::priv();
+
+echo "Done\n";
+?>
+--EXPECTF--
+Bar::priv()
+Foo::priv()
+Done
--- /dev/null
+--TEST--
+A derived class does not know about privates of ancestors
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class Bar {
+ public function pub() {
+ $this->priv();
+ }
+ private function priv() {
+ echo "Bar::priv()\n";
+ }
+}
+class Foo extends Bar {
+ public function priv() {
+ echo "Foo::priv()\n";
+ }
+}
+
+$obj = new Foo();
+$obj->pub();
+$obj->priv();
+
+echo "Done\n";
+?>
+--EXPECTF--
+Bar::priv()
+Foo::priv()
+Done
--- /dev/null
+--TEST--
+A protected method can only be called inside the class
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class pass {
+ protected static function fail() {
+ echo "Call fail()\n";
+ }
+
+ public static function good() {
+ pass::fail();
+ }
+}
+
+pass::good();
+pass::fail();// must fail because we are calling from outside of class pass
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Call fail()
+
+Fatal error: Call to protected method pass::fail() from context '' in %s on line %d
--- /dev/null
+--TEST--
+A protected method can only be called inside the class
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class pass {
+ protected function fail() {
+ echo "Call fail()\n";
+ }
+
+ public function good() {
+ $this->fail();
+ }
+}
+
+$t = new pass();
+$t->good();
+$t->fail();// must fail because we are calling from outside of class pass
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Call fail()
+
+Fatal error: Call to protected method pass::fail() from context '' in %s on line %d
--- /dev/null
+--TEST--
+A protected method cannot be called in another class
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class pass {
+ protected static function show() {
+ echo "Call pass::show()\n";
+ }
+
+ public static function do_show() {
+ pass::show();
+ }
+}
+
+pass::do_show();
+
+class fail {
+ public static function show() {
+ echo "Call fail::show()\n";
+ pass::show();
+ }
+}
+
+fail::show();
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Call pass::show()
+Call fail::show()
+
+Fatal error: Call to protected method pass::show() from context 'fail' in %s on line %d
--- /dev/null
+--TEST--
+A redeclared method must have the same or higher visibility
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class father {
+ function f0() {}
+ function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class same extends father {
+
+ // overload fn with same visibility
+ function f0() {}
+ public function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class fail extends same {
+ protected function f0() {}
+}
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Fatal error: Access level to fail::f0() must be public (as in class same) in %s on line %d
--- /dev/null
+--TEST--
+A redeclared method must have the same or higher visibility
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class father {
+ function f0() {}
+ function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class same extends father {
+
+ // overload fn with same visibility
+ function f0() {}
+ public function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class fail extends same {
+ private function f0() {}
+}
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Fatal error: Access level to fail::f0() must be public (as in class same) in %s on line %d
--- /dev/null
+--TEST--
+A redeclared method must have the same or higher visibility
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class father {
+ function f0() {}
+ function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class same extends father {
+
+ // overload fn with same visibility
+ function f0() {}
+ public function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class fail extends same {
+ function f0() {}
+}
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Done
--- /dev/null
+--TEST--
+A redeclared method must have the same or higher visibility
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class father {
+ function f0() {}
+ function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class same extends father {
+
+ // overload fn with same visibility
+ function f0() {}
+ public function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class fail extends same {
+ protected function f1() {}
+}
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Fatal error: Access level to fail::f1() must be public (as in class same) in %s on line %d
--- /dev/null
+--TEST--
+A redeclared method must have the same or higher visibility
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class father {
+ function f0() {}
+ function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class same extends father {
+
+ // overload fn with same visibility
+ function f0() {}
+ public function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class fail extends same {
+ private function f1() {}
+}
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Fatal error: Access level to fail::f1() must be public (as in class same) in %s on line %d
--- /dev/null
+--TEST--
+A redeclared method must have the same or higher visibility
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class father {
+ function f0() {}
+ function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class same extends father {
+
+ // overload fn with same visibility
+ function f0() {}
+ public function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class fail extends same {
+ function f1() {}
+}
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Done
--- /dev/null
+--TEST--
+A redeclared method must have the same or higher visibility
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class father {
+ function f0() {}
+ function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class same extends father {
+
+ // overload fn with same visibility
+ function f0() {}
+ public function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class fail extends same {
+ protected function f2() {}
+}
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Fatal error: Access level to fail::f2() must be public (as in class same) in %s on line %d
--- /dev/null
+--TEST--
+A redeclared method must have the same or higher visibility
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class father {
+ function f0() {}
+ function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class same extends father {
+
+ // overload fn with same visibility
+ function f0() {}
+ public function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class fail extends same {
+ private function f2() {}
+}
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Fatal error: Access level to fail::f2() must be public (as in class same) in %s on line %d
--- /dev/null
+--TEST--
+A redeclared method must have the same or higher visibility
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class father {
+ function f0() {}
+ function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class same extends father {
+
+ // overload fn with same visibility
+ function f0() {}
+ public function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class fail extends same {
+ function f2() {}
+}
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Done
--- /dev/null
+--TEST--
+A redeclared method must have the same or higher visibility
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class father {
+ function f0() {}
+ function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class same extends father {
+
+ // overload fn with same visibility
+ function f0() {}
+ public function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class fail extends same {
+ public function f3() {}
+}
+
+echo "Done\n";
+?>
+--EXPECTF--
+Done
--- /dev/null
+--TEST--
+A redeclared method must have the same or higher visibility
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class father {
+ function f0() {}
+ function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class same extends father {
+
+ // overload fn with same visibility
+ function f0() {}
+ public function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class fail extends same {
+ private function f3() {}
+}
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Fatal error: Access level to fail::f3() must be protected (as in class same) or weaker in %s on line %d
--- /dev/null
+--TEST--
+A redeclared method must have the same or higher visibility
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class father {
+ function f0() {}
+ function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class same extends father {
+
+ // overload fn with same visibility
+ function f0() {}
+ public function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class fail extends same {
+ function f3() {}
+}
+
+echo "Done\n";
+?>
+--EXPECTF--
+Done
--- /dev/null
+--TEST--
+A redeclared method must have the same or higher visibility
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class father {
+ function f0() {}
+ function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class same extends father {
+
+ // overload fn with same visibility
+ function f0() {}
+ public function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class fail extends same {
+ public function f4() {}
+}
+
+echo "Done\n";
+?>
+--EXPECTF--
+Done
--- /dev/null
+--TEST--
+A redeclared method must have the same or higher visibility
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class father {
+ function f0() {}
+ function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class same extends father {
+
+ // overload fn with same visibility
+ function f0() {}
+ public function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class fail extends same {
+ protected function f4() {}
+}
+
+echo "Done\n"; // shouldn't be displayed
+?>
+--EXPECTF--
+Done
--- /dev/null
+--TEST--
+A redeclared method must have the same or higher visibility
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class father {
+ function f0() {}
+ function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class same extends father {
+
+ // overload fn with same visibility
+ function f0() {}
+ public function f1() {}
+ public function f2() {}
+ protected function f3() {}
+ private function f4() {}
+}
+
+class fail extends same {
+ function f4() {}
+}
+
+echo "Done\n";
+?>
+--EXPECTF--
+Done