静态方法和静态属性的定义

用static关键字修饰的属性称为静态属性

用static关键字修饰的方法称为静态方法

静态属性和静态方法的特性

  1. 静态属性或方法是和类相关的,而不是和类的某个特定实例(对象)相关,因此这类属性或方法也称为“类属性”或“类方法”;
  2. 静态属性和方法,在类被调用(类被创建或者类中的任何静态成员被调用)时创建。
  3. 静态属性,在内存中只有一份,为所有的实例公用;
  4. 静态方法不能调用非静态属性,也不能使用$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();
Last modification:January 6, 2020
如果觉得我的文章对你有用,请随意赞赏