ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
>[danger] 不需要实例化就可以直接调用 > 只存在于函数作用域的变量,函数执行之后变量的值不会丢失,只会初始化一次,初始化静态变量不能使用表达式,不用**全局变量**代替是因为全局变量会被所有函数访问容易造成维护不宜。 static修饰的属性和方法 类内: self::$属性名 self::方法名() 类外部: 类名::属性名 类名::方法名() const是常量 值不能修改了 static是静态成员 可以在不实例化得情况下 在类外直接访问 CONST不行 ``` class demo{ public static $name='张三'; public static $login=0; public static function son(){ echo self::$name.':'.self::$login; self::$login++; self::$login+=5; } } demo::son(); demo::son(); demo::son(); //输出 => 张三:0张三:6张三:12 ``` >[danger]静态方法中,$this伪变量不允许使用。可以使用self,parent,static在内部调用静态方法与属性: 静态方法也可以通过变量来进行动态调用: ``` class Car { private static $speed = 10; public static function getSpeed() { return self::$speed; } } $func = 'getSpeed'; $className = 'Car'; echo $className::$func(); //动态调用静态方法相当于Car::getSpeed(); ``` **作用**:static不管在类中还是函数中都会记住静态的值不会被销毁(一般函数执行完就销毁了) 1、不需要实例化就可以直接用self::静态方法名”或者“”类外可以使用“类名::静态方法名”调用; 2、静态属性、方法一个公用不管实例化多少次,静态方法都直接加载到内存的一个固定空间里,在内存中只有一份,为所有的实例共用;普通方法 你的方法调用需要先实例化类 然后 这部操作会在 内存中 另开辟空间 来存放这部分空间也省掉了~就是省资源 3、static 的属性和方法,只能访问static的属性和方法,不能类访问非静态的属性和方法。因为静态属性和方法被创建时,可能还没有任何这个类的实例可以被调用。 4、静态方法不能调用非静态属性。因为非静态属性需要实例化后,存放在对象里; 5、静态方法可以调用非静态方法,使用 self 关键词,一个方法被self:: 后,它就自动转变为静态方法; 什么情况下静态变量:在对象之间共享值时 方便访问变量时 ``` class Person { // 申明静态方法 public static function demo() { echo '你好<br>'; } public function demo1() { // 类内调用静态方法 self::demo(); } } // 在类外调用静态方法 Person::demo();//不实例化可以直接调用 $p = new Person;//实例化 // 调用demo1方法 $p->demo1();//你好 $p->demo();//你好 //类外直接调用static $p::demo();//你好 ``` 在类中使用static有两种主要用途、定义静态成员和定义静态方法。静态成员只保留一个变量的值,这个值对所有实例都是有效的,如下: ``` class MyObject{ public static $myStaticVar=0; function myMethod(){ self::$myStaticVar+=2; echo self::$myStaticVar; } } $instance1=new MyObject();//实例化一次 $instance1->myMethod(); $instance2=new MyObject();//再实例化 $instance2->myMethod(); //结果将分别打印2、4 class Person { // 申明静态属性 public static $name = '欧巴'; // self:自己 // 类内获取静态属性(self::属性名) public function getInfo() { return self::$name; } } // 实例化Person类 // $p = new Person; // echo $p->name; // Accessing static property Person::$name as non static使用非静态方式获取静态属性 // 在类的外部获取静态属性(类名::属性名) echo Person::$name; ------------------------------------------------------------------------------ class test { const constvar='hello world'; static $staticvar='hello world'; function getStaticvar(){ return self::$staticvar; } } $obj=new test(); echo test::constvar //输出'hello world' echo test::staticvar //出错,staticvar 前必须加$才能访问,这是容易和类常量(per-class常量)容易混淆的地方之一 echo test::$staticvar //输出'hello world' $str='test'; echo $str::$staticvar //出错,类名在这不能用变量动态化 echo $str::constvar //出错原因同上 //在类名称存在一个变量中处于不确定(动态)状态时,只能以以下方式访问类变量 $obj2=new $str(); echo $obj2->getStaticvar(); <?php class Book{ static $num=0; public function showMe(){ echo"您是滴".self::$num."位访客"; self::$num++; } } $book1=new Book(); $book1->showMe(); echo"<br>"; $book2=new Book(); $book2->showMe(); echo"<br>"; echo"您是滴".Book::$num."位访客"; ?> ```