php的self关键字和静态方法调用


   今天白天在项目开发中遇到一个很诡异的问题,由于第三方没有PHP接口demo,我在封装一个第三方API接口调用的时候,构建一个PHP类,类里面包含了一个私有方法和多个公有静态方法,我在静态方法中都使用了那个私有方法,按照惯例,我在静态方法中使用的是$this方式调用,代码结构大概如下:

class myClass {
	
	public static function func(){
		// $this->tt() ; //错误,无法执行
		self::tt();
	}

        public static function func2(){
		// $this->tt() ; //错误,无法执行
		self::tt();
	}

        public static function func3(){
		// $this->tt() ; //错误,无法执行
		self::tt();
	}

         .
         .
         .

	private function  tt(){

	}

}


     本地写好之后,检查了语法什么的,都没什么问题,自信满满的提交到测试环境,和APP同事一联调,无法执行,程序500,仔细研究定位到问题之后,发下“$this->tt()“的方式,根本不会执行,百思不得其解,临时突然冒出来个想法,用self试试,一试真的可以了,当时即迷惑又有点兴奋。因为是要赶项目进度,所以当时也没有时间去研究太多,最后都成self调用,最后跑通了。


    晚上吃晚饭的时候,都还在想这个问题,这是为什么? 看来想是不行的,那就动手吧,于是以下几行代码诞生了(哈哈~~~):

class myClass {

   private $myName = "goen\r\n";
   private static $myNames="goens\r\n";
   #public static function func(){
   #     //$this->tt() ; //错误,无法执行
   #     self::tt();
   # } 

    private function  tt(){
        echo "tt() function exec\r\n";
    }   

    private function tt2(){
        echo "tt2 function exec\r\n";
    }   

    public function func_new(){
        echo self::$myNames;
        self::tt();
        self::tt2();
            
        #echo $this->myName;
        #$this->tt();
        #$this->tt2();
        echo "test func new exec\r\n";
    }   

}

$myCls = new myClass();
$myCls->func_new();


#myClass::func();

#myClass::func_new();

当然 ,功夫不负有心人,哈哈~~~,我通过代码反复测试,得出以下结论和大家分享:

  •  1. php类中,静态方法调用当前类的非静态方法必须用self关键字,不能用$this
  •  2. php类中,公有方法调用私有方法使用$this关键字,只能实例化调用
  •  3. php类中,公有方法调用私有方法使用self关键字,此共有方法自动转化为静态方法
  •  4. php类中,静态方法不能调用非静态属性。因为非静态属性需要实例化后,存放在对象里
  •  5. 实例化变量即可调用公有方法也可以调用静态方法

以上结论仅代表个人分析得出,欢迎高手指正


作者:gaorq

于2015.10.12晚



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值