self与static之间的基情

关于static,PHP官网这么说的:

声明类成员或方法为static,就可以不实例化类而直接访问。不能通过一个对象来访问其中的静态成员(静态方法除外)。

由于静态方法不需要通过对象即可调用,所以伪变量$this在静态方法中不可用。

后面还有一条关于::的:

用::方式调用一个非静态方法会导致一个E_STRICT级别的错误。

于是我测试了一下:

test1:

<!-- lang: php -->
class foo1 {
    private function fun1(){
        echo "1234";
    }
    public function fun2(){
        self::fun1();
    }
}
foo1::fun2();
//可以输出,产生Strict standards;

于是对test1做了一个修改:

<!-- lang: php -->
class foo1 {
    private function fun1(){
        echo "1234";
    }
    public function fun2(){
        self::fun1();
    }
}
$obj = new foo1();
$obj->fun2();
//输出结果,没有错误

test2:

<!-- lang: php -->
class foo2 {
    static function fun1(){
        echo "1234";
    }
    public function fun2(){
        slef::fun1();
    }
}
foo2::fun1();
//输出结果,这个可以和后面的用变量代替fun1做对比;

test3:

<!-- lang: php -->
class foo3 {
    static function fun1(){
        echo "1234";
    }
    public function fun2(){
        $this->fun1();
    }
}
foo::fun2();
//Error,这个测试有点多余$this指向的是实例化后的对象,对象没有实例化,显然会。

test4:

<!-- lang: php -->
class foo4 {
    static function fun1(){
        echo "1234";
    }
    public function fun2(){
        $this->fun1();
    }
}
$obj = new foo3();
$obj->fun2();
//输出结果,没有报错;

看来文档说的总是没有实例来的清楚。

如果把fun1()换成一个变量又会是什么情况呢~~~,闲的无聊我又测了一下:

<!-- lang: php -->
class foo {
    static $a = "abcd";
    public function fun2(){
        echo self::$a;
    }
}
foo::fun2();
//即使这样,也会有一个Strict standards;

应该这样写:

<!-- lang: php -->
class foo {
    public static $a = "abcd";
    static function fun2(){
        echo self::$a;
    }
}
foo::fun2();
//PHP Manual里的写法;

或者这样:

<!-- lang: php -->
class foo {
    static $a = "abcd";
    public function fun2(){
        echo self::$a;
    }
}
$obj = new foo();
$obj->fun2();
//正常;

或者:

<!-- lang: php -->
class foo {
    private $a = "abcd";
    public function fun2(){
        echo $this->a;
    }
}
$obj = new foo();
$obj->fun2();
//正常

关于Strict standards

字面意思,没有按照PHP严格规定的模式编写而给的警告。

总结起来就是:

  1. slef不仅仅是可以用来指向静态成员,也可以用来指向其他成员,但是实例化前调用在严格模式下会给出警告,实例化之后不会。

  2. 调用未实例化的对象,静态方法可以被普通的成员方法访问,但在严格模式下,静态变量只能通过静态方法来访问,否则会给出警告(实例化之后就不会警告了);

  3. $this也可以指向静态成员,当然,只能在对象实例化之后才可用;

PS:PHP version 5.4.3

转载于:https://my.oschina.net/scholer/blog/94607

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值