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();//调用方式没有报错
验证结论:
方法体内即使包含了对静态属性的调用,方法也不一定要声明为静态的
如果方法没有声明为静态的,则不能使用静态的调用方式
外部对象实例$instance->与类内部$this->有同样的表现,外部class::与内部self::有同样的表现
class和self不能使用调用符号->
对普通属性的调用方式只能是 $instance($this)->属性名
对静态属性的调用必须使用静态调用符号::且自身的表现形式一定要加$,但是对调用方没有要求class[self]或$insance[$this]都可以
对类常量的调用必须使用静态调用符号::且自身的表现形式一定不能加$,但是对调用方没有要求class[self]或$insance[$this]都可以
静态方法中不能使用$this,静态方法在类加载的时候就加载进内存,此时$this的对象还没有生成,所以会报错
总结
静态方法里不能出现$this[对象实例引用],非静态方法没有任何限制,可以有$this->|$this::|self::
"->"仅限于实例使用,仅限于调用常规属性和方法上
"::"不仅类可以使用,实例也可以使用,但仅限于调用类常量,静态属性和方法上