在 PHP 里,在没有继承时候,你用self::class 和 static::class是一样的,都是获取当前类名。
但是如果用到了继承,并且这个方法写在了父类里,你想要分别获取当前父类名和未知的子类名,就要按照下面的方法进行获取。
在 PHP 类中,self指向的是当前方法存在的这个类,也就是父类。static指向的是最终那个子类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class P { public static function getParent() { return self:: class ; } public static function getChild() { return static :: class ; } } class C extends P { } echo C::getParent(), PHP_EOL; echo C::getChild(), PHP_EOL; |
运行结果:
1 2 | P C |
你以为这样就结束了?不不不……
今天心血来潮,写到一个功能,可能会用到trait的static,写了代码测试了下……代码就不贴了,没错,无论是self还是static,都无法获取当前trait名。
但是这不是重点,重点是下面的。我想要在trait中操作static属性,由于不清楚到底会指向谁,所以写了代码进行测试。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | trait T { public static $data1 = []; public static $data2 = []; public static $data3 = []; public function setData( $name , $value ) { static :: $data1 [ $name ] = $value ; self:: $data2 [ $name ] = $value ; T:: $data3 [ $name ] = $value ; } } class A { use T; } class B extends A { } $a = new A; $b = new B; $a ->setData( 'a' , 1); $b ->setData( 'b' , 2); echo '[static]' , PHP_EOL; var_dump(T:: $data1 , A:: $data1 , B:: $data1 ); echo PHP_EOL, '[self]' , PHP_EOL; var_dump(T:: $data2 , A:: $data2 , B:: $data2 ); echo PHP_EOL, '[T]' , PHP_EOL; var_dump(T:: $data3 , A:: $data3 , B:: $data3 ); |
运行结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | [ static ] array (0) { } array (2) { [ "a" ]=> int(1) [ "b" ]=> int(2) } array (2) { [ "a" ]=> int(1) [ "b" ]=> int(2) } [self] array (0) { } array (2) { [ "a" ]=> int(1) [ "b" ]=> int(2) } array (2) { [ "a" ]=> int(1) [ "b" ]=> int(2) } [T] array (2) { [ "a" ]=> int(1) [ "b" ]=> int(2) } array (0) { } array (0) { } |
在trait中操作static属性,无论是self还是static,指向的都是那个类的static属性。而只有直接使用trait名::静态属性,可以指向到当前trait中存储静态属性。
友情提示:垃圾评论一律封号...