当class是动态属性时,为什么我无法访问类的静态属性

时间:2012-11-09 17:59:59

标签: php

为什么我不能像这样通过类A的动态属性从类B调用常量?难道我做错了什么?     

class A {
    public $class_b;
}

class B {
    const CONST_VAR = 'b';
}

$class_a = new A();
$class_a->class_b = new B();

echo $class_a->class_b::CONST_VAR;

PHP Parse错误:语法错误,意外T_PAAMAYIM_NEKUDOTAYIM,期待','或';'在第14行的/root/1.php中

然而,这样称呼它是好的:

$b = $class_a->class_b;
echo $b::CONST_VAR;

1 个答案:

答案 0 :(得分:1)

类常量是静态的。 $ class_b变量中有一个B类实例,所以你不应该通过类A访问它,除非你在类B中创建一个返回常量的非静态函数。例如:

class B {
    const CONST_VAR = 'b';

    function get_constant() {
        return self::CONST_VAR;
    }
}

现在你可以使用:

 $class_a = new A();
 $class_a->class_b = new B();
 $class_a->class_b->get_constant();

但除非你计划重载b类,否则没有理由这样做,因为你可以使用B :: CONST_VAR;

 echo B::CONST_VAR; // prints 'b'

在这里阅读类常量:http://php.net/manual/en/language.oop5.constants.php

应该注意的是,从php 5.3.0开始,常量可以通过你建议的实例访问,$ b :: CONST_VAR,但这不是应该如何使用常量,而且最有可能只是为了支持糟糕的编程而添加