【问题标题】:Why I can't access static property of a class when class is a dynamic property为什么当类是动态属性时我无法访问类的静态属性
【发布时间】:2012-10-30 02:10:49
【问题描述】:

为什么我不能像这样通过 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 解析错误:语法错误,意外的 T_PAAMAYIM_NEKUDOTAYIM,需要 ',' 或 ';'在第 14 行的 /root/1.php 中

不过这样称呼也不错:

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

【问题讨论】:

  • @hakre 我认为他想要更像($class_a->class_b)::CONST_VAR 的东西(尽管我不知道这是否是有效的语法)。我相信您提出的声明评估为$class_a->b,这不是意图。
  • 更好的问题是为什么要以这种方式访问​​类常量?

标签: php


【解决方案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,但这不是常量的使用方式,很可能只是为了支持不良编程而添加的.

【讨论】:

    猜你喜欢
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 2011-06-11
    相关资源
    最近更新 更多