我在类中有一个方法,我想在其中初始化一个静态变量。
1 /当我初始化变量,然后使用$this
关键字将其影响到其他值时,它可以工作。例如。:
class Test {
// ...
function test($input_variable)
{
static $my_static_variable = null;
if (!isset($my_static_variable))
$my_static_variable = $this->someFunction($input_variable);
// ... some further processing
}
}
2 /但是,当我尝试使用$this
关键字直接初始化/构造变量时,会出现语法错误:unexpected '$this' (T_VARIABLE)
:
class Test {
// ...
function test($input_variable)
{
static $my_static_variable = $this->someFunction($input_variable); // *** syntax error, unexpected '$this' (T_VARIABLE)
// ... some further processing
}
}
是1 /初始化静态变量的好方法吗?为什么2 /不允许,因为它应该做的完全相同的事情比1 /?
我正在使用PHP 5.5.21(cli)(内置:2016年7月22日08:31:09)。
谢谢
你不能在静态变量上使用$this
。您可以使用self
和范围分辨率运算符(::)代替。
这是一个例子:
class Foo {
public static $my_stat;
static function init() {
self::$my_stat= 'My val';
}
}
无需实例化类即可访问静态变量和函数。您不能使用$ this来访问声明为static的变量或函数。您必须使用范围解析operator ::来访问声明为static的变量和函数。
对于变量: -
class A
{
static $my_static = 'foo';
public function staticValue() {
return self::$my_static;// Try to use $this here insted of self:: you will get error
}
}
class B extends A
{
public function fooStatic() {
return parent::$my_static;
}
}
使用以下内容访问变量: -
print A::$my_static
功能: -
class A {
public static function aStaticMethod() {
// ...
}
}
您可以按如下方式调用该函数: -
A::aStaticMethod();
我想我有答案。在php documentation中,陈述如下:
可以声明静态变量,如上面的示例所示。从PHP 5.6开始,您可以为这些变量赋值,这些变量是表达式的结果,但是您不能在此处使用任何函数,这将导致解析错误。
所以我想这也适用于PHP 5.5。
正如@MagnusEriksson指出的那样,我也可以使用类属性。但是,除了test()
方法之外,我不希望在其他地方访问我的变量。
顺便说一句,在某种程度上,doc中的静态属性也是如此:
使用箭头运算符 - >无法通过对象访问静态属性。
与任何其他PHP静态变量一样,静态属性只能在PHP 5.6之前使用文字或常量进行初始化;表达式是不允许的。在PHP 5.6及更高版本中,相同的规则适用于const表达式:一些有限的表达式是可能的,只要它们可以在编译时进行评估。