【发布时间】:2011-05-27 16:55:51
【问题描述】:
为什么在类中创建变量时不能使用defines?我能做些什么来克服这个问题? (定义是表前缀(db))
像这样:
class foo {
public $bar = FOO."bar";
}
这给了我以下错误:
解析错误:语法错误,意外 '.',期待 ',' 或 ';'
【问题讨论】:
-
它叫做constant,
define()是制作常量的函数。
为什么在类中创建变量时不能使用defines?我能做些什么来克服这个问题? (定义是表前缀(db))
像这样:
class foo {
public $bar = FOO."bar";
}
这给了我以下错误:
解析错误:语法错误,意外 '.',期待 ',' 或 ';'
【问题讨论】:
define()是制作常量的函数。
您只能使用常量表达式声明属性。在这里,连接运算符是非法的(因此会出现解析错误),而不是 FOO 常量。
public $bar = FOO."bar";
解决这个问题的一种方法是在构造函数中对其进行初始化。您仍然可以使用该常量,并将其与您的字符串连接起来。
class foo {
public $bar;
public function __construct() {
$this->bar = FOO."bar";
}
}
【讨论】:
并不是你不能使用defines。初始化变量时不能使用运算符。
【讨论】:
可以使用构造函数来初始化值:
<?php
define("FOO", "test");
class foo {
public $bar;
function __construct()
{
$this->bar = FOO . "bar";
}
}
var_dump(new foo());
【讨论】:
如上所述,不能使用运算符定义类变量,如果值需要是动态的,那么赋值必须发生在函数中。
使用常量时,使用类常量而不是在全局范围内定义常量会很有用。它们使用关键字const 定义,并使用self:: 运算符进行访问。
class foo
{
const BAR = 'test';
public $baz;
public function __construct()
{
$this->baz = self::BAR . 'bat';
}
}
类常量也可以在实例外部静态访问:foo::BAR,因此您可以在其他上下文中使用类中的常量,但不会像define 定义的常量那样自动在全局范围内。
$some_var = foo::BAR;
echo $some_var;
// output: test
【讨论】: