企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
**1.对非静态属性的调用** ~~~ class Test {     public $commonProp  = "a commonProp"; } $test = new Test(); var_dump($test->commonProp );//正常: "a commonProp" var_dump($test->$commonProp );//注意:未定义的变量&&致命:无法访问空属性 var_dump($test::commonProp );//致命:未定义的类常量 var_dump($test::$commonProp );//致命:访问未声明的静态属性 var_dump(Test->commonProp );//解析错误,不受期待的"->" var_dump(Test->$commonProp );//解析错误,不受期待的"->" var_dump(Test::commonProp );//致命:未定义的类常量 var_dump(Test::$commonProp );//致命:访问未声明的静态属性 exit; ~~~ **2.对静态属性的调用** ~~~ class Test {     public static $staticProp  = "a staticProp"; } $test = new Test(); var_dump($test->staticProp );//严格标准:对静态属性使用了非静态的调用方式&&注意:未定义的属性, null var_dump($test->$staticProp );//注意:未定义的变量&&致命:无法访问空属性 var_dump($test::staticProp );//致命:未定义的类常量 var_dump($test::$staticProp );//正常: "a staticProp" var_dump(Test->staticProp );//解析错误,不受期待的"->" var_dump(Test->$staticProp );//解析错误,不受期待的"->" var_dump(Test::staticProp );//致命:未定义的类常量 var_dump(Test::$staticProp );//正常: "a staticProp" exit; ~~~ **3.对类常量的调用** ~~~ class Test {     const constant = "a constant" ; } $test = new Test(); var_dump($test->constant );//注意:未定义的属性, null var_dump($test->$constant );注意:未定义的变量&&致命:无法访问空属性 var_dump($test::constant );//正常: "a constant" var_dump($test::$constant );//致命:访问未声明的静态属性 var_dump(Test->constant );//解析错误,不受期待的"->" var_dump(Test->$constant );//解析错误,不受期待的"->" var_dump(Test::constant );//正常: "a constant" var_dump(Test::$constant );致命:访问未声明的静态属性 exit; ~~~ 4.对普通方法的调用 ~~~ class Test {     const constant = "a constant" ;     public $commonProp  = 'a commonProp';     public static $staticProp= 'a staticProp';     public function commonFunc(){         //正常: "$this->commonProp = a commonProp"         echo '$this->commonProp = '.$this->commonProp."<br/>";         //注意:未定义的变量&&致命:无法访问空属性         echo '$this->$commonProp = '.$this->$commonProp."<br/>";         //致命:未定义的类常量         echo '$this::commonProp = '.$this::commonProp."<br/>";         //致命:访问未声明的静态属性         echo '$this::$commonProp = '.$this::$commonProp."<br/>";         //解析错误,不受期待的"->"         echo 'self->commonProp = '.self->commonProp."<br/>";         //解析错误,不受期待的"->"         echo 'self->$commonProp = '.self->$commonProp."<br/>";         //致命:未定义的类常量         echo 'self->commonProp = '.self->commonProp."<br/>";         //致命:访问未声明的静态属性         echo 'self->commonProp = '.self->commonProp."<br/>";                      //严格标准:对静态属性使用了非静态的调用方式&&注意:未定义的属性, "$this->staticProp = "         echo '$this->staticProp = '.$this->staticProp."<br/>";         //注意:未定义的变量&&致命:无法访问空属性         echo '$this->$staticProp = '.$this->$staticProp."<br/>";         //致命:未定义的类常量         echo '$this::staticProp = '.$this::staticProp."<br/>";         //正常:"$this::$staticProp = a staticProp"         echo '$this::$staticProp = '.$this::$staticProp."<br/>";         //解析错误,不受期待的"->"         echo 'self->staticProp = '.self->staticProp."<br/>";         //解析错误,不受期待的"->"         echo 'self->$staticProp = '.self->$staticProp."<br/>";         //致命:未定义的类常量         echo 'self::staticProp = '.self::staticProp."<br/>";         //正常:"self::$staticProp = a staticProp"         echo 'self::$staticProp = '.self::$staticProp."<br/>";                        //注意:未定义的属性,"$this->constant = "         echo '$this->constant = '.$this->constant."<br/>";         //注意:未定义的变量&&致命:无法访问空属性         echo '$this->$constant = '.$this->$constant."<br/>";         //正常:$this::constant = a constant         echo '$this::constant = '.$this::constant."<br/>";         //致命:访问未声明的静态属性         echo '$this::$constant = '.$this::$constant."<br/>";         //解析错误,不受期待的"->"         echo 'self->constant = '.self->constant."<br/>";         //解析错误,不受期待的"->"         echo 'self->$constant = '.self->$constant."<br/>";         //正常:"self::constant = a constant"         echo 'self::constant = '.self::constant."<br/>";         //致命:访问未声明的静态属性         echo 'self::$constant = '.self::$constant."<br/>";     } } $test = new Test(); $test->commonFunc(); $test::commonFunc();//严格标准:非静态方法不能被静态调用 Test>commonFunc();//解析错误,不受期待的"->" Tes::commonFunc();//非静态方法不能被静态调用 ~~~ 5.对静态方法的调用 ~~~ class Test {     const constant = "a constant" ;     public $commonProp  = 'a commonProp';     public static $staticProp= 'a staticProp';     public static function staticFunc(){       //致命:在非对象语境[静态方法内]下使用了$this       echo '$this->commonProp = '.$this->commonProp."<br/>";       //致命:在非对象语境[静态方法内]下使用了$this       echo '$this->$commonProp = '.$this->$commonProp."<br/>";       //警告:未定义的变量$this && 致命:类名应该是字符串或者对象变量       echo '$this::commonProp = '.$this::commonProp."<br/>";       //警告:未定义的变量$this && 致命:类名应该是字符串或者对象变量       echo '$this::$commonProp = '.$this::$commonProp."<br/>";       //解析错误,不受期待的"->"       echo 'self->commonProp = '.self->commonProp."<br/>";       //解析错误,不受期待的"->"       echo 'self->$commonProp = '.self->$commonProp."<br/>";       //致命:未定义的类常量       echo 'self::commonProp = '.self::commonProp."<br/>";       //致命:访问未声明的静态属性       echo 'self::$commonProp = '.self::$commonProp."<br/>";                //致命:在非对象语境[静态方法内]下使用了$this       echo '$this->staticProp = '.$this->staticProp."<br/>";       //致命:在非对象语境[静态方法内]下使用了$this       echo '$this->$staticProp = '.$this->$staticProp."<br/>";       //警告:未定义的变量$this && 致命:类名应该是字符串或者对象变量       echo '$this::staticProp = '.$this::staticProp."<br/>";       //警告:未定义的变量$this && 致命:类名应该是字符串或者对象变量       echo '$this::$staticProp = '.$this::$staticProp."<br/>";       //解析错误,不受期待的"->"       echo 'self->staticProp = '.self->staticProp."<br/>";       //解析错误,不受期待的"->"       echo 'self->$staticProp = '.self->$staticProp."<br/>";       //致命:未定义的类常量       echo 'self::staticProp = '.self::staticProp."<br/>";       //正常:"self::$staticProp = a staticProp"       echo 'self::$staticProp = '.self::$staticProp."<br/>";                     //注意:未定义的属性,"$this->constant = "       echo '$this->constant = '.$this->constant."<br/>";       //注意:未定义的变量&&致命:无法访问空属性       echo '$this->$constant = '.$this->$constant."<br/>";       //正常:$this::constant = a constant       echo '$this::constant = '.$this::constant."<br/>";       //致命:访问未声明的静态属性       echo '$this::$constant = '.$this::$constant."<br/>";       //解析错误,不受期待的"->"       echo 'self->constant = '.self->constant."<br/>";       //解析错误,不受期待的"->"       echo 'self->$constant = '.self->$constant."<br/>";       //正常:"self::constant = a constant"       echo 'self::constant = '.self::constant."<br/>";       //致命:访问未声明的静态属性       echo 'self::$constant = '.self::$constant."<br/>";                                     } } $test = new Test(); $test->staticFunc();//调用方式没有报错. $test::staticFunc();//调用方式没有报错 Test>staticFunc();//解析错误,不受期待的"->" Test::staticFunc();//调用方式没有报错 ~~~ 验证结论: 1. 方法体内即使包含了对静态属性的调用,方法也不一定要声明为静态的 2. 如果方法没有声明为静态的,则不能使用静态的调用方式 3. 外部对象实例$instance->与类内部$this->有同样的表现,外部class::与内部self::有同样的表现 4. class和self不能使用调用符号-> 5. 对普通属性的调用方式只能是 $instance($this)->属性名 6. 对静态属性的调用必须使用静态调用符号::且自身的表现形式一定要加$,但是对调用方没有要求class\[self\]或$insance\[$this\]都可以 7. 对类常量的调用必须使用静态调用符号::且自身的表现形式一定不能加$,但是对调用方没有要求class\[self\]或$insance\[$this\]都可以 8. 静态方法中不能使用$this,静态方法在类加载的时候就加载进内存,此时$this的对象还没有生成,所以会报错 总结 1. 静态方法里不能出现$this\[对象实例引用\],非静态方法没有任何限制,可以有$this->|$this::|self:: 2. "->"仅限于实例使用,仅限于调用常规属性和方法上 3. "::"不仅类可以使用,实例也可以使用,但仅限于调用类常量,静态属性和方法上