静态方法和静态属性的定义
用static关键字修饰的属性称为静态属性
用static关键字修饰的方法称为静态方法
静态属性和静态方法的特性
- 静态属性或方法是和类相关的,而不是和类的某个特定实例(对象)相关,因此这类属性或方法也称为“类属性”或“类方法”;
- 静态属性和方法,在类被调用(类被创建或者类中的任何静态成员被调用)时创建。
- 静态属性,在内存中只有一份,为所有的实例公用;
- 静态方法不能调用非静态属性,也不能使用$this获取非静态属性的值。
静态属性和静态方法的使用
如果访问控制权限允许,可不必创建该类对象而直接使用类名加两个冒号“::”调用静态属性和静态方法;
调用语法:类名[或self]::静态属性名(静态方法名),而且在类内部强烈建议用self::
来调用。
当一个类中有非静态方法被self::调用时,系统会自动将这个方法转换为静态方法(限PHP5.6以前)5.4开始就开始报错但也出来。
<?php
class Person{
public $name="李四";
public static $age=22; //静态属性$age
// public function intro()
// {echo "我的名字叫".$this->name,"<br/>";}
public static function intro()
{
//类的内部访问静态属性 self访问
echo "我的年龄".self::$age."<br/>";
//单用类名访问 但是不推荐 如果你变了类名就傻逼了
echo "我的年龄".Person::$age."<br/>";
//静态方法里调用静态方法
echo self::Age();
}
/**
* 如果PHP7不声明static方法 用类的方式调用
* 报错Deprecated: Non-static method Person::setAge() should not be called statically
* 结果还是能正常出现
*/
public function setAge($age=24)
{
self::$age=$age;
}
public function getAge(){
echo "年龄是".self::$age,"<br/>";
}
public static function age(){
echo "年龄是".self::$age,"<br/>";
}
public static function newfunc()
{ //演示错误的方法
echo $this->name;
// Uncaught Error: Using $this when not in object context
}
}
//正常访问李四的属性
$lisi=new person();
//echo $lisi->name;
//类名::静态属性
echo Person::$age,"<br/>";
echo Person::intro();
Person::setAge(100);
Person::getAge();
$lisi->getAge(); //这种方式还是正常的
Person::newfunc(); //到了这里直接报错
static 在基础语法里 还可以修饰变量,称为静态变量
<?php
function count1()
{
$num=0;
echo '$num='.$num++,"<br/>";
//每次调用结束后 $num就会被释放掉
}
count1();
count1();
function newCount()
{
static $num=0;
echo '$newNum='.$num++,"<br/>";
//static修饰成静态变量。只要程序没结束 内存中指存在一份
}
newCount();newCount();