<?php
class A {
private function foo() {
echo "success!" . get_class($this) . "\n";
}
public function test() {
$this->foo();
static::foo();
}
}
class B extends A {
/* foo() will be copied to B, hence its scope will still be A and
* the call be successful */
}
class C extends A {
private function foo() {
/* original method is replaced; the scope of the new one is C */
}
}
$b = new B();
$b->test();
$c = new C();
$c->test(); //fails
success!B
success!B
success!C
Fatal error: Uncaught Error: Call to private method C::foo() from scope A in /in/sH33Q:9
Stack trace:
#0 /in/sH33Q(27): A->test()
#1 {main}
thrown in /in/sH33Q on line 9
Process exited with code 255.
Output for 8.3.5
Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
success!B
success!B
success!C
Fatal error: Uncaught Error: Call to private method C::foo() from scope A in /in/sH33Q:9
Stack trace:
#0 /in/sH33Q(27): A->test()
#1 {main}
thrown in /in/sH33Q on line 9
Process exited with code 255.
success!B
success!B
success!C
Fatal error: Uncaught Error: Call to private method C::foo() from context 'A' in /in/sH33Q:9
Stack trace:
#0 /in/sH33Q(27): A->test()
#1 {main}
thrown in /in/sH33Q on line 9
Process exited with code 255.
Output for 5.5.24 - 5.5.35, 5.6.8 - 5.6.28
success!B
success!B
success!C
Fatal error: Call to private method C::foo() from context 'A' in /in/sH33Q on line 9
Process exited with code 255.