博客列表 >PHP有关类的调用方式"->"与"::"的区别

PHP有关类的调用方式"->"与"::"的区别

力挽狂澜的博客
力挽狂澜的博客原创
2018年05月14日 16:29:46943浏览

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. "::"不仅类可以使用,实例也可以使用,但仅限于调用类常量,静态属性和方法上

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议