PHP5:const vs static

Chr*_*cob 163 php class-design constants object static-members

在PHP5中,使用const和有static什么区别?什么时候适合?和什么样的作用呢public,protectedprivate游戏-如果有的话.

Mat*_*ins 183

在类的上下文中,静态变量位于类作用域(而不是对象)作用域上,但与const不同,它们的值可以更改.

class ClassName {
    static $my_var = 10;  /* defaults to public unless otherwise specified */
    const MY_CONST = 5;
}
echo ClassName::$my_var;   // returns 10
echo ClassName::MY_CONST;  // returns 5
ClassName::$my_var = 20;   // now equals 20
ClassName::MY_CONST = 20;  // error! won't work.
Run Code Online (Sandbox Code Playgroud)

公共,受保护和私人在竞争方面(总是公开的)是无关紧要的; 它们仅对类变量有用,包括静态变量.

  • 可以通过ClassName :: $ variable在任何地方访问公共静态变量.
  • 保护的静态变量可以通过定义类访问,也可以通过ClassName :: $ variable扩展类.
  • 私有静态变量只能由定义类通过ClassName :: $ variable访问.

编辑:重要的是要注意PHP 7.1.0引入了对指定类常量可见性的支持.

  • 我更喜欢使用`self :: $ variable`来保护静态和私有静态变量,因为我更喜欢在类的最开头只保留一次提到的类名. (27认同)
  • 是的,好的一点,我忽略了提到如果从类本身引用的话,可以使用self关键字.我在上面提供的示例是在类定义之外执行的,在这种情况下必须使用类名. (3认同)
  • 静态 var 不需要 `$` 吗?`static $my_var = 10;` 在定义中 (2认同)

小智 19

最后一点应该是const始终是静态的和公共的.这意味着您可以从类中访问const,如下所示:

class MyClass
{
     const MYCONST = true;
     public function test()
     {
          echo self::MYCONST;
     }
}
Run Code Online (Sandbox Code Playgroud)

从课外,您可以像这样访问它:

echo MyClass::MYCONST;
Run Code Online (Sandbox Code Playgroud)

  • 这不再是真的.从PHP 7.1开始,类常量可以声明为private或protected.见[RFC](https://wiki.php.net/rfc/class_const_visibility) (7认同)

Mik*_*din 10

常量只是一个常数,即在声明后不能更改其值.

无需创建类的实例即可访问静态变量,因此可以在类的所有实例之间共享.

此外,函数中可以有一个静态局部变量,只声明一次(在第一次执行函数时)并且可以在函数调用之间存储它的值,例如:

function foo()
{
   static $numOfCalls = 0;
   $numOfCalls++;
   print("this function has been executed " . $numOfCalls . " times");
}
Run Code Online (Sandbox Code Playgroud)


Wil*_*ilt 7

在谈论类继承时,您可以使用selfstatic关键字来区分不同作用域中的常量或变量。检查此示例,该示例说明了如何访问内容:

class Person
{
    static $type = 'person';

    const TYPE = 'person';

    static public function getType(){
        var_dump(self::TYPE);
        var_dump(static::TYPE);

        var_dump(self::$type);
        var_dump(static::$type);
    }
}

class Pirate extends Person
{
    static $type = 'pirate';

    const TYPE = 'pirate';
}
Run Code Online (Sandbox Code Playgroud)

然后执行:

$pirate = new Pirate();
$pirate::getType();
Run Code Online (Sandbox Code Playgroud)

要么:

Pirate::getType();
Run Code Online (Sandbox Code Playgroud)

输出:

string(6) "person" 
string(6) "pirate" 
string(6) "person" 
string(6) "pirate"
Run Code Online (Sandbox Code Playgroud)

换句话说,self::是指静态属性和常量,该静态属性和常量来自被调用该对象的同一作用域(在本例中为Person超类),而static::将在运行时从作用域访问该属性和常量(因此在本例中为Pirate子类)。

在php.net上阅读有关后期静态绑定的更多信息
还要在这里这里检查另一个问题的答案。