在php对象中,为什么只能使用::表示法访问静态变量,但为什么可以从::&->调用静态方法呢?

时间:2018-12-23 00:59:41

标签: php function oop static

在PHP中,例如您可以在类中定义静态的变量和方法。对于它的对象,为什么我们只能使用::表示法访问变量,而我们却可以同时使用->或:: ::来运行静态方法?为什么会有这种双重行为?

class first {
    //variable
    public static $var=5;

    //method
    static function new(){
        echo "<br>";
        echo self::$var;
        echo "<br>";
    }
}

class second {

}

$obj = new first();

echo $obj->$var; // this throws an error
echo $obj::$var; // this runs
$obj->new(); // this also runs
$obj::new(); // this runs

1 个答案:

答案 0 :(得分:0)

尽管是任意的,但静态类变量仅属于类,而不属于对象。 静态类方法既属于类又属于该类的对象。

如下所示,更改类的静态变量将在该类的所有实例中更改该变量。因此,->符号将是欺骗性的。静态类方法不会发生这种情况。

想象一下->将被允许用于静态变量,然后

调用$ someObjectOfTypeX-> some_static_variable ='some_value'会更改$ anotherObjectOfTypeX的状态。

但是,调用$ someObjectOfTypeX-> someStaticFunction()不会更改$ anotherObjectOfTypeX的状态。

尽管关键字static是相同的,但它对函数和变量具有不同的含义。静态变量由类的所有实例共享。静态函数不会更改对象状态,因此也不会更改同一类的其他实例的状态。

<?php

class first
{
    //variable
    public static $var = 5;

    //method
    static function new()
    {
        echo "<br>";
        echo self::$var;
        echo "<br>";
    }
}

$obj1 = new first();
$obj2 = new first();

echo $obj1->var; // this throws an error
echo $obj1::$var; // this runs
echo first::$var; // this runs

$obj2::$var = 10; // changes $var in class first (both object $obj1 and object $obj2)
$obj2->var = 15; // this throws an error (if it didn't it would change the variable also in $obj1)

$obj1->new(); // this also runs
$obj1::new(); // this runs
first::new(); // this runs