public function test() { // FPushClsMethodD C2::__call("a", "b", "c", "d"); C2::foo("a", "b", "c", "d"); // FPushClsMethod $cls = 'C2'; $cls::__call("a", "b", "c", "d"); $cls::foo("a", "b", "c", "d"); $fn = '__call'; C2::$fn("a", "b", "c", "d"); $fn = 'foo'; C2::$fn("a", "b", "c", "d"); $fn = '__call'; $cls::$fn("a", "b", "c", "d"); $fn = 'foo'; $cls::$fn("a", "b", "c", "d"); // FPushClsMethodF self::__call("a", "b", "c", "d"); self::foo("a", "b", "c", "d"); }
<?php trait T { function info() { (yield __METHOD__); (yield __CLASS__); (yield __TRAIT__); } } class C1 { use T; } class C2 { use T; } $o1 = new C1(); foreach ($o1->info() as $info) { var_dump($info); } $o2 = new C2(); foreach ($o2->info() as $info) { var_dump($info); }
function main2() { $obj = new C2(); $obj->test(); }
{ echo "B2::bar\n"; } public function baz() { $this->bar(); } } class C2 extends B2 { public function bar() { echo "C2::bar\n"; } } $obj = new C2(); $obj->baz(); class A3 { private function bar() { echo "A3::bar\n"; } } class B3 extends A3 { protected function bar() { echo "B3::bar\n"; } public function baz()
<?php error_reporting(E_ALL); trait Counter { public function inc() { static $c = 0; $c = $c + 1; echo "{$c}\n"; } } class C1 { use Counter; } class C2 { use Counter; } $o = new C1(); $o->inc(); $o->inc(); $p = new C2(); $p->inc(); $p->inc();
<?php class C1 { public function __call($name, $params) { return null; } } class C2 extends C1 { } $v = new C2(); $v->m();
public static $x = 1; public function printX() { var_dump(self::$x); } } class C1 { use T; } class C2 { use T; } $o1 = new C1(); $o2 = new C2(); var_dump(T::$x); var_dump(C1::$x); var_dump(C2::$x); $o1->printX(); $o2->printX(); T::$x++; var_dump(T::$x); var_dump(C1::$x); var_dump(C2::$x); $o1->printX(); $o2->printX(); C1::$x++; var_dump(T::$x); var_dump(C1::$x); var_dump(C2::$x);
{ protected abstract function gpc(); public function gen() { (yield $this->gpc()); } } class C1 { use T; protected function gpc() { return 1; } } class C2 { use T; protected function gpc() { return 2; } } $obj1 = new C1(); $obj2 = new C2(); $c1 = $obj1->gen(); $c2 = $obj2->gen(); $c1->next(); var_dump($c1->current()); $c2->next(); var_dump($c2->current());
{ protected $p; static function make() { return new static(); } } class C2 extends C1 { static function f1() { $c = parent::make(); $c->p = 2; } static function f2() { $c = self::make(); $c->p = 2; echo $c->p; } static function f3() { $c = self::make(); $c->p = 2; echo $c->p; } } C2::f1(); C2::f2(); C2::f3();
{ } } $x = new C1(); var_dump($x()); var_dump($x->__invoke()); $x(); $x->__invoke(); $x = function () { return 0; }; var_dump($x()); var_dump($x->__invoke()); $x(); $x->__invoke(); $x = new C2(); $a = $b = $c = $d = 1; $e =& $x($a); $e = 2; var_dump($a); $e =& $x->__invoke($b); $e = 3; var_dump($b); $x($b); $x->__invoke($b); $x = function &(&$a) { return $a; }; $e =& $x($c); $e = 4; var_dump($c);
} function __get($var) { echo "C8::__get({$var})\n"; return $this->g($var); } function g($var) { echo "C8::g({$var})\n"; return $this->{$var}; } } $c1 = new C1(); $c1->f1(); var_dump($a1); $c1->f2(); $c1->f3(); $c2 = new C2(); $c2->f1(); $c3 = new C3(); $c3->f1(); $c4 = new C4(); $c4->f1(); $c5 = new C5(); $c5->f1(); $c6 = new C6(); $c6->f1(); $c7 = new C7(); $c7->f1(); $c8 = new C8(); $c8->f1();
<?php class C1 { protected $p; } class C2 extends C1 { static function f(C2 $c) { $c->p = 2; } } $c = new C2(); C2::f($c);