静态变量成员和方法

Posted Just do it

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态变量成员和方法相关的知识,希望对你有一定的参考价值。

静态变量

  静态变量是只存在于函数作用域的变量,不过,在函数执行完成以后,这种变量的值不会丢失,也就是说,在下一次调用这个函数时,变量仍然会记得原来的值.

  要将某个变量定义为静态的,只需要在变量前面加上static关键字即可.

function test(){
    static $a = 1;
    $a *= 2;
    echo $a.\'<br/>\';
}
test();
test();
test();
//结果 2  4  8

  值得注意的是,变量的初始默认值为1,而这一赋值操作只会在变量第一次被初始化时发生.函数每次执行的过程中,这一操作不会被调用.

类中静态元素的使用

静态成员

  静态成员是一种类变量,可以把它看成是属于整个类而不是属于类的某个实例.与一般的实例变量不同的是,静态成员只保留一个变量值,而这个变量值对所有的实例都是有效的,也就是说,所有的实例共享这个成员.

class MyObject{
    public static $myStaticVar = 0;

    function myfunc(){
        self::$myStaticVar += 2;
        echo self::$myStaticVar .\'<br/>\';
    }
}
$instance1 = new MyObject();
$instance1->myfunc();
$instance2 = new MyObject();
$instance2->myfunc();

//结果 2  4
View Code

双冒号

  作用域限定操作符,是用一个双冒号(::)来表示的,它被用来指定类中不同的作用域级别.这个操作符的左边表示的是作用域,右边表示的访问的成员.

  通过作用域限定操作符,我们可以使用两个系统定义的作用域:self和parent.此外,php6还提供了static作用域.

使用self作用域访问父类中的函数:

class MyObject{
    static function myBaseFunc(){
        echo "I am declared in MyObject<br/>";
    }
}

class MyExtendObject extends MyObject{
    static function myExtendFunc(){
        echo "myExtendFunc is declared in MyExtendObject<br/>";
        self::myBaseFunc();
    }
}

MyExtendObject::myExtendFunc();
//结果
//myExtendFunc is declared in MyExtendObject
//I am declared in MyObject
View Code

在基类的方法被重写的情况下,调用定义的基类中的方法:

class MyObject{
    function myMethod(){
        //标准功能
        echo "Standard Function<br/>";
    }
}

class MyExtendObject extends MyObject{
    function myMethod(){
        //添加一些新
        echo "New Function<br/>";
        parent::myMethod();
    }
}

$obj = new MyExtendObject();
$obj->myMethod();
//结果
//New Function
//Standard Function
View Code

子类重写静态变量

class MyObject{
    public static $myStaticVar = 0;
    static function myMethod(){
        self::$myStaticVar +=2;
        echo self::$myStaticVar."<br/>";
    }
}

class MyExtendObject extends MyObject{
    //重写了myStaticVar
    public static $myStaticVar = 0;
    function myExtendMethod(){
        echo parent::$myStaticVar."<br/>";
        echo self::$myStaticVar."<br/>";
    }
}
$instance1 = new MyObject();
$instance1->myMethod();
MyObject::myMethod();
//调用的非静态成员函数会有警告
MyExtendObject::myExtendMethod();
/*
2
4
Strict Standards: Non-static method MyExtendObject::myExtendMethod() should not be called statically in C:\\phpStudy\\wwwroot\\test\\test.php on line 23
4
0
*/
View Code

  在使用::操作符访问myVariable变量时,需要再次注意对$符号的使用.这是因为PHP当前不支持动态的静态变量的使用,也就是说不支持可变的静态变量.在使用$this->$variable时,被访问的成员是包含在$variable中的变量值.而不用$符号访问某个变量实际上查找的是类的某个常量,而常量是不能通过$this来访问的.

静态方法

  静态方法的规则和静态变量是相同的.使用static关键字可以将方法标记为静态方法,而通过类的名称和作用域操作符(::)可以访问静态方法.

  静态方法和非静态方法之间有一个很重要的区别:在调用静态方法时,我们不再需要拥有类的实例.

调用静态方法:

class MyObject{
static function myMethod(){
    //执行一些操作
   }
}

MyObject::myMethod();

PHP6中的static作用域

class MyObject{
    static function myMethod(){
        static::myOtherMethod();
    }
    static function myOtherMethod(){
        echo "Called from MyObject";
    }
}

class MyExtendObject extends MyObject{
    
    static function myOtherMethod(){
        echo \'Called from MyExtendObject\';
    }
}
MyExtendObject::myMethod();
//结果
//Called from MyExtendObject
View Code

  上述代码会正确地调用MyExtendObject中的myOtherMethod方法.在PHP6之前的版本中,从父类中调用位于子类中的方法是不可能的,并且self::总是会调用MyObject中的方法.

静态方法和非静态方法选择原则

  如果某个方法中不包括$this变量,那么这个方法就应该是静态方法.如果不需要类的实例,可能还应该使用静态类,这样就可以免去实例化类的工作.另外,在静态方法中是不能使用$this变量的,因为静态方法不属于某个特定的实例.

 

以上是关于静态变量成员和方法的主要内容,如果未能解决你的问题,请参考以下文章

区分成员变量和类变量,this关键字,封装,静态方法和静态代码块,通通给我看懂(概念版) 后续有相关示例

区分成员变量和类变量,this关键字,封装,静态方法和静态代码块,通通给我看懂(概念版) 后续有相关示例

区分成员变量和类变量,this关键字,封装,静态方法和静态代码块,通通给我看懂(概念版) 后续有相关示例

Java中成员变量局部变量全局变量静态变量成员变量

Java中成员变量局部变量全局变量静态变量成员变量

Java类的各种成员初始化顺序如:父子类继承时的静态代码块,普通代码块,静态方法,构造方法,等先后顺