搜索
博主信息
博文 25
粉丝 0
评论 0
访问量 20099
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
PHP有关类的调用方式"->"与"::"的区别
力挽狂澜的博客
原创
1148人浏览过

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举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学