在php对象中,为什么静态变量只能通过::notation访问,而静态方法可以从以下两个方面调用::&-&燃气轮机;

在php对象中,为什么静态变量只能通过::notation访问,而静态方法可以从以下两个方面调用::&-&燃气轮机;,php,function,oop,static,Php,Function,Oop,Static,例如,在PHP中,您在类中定义了一个变量&静态方法。对于它的对象,为什么我们只能使用::符号访问变量,而可以使用->或::两者运行静态方法?为什么会有这种双重行为 class first { //variable public static $var=5; //method static function new(){ echo "<br>"; echo self::$var; echo "<br

例如,在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
第一类{
//变数
公共静态$var=5;
//方法
静态函数new(){
回声“
”; echo self::$var; 回声“
”; } } 二等{ } $obj=新的第一个(); echo$obj->$var;//这会抛出一个错误 echo$obj::$var;//这运行 $obj->new();//这也在运行 $obj::new();//这运行
尽管静态类变量是任意的,但它只属于类,而不属于对象。 静态类方法同时属于类和该类的对象

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

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

调用$someObjectOfTypeX->some_static_variable='some_value'将更改$OtherObjectOfTypex的状态

但是,调用$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

我想知道这个问题是否有问题?对这个问题的支持率很低。正如它所写的,它听起来是基于观点的。除了“它就是这样设计的”之外,没有其他答案。如果你想详细说明你的困惑,有人会解释PHP不是一种编译语言。@mario那么你的意思是说oop是如何设计的,还是仅仅是PHP??在编译或解释语言中有什么意义呢?您说过,尽管是任意的,但静态类变量只属于类,而不属于对象。静态类方法同时属于类和该类的对象。但是static是一个关键字,我们可以使用它在该类的所有实例中共享一些属性或方法。这适用于属性和方法,也就是说,它们都属于一个类和方法。但我想问的是,为什么我们可以同时使用->&::访问方法,而在属性的情况下只能使用::访问方法。@Sitepose我扩展了我的答案,并解释了static关键字对变量和方法有不同的含义。