ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
在没有继承时候,你用self::class 和 static::class是一样的,都是获取当前类名 PHP 类中,self指向的是当前方法存在的这个类,也就是父类。static指向的是最终那个子类 ~~~php 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;//P echo C::getChild(), PHP_EOL;//C ~~~ 无论是self还是static,都无法获取当前trait名 在trait中操作static属性,无论是self还是static,指向的都是那个类的static属性。而只有直接使用`trait名::静态属性`,可以指向到当前trait中存储静态属性 ~~~php 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);//[] [a=>1,b=>2] [a=>1,b=>2] echo PHP_EOL, '[self]', PHP_EOL; var_dump(T::$data2, A::$data2, B::$data2);//[] [a=>1,b=>2] [a=>1,b=>2] echo PHP_EOL, '[T]', PHP_EOL; var_dump(T::$data3, A::$data3, B::$data3);//[a=>1,b=>2] [] [] ~~~