PHP - 在构造函数中将类常量值分配给属性

7
我一直试图创建一个简单的类,将默认属性值定义为类常量放在类定义顶部。 然而,我的代码似乎没有在构造函数中将常量的值分配给属性。
class Tester {
    const DEFAULT_VAL = 500;

    private $val;

    public function __construct() {
        $val = self::DEFAULT_VAL;
    }

    public function show_val() {
        echo "DEFAULT_VAL is " . self::DEFAULT_VAL . "<br />";
        echo "val is " . $val;
    }
}

$obj = new Tester();
$obj->show_val();

运行上述代码将产生以下结果:
const is 500
val is 

我无法理解为什么我不能在构造函数中将预定义的、常量默认值赋给属性。
2个回答

6

你需要在代码中两个地方使用$this->val代替$val,因为每个Tester的实例都有自己的val:

class Tester {

    const DEFAULT_VAL = 500;

    private $val;

    public function __construct() {
        $this->val = self::DEFAULT_VAL;
    }

    public function show_val() {
        echo "DEFAULT_VAL is " . self::DEFAULT_VAL . "<br />";
        echo "val is " . $this->val;
    }
}

$obj = new Tester();
$obj->show_val();

结果

DEFAULT_VAL is 500
val is 500

我知道这一定是件简单的事情。在PHP中没有做过太多的面向对象编程,但感谢您的快速回复! - djentastic
您可以定义属性的默认值,请参见 https://dev59.com/61_Va4cB1Zd3GeqPPgwJ#8779542 - hakre

3
只要默认值是一个常量(表达式),您可以在属性定义中注明它:
class Tester
{
    const DEFAULT_VAL = 500;

    private $val = self::DEFAULT_VAL;

    public function __construct() {
    }
}

这样做的好处是,当对象被构造时,它已经被设置好了,所以你不需要编写代码来设置它。 演示

好的,知道了,感谢回复。不过我在构造函数中这样做是因为我打算允许在构造函数中显式设置此值,否则使用默认值。 - djentastic
1
这就是为什么你在构造函数之前预定义它的原因。你仍然可以更改它。 - hakre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接