Blogger Information
Blog 25
fans 0
comment 0
visits 16862
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP有关类的调用方式"->"与"::"的区别
力挽狂澜的博客
Original
942 people have browsed it

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

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post