今天白天在项目开发中遇到一个很诡异的问题,由于第三方没有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(){
}
}
晚上吃晚饭的时候,都还在想这个问题,这是为什么? 看来想是不行的,那就动手吧,于是以下几行代码诞生了(哈哈~~~):
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晚