3v4l.org

run code in 300+ PHP versions simultaneously
<?php class C1 { public static function __callStatic($fn, $args) { echo "C1::__callStatic\n"; var_dump(isset($this)); var_dump($fn, $args); echo "\n"; } } function main1() { // FPushClsMethodD C1::__callStatic("a", "b", "c", "d"); C1::foo("a", "b", "c", "d"); // FPushClsMethod $cls = 'C1'; $cls::__callStatic("a", "b", "c", "d"); $cls::foo("a", "b", "c", "d"); $fn = '__callStatic'; C1::$fn("a", "b", "c", "d"); $fn = 'foo'; C1::$fn("a", "b", "c", "d"); $fn = '__callStatic'; $cls::$fn("a", "b", "c", "d"); $fn = 'foo'; $cls::$fn("a", "b", "c", "d"); } main1(); class C2 { public static function __callStatic($fn, $args) { echo "C2::__callStatic\n"; var_dump(isset($this)); var_dump($fn, $args); echo "\n"; } public function test() { // FPushClsMethodD C2::__callStatic("a", "b", "c", "d"); C2::foo("a", "b", "c", "d"); // FPushClsMethod $cls = 'C2'; $cls::__callStatic("a", "b", "c", "d"); $cls::foo("a", "b", "c", "d"); $fn = '__callStatic'; C2::$fn("a", "b", "c", "d"); $fn = 'foo'; C2::$fn("a", "b", "c", "d"); $fn = '__callStatic'; $cls::$fn("a", "b", "c", "d"); $fn = 'foo'; $cls::$fn("a", "b", "c", "d"); // FPushClsMethodF self::__callStatic("a", "b", "c", "d"); self::foo("a", "b", "c", "d"); } } function main2() { $obj = new C2; $obj->test(); } main2(); class B3 { public function __call($fn, $args) { echo "B3::__call\n"; var_dump(isset($this)); var_dump($fn, $args); echo "\n"; } public static function __callStatic($fn, $args) { echo "B3::__callStatic\n"; var_dump(isset($this)); var_dump($fn, $args); echo "\n"; } } class C3 extends B3 { public function test() { // FPushClsMethodD B3::__callStatic("a", "b", "c", "d"); B3::foo("a", "b", "c", "d"); // FPushClsMethod $cls = 'B3'; $cls::__callStatic("a", "b", "c", "d"); $cls::foo("a", "b", "c", "d"); $fn = '__callStatic'; B3::$fn("a", "b", "c", "d"); $fn = 'foo'; B3::$fn("a", "b", "c", "d"); $fn = '__callStatic'; $cls::$fn("a", "b", "c", "d"); $fn = 'foo'; $cls::$fn("a", "b", "c", "d"); // FPushClsMethodF self::__callStatic("a", "b", "c", "d"); self::foo("a", "b", "c", "d"); } } function main3() { $obj = new C3; $obj->test(); } main3(); class A4 { public function foo($w, $x, $y, $z) { echo "A4::foo\n"; } } class B4 extends A4 { public static function __callStatic($fn, $args) { var_dump(isset($this)); var_dump($fn, $args); echo "\n"; } } class C4 extends B4 { } function main4() { $fn = 'foo'; C4::foo("a", "b", "c", "d"); C4::$fn("a", "b", "c", "d"); } main4(); class A5 { public static function __callStatic($fn, $args) { var_dump(isset($this)); var_dump($fn, $args); } } class B5 extends A5 { public function test() { A5::foo("a", "b", "c", "d"); } } class C5 extends B5 { } function main5() { $obj = new C5; $obj->test(); } main5();
Output for 8.0.0 - 8.0.30, 8.1.0 - 8.1.27, 8.2.0 - 8.2.18, 8.3.0 - 8.3.4, 8.3.6
C1::__callStatic bool(false) string(1) "a" string(1) "b" C1::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C1::__callStatic bool(false) string(1) "a" string(1) "b" C1::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C1::__callStatic bool(false) string(1) "a" string(1) "b" C1::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C1::__callStatic bool(false) string(1) "a" string(1) "b" C1::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } Fatal error: Uncaught Error: Non-static method A4::foo() cannot be called statically in /in/IrT0K:129 Stack trace: #0 /in/IrT0K(132): main4() #1 {main} thrown in /in/IrT0K on line 129
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 C1::__callStatic bool(false) string(1) "a" string(1) "b" C1::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C1::__callStatic bool(false) string(1) "a" string(1) "b" C1::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C1::__callStatic bool(false) string(1) "a" string(1) "b" C1::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C1::__callStatic bool(false) string(1) "a" string(1) "b" C1::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } Fatal error: Uncaught Error: Non-static method A4::foo() cannot be called statically in /in/IrT0K:129 Stack trace: #0 /in/IrT0K(132): main4() #1 {main} thrown in /in/IrT0K on line 129
Process exited with code 255.
Output for 7.0.0 - 7.0.20, 7.1.0 - 7.1.20, 7.2.6 - 7.2.33, 7.3.16 - 7.3.31, 7.4.0 - 7.4.33
C1::__callStatic bool(false) string(1) "a" string(1) "b" C1::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C1::__callStatic bool(false) string(1) "a" string(1) "b" C1::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C1::__callStatic bool(false) string(1) "a" string(1) "b" C1::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C1::__callStatic bool(false) string(1) "a" string(1) "b" C1::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } Deprecated: Non-static method A4::foo() should not be called statically in /in/IrT0K on line 129 A4::foo Deprecated: Non-static method A4::foo() should not be called statically in /in/IrT0K on line 130 A4::foo bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" }
Output for 7.3.32 - 7.3.33
C1::__callStatic bool(false) string(1) "a" string(1) "b" C1::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C1::__callStatic bool(false) string(1) "a" string(1) "b" C1::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C1::__callStatic bool(false) string(1) "a" string(1) "b" C1::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C1::__callStatic bool(false) string(1) "a" string(1) "b" C1::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } A4::foo A4::foo bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" }
Output for 5.4.0 - 5.4.45, 5.5.0 - 5.5.38, 5.6.0 - 5.6.28
C1::__callStatic bool(false) string(1) "a" string(1) "b" C1::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C1::__callStatic bool(false) string(1) "a" string(1) "b" C1::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C1::__callStatic bool(false) string(1) "a" string(1) "b" C1::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C1::__callStatic bool(false) string(1) "a" string(1) "b" C1::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } C2::__callStatic bool(false) string(1) "a" string(1) "b" C2::__callStatic bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } B3::__callStatic bool(false) string(1) "a" string(1) "b" B3::__call bool(true) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" } Strict Standards: Non-static method A4::foo() should not be called statically in /in/IrT0K on line 129 A4::foo Strict Standards: Non-static method A4::foo() should not be called statically in /in/IrT0K on line 130 A4::foo bool(false) string(3) "foo" array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(1) "d" }

preferences:
208.18 ms | 409 KiB | 269 Q