Chr*_*cob 163 php class-design constants object static-members
在PHP5中,使用const
和有static
什么区别?什么时候适合?和什么样的作用呢public
,protected
和private
游戏-如果有的话.
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)
公共,受保护和私人在竞争方面(总是公开的)是无关紧要的; 它们仅对类变量有用,包括静态变量.
编辑:重要的是要注意PHP 7.1.0引入了对指定类常量可见性的支持.
小智 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)
Mik*_*din 10
常量只是一个常数,即在声明后不能更改其值.
无需创建类的实例即可访问静态变量,因此可以在类的所有实例之间共享.
此外,函数中可以有一个静态局部变量,只声明一次(在第一次执行函数时)并且可以在函数调用之间存储它的值,例如:
function foo()
{
static $numOfCalls = 0;
$numOfCalls++;
print("this function has been executed " . $numOfCalls . " times");
}
Run Code Online (Sandbox Code Playgroud)
在谈论类继承时,您可以使用self
和static
关键字来区分不同作用域中的常量或变量。检查此示例,该示例说明了如何访问内容:
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上阅读有关后期静态绑定的更多信息。
还要在这里和这里检查另一个问题的答案。