search

Home  >  Q&A  >  body text

php 静态方法问题

    private function getlong() {
    $result = unpack('Vlong', fread(self::$fp, 4));
    return $result['long'];
}

getlong 非静态方法
为什么在getClientLocation
里可以用self::getlong() 访问

阿神阿神2901 days ago595

reply all(2)I'll reply

  • 黄舟

    黄舟2017-04-10 14:46:54

    其实php的设计是可以用::方式调用实例方法,这个涉及到scope引用问题,例如:

    class A
    {
        public $a;
        public function echo()
        {
            //标识为A.a
            $this->a = 'A.a';
            echo $this->a;
        }
    }
    Class B
    {
        public $a;
        public function test()
        {
            //标识为B.a
            $this->a = 'B.a';
            //静态调用A的echo方法
            A::echo();
        }
    }
    //这里要不能用::调用,不然会出现context错误,因为这里要找到$this.
    $b = new B();
    $b->test();
    //结果是:B.a
    

    结果不是A.a的原因是scope,因为静态调用使得A的echo方法里的$this即scope指向了B,所以$this是指B实例,
    为什么php会有这样的设计?因为 parent::foo();记得了吧,子类调用父类方法的时候,就是用parent:: 的方式调用.

    reply
    0
  • 怪我咯

    怪我咯2017-04-10 14:46:54

    __callStatic

    reply
    0
  • Cancelreply