为什么在类级别可以访问公共方法

时间:2018-10-18 14:07:47

标签: php

考虑此示例,

class A {
        public function who() {
            echo 'The name of the class is ' . __CLASS__;
        }
    }
A::who();

输出:该类的名称为A

还有,

class A {
        public $vars=12;
    }
echo A::$vars;

会导致以下错误,

  

致命错误:未捕获错误:访问未声明的静态属性:   A :: $ var在G:\ xampp \ htdocs \ Learn_PHP \ PHP1 \ name_class.php:10堆栈中   跟踪:抛出#0 {main}   G:\ xampp \ htdocs \ Learn_PHP \ PHP1 \ name_class.php在第10行

发生了什么事?为什么可以通过类访问公共方法? 为何财产不会发生同样的事情?

2 个答案:

答案 0 :(得分:1)

从php.net页上的“范围解析运算符”:

  

范围解析运算符(也称为Paamayim Nekudotayim),或更简单地说,是双冒号,是一种令牌,可以访问类的静态,常量和重写属性或方法。

您的函数是一种方法,因此可以使用::。但是,变量不是静态的或常量的,也不是父类的重写属性。因此,::的使用将无效。

文档中的整页:https://secure.php.net/manual/en/language.oop5.paamayim-nekudotayim.php

答案 1 :(得分:0)

要使第二个示例像第一个示例一样工作,只需将其更改如下

 class A {
        public static $vars=12;
    }
    echo A::$vars;

通过将“静态”添加到属性,因为您是以静态方式调用它的。

实际上,从第一个示例开始,PHP允许以静态方式调用静态方法,但不允许静态变量。

根据文档,此行为将在PHP 7中更改

  

警告在PHP 7中,不建议静态调用非静态方法,   并会生成E_DEPRECATED警告。支持通话   将来可能会删除静态的非静态方法。

请查看此URL Static keyword in PHP