锟斤拷锟节撅拷态锟斤拷

锟斤拷 PHP 5.3.0 锟斤拷PHP 锟斤拷锟斤拷锟斤拷一锟斤拷锟斤拷锟斤拷锟斤拷锟节撅拷态锟襟定的癸拷锟杰o拷锟斤拷锟斤拷锟节继承凤拷围锟斤拷锟斤拷锟矫撅拷态锟斤拷锟矫碉拷锟洁。

准确说锟斤拷锟斤拷锟节撅拷态锟襟定癸拷锟斤拷原锟斤拷锟角存储锟斤拷锟斤拷锟斤拷一锟斤拷"锟斤拷转锟斤拷锟斤拷锟斤拷"锟斤拷non-forwarding call锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟叫撅拷态锟斤拷锟斤拷锟斤拷锟斤拷时锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷为锟斤拷确指锟斤拷锟斤拷锟角革拷锟斤拷通锟斤拷锟斤拷 :: 锟斤拷锟斤拷锟斤拷锟洁部锟街o拷锟斤拷锟斤拷锟斤拷锟叫非撅拷态锟斤拷锟斤拷锟斤拷锟斤拷时锟斤拷锟斤拷为锟矫讹拷锟斤拷锟斤拷锟斤拷锟斤拷锟洁。锟斤拷谓锟斤拷"转锟斤拷锟斤拷锟斤拷"锟斤拷forwarding call锟斤拷指锟斤拷锟斤拷通锟斤拷锟斤拷锟铰硷拷锟街凤拷式锟斤拷锟叫的撅拷态锟斤拷锟矫o拷self::锟斤拷parent::锟斤拷static:: 锟皆硷拷 forward_static_call()锟斤拷锟斤拷锟斤拷 get_called_class() 锟斤拷锟斤拷锟斤拷锟矫碉拷锟斤拷锟斤拷锟矫的凤拷锟斤拷锟斤拷锟节碉拷锟斤拷锟斤拷锟斤拷static:: 锟斤拷指锟斤拷锟斤拷锟戒范围锟斤拷

锟矫癸拷锟杰达拷锟斤拷锟斤拷锟节诧拷锟角度匡拷锟角憋拷锟斤拷锟斤拷为"锟斤拷锟节撅拷态锟斤拷"锟斤拷"锟斤拷锟节帮拷"锟斤拷锟斤拷思锟斤拷说锟斤拷static:: 锟斤拷锟劫憋拷锟斤拷锟斤拷为锟斤拷锟藉当前锟斤拷锟斤拷锟斤拷锟节碉拷锟洁,锟斤拷锟斤拷锟斤拷实锟斤拷锟斤拷锟斤拷时锟斤拷锟斤拷摹锟揭诧拷锟斤拷猿锟街�"锟斤拷态锟斤拷"锟斤拷锟斤拷为锟斤拷锟斤拷锟斤拷锟斤拷锟节o拷锟斤拷锟斤拷锟斤拷锟节o拷锟斤拷态锟斤拷锟斤拷锟侥碉拷锟矫★拷

self:: 锟斤拷锟斤拷锟斤拷

使锟斤拷 self:: 锟斤拷锟斤拷 __CLASS__ 锟皆碉拷前锟斤拷木锟教拷锟斤拷茫锟饺★拷锟斤拷诙锟斤拷宓鼻帮拷锟斤拷锟斤拷锟斤拷诘锟斤拷啵�

Example #1 self:: 锟矫凤拷

<?php
class {
    public static function 
who() {
        echo 
__CLASS__;
    }
    public static function 
test() {
        
self::who();
    }
}

class 
extends {
    public static function 
who() {
        echo 
__CLASS__;
    }
}

B::test();
?>

锟斤拷锟斤拷锟斤拷锟教伙拷锟斤拷锟斤拷锟�

A

锟斤拷锟节撅拷态锟襟定碉拷锟矫凤拷

锟斤拷锟节撅拷态锟襟定憋拷锟斤拷通锟斤拷锟斤拷锟斤拷一锟斤拷锟铰的关硷拷锟街憋拷示锟斤拷锟斤拷时锟斤拷锟斤拷锟斤拷玫锟斤拷锟斤拷锟斤拷乒锟斤拷锟斤拷啤锟斤拷虻サ锟剿碉拷锟斤拷锟斤拷锟截硷拷锟斤拷锟杰癸拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟叫碉拷锟斤拷 test() 时锟斤拷锟矫碉拷锟斤拷锟斤拷 B 锟斤拷锟斤拷锟斤拷 A锟斤拷锟斤拷锟秸撅拷锟斤拷锟斤拷锟斤拷锟斤拷锟铰的关硷拷锟街o拷锟斤拷锟斤拷使锟斤拷锟窖撅拷预锟斤拷锟斤拷 static 锟截硷拷锟街★拷

Example #2 static:: 锟斤拷锟矫凤拷

<?php
class {
    public static function 
who() {
        echo 
__CLASS__;
    }
    public static function 
test() {
        static::
who(); // 锟斤拷锟节撅拷态锟襟定达拷锟斤拷锟斤开始
    
}
}

class 
extends {
    public static function 
who() {
        echo 
__CLASS__;
    }
}

B::test();
?>

锟斤拷锟斤拷锟斤拷锟教伙拷锟斤拷锟斤拷锟�

B

Note:

锟节非撅拷态锟斤拷锟斤拷锟铰o拷锟斤拷锟斤拷锟矫碉拷锟洁即为锟矫讹拷锟斤拷实锟斤拷锟斤拷锟斤拷锟斤拷锟洁。锟斤拷锟斤拷 $this-> 锟斤拷锟斤拷同一锟斤拷锟矫凤拷围锟节筹拷锟皆碉拷锟斤拷私锟叫凤拷锟斤拷锟斤拷锟斤拷 static:: 锟斤拷锟斤拷芨锟斤拷锟斤拷锟酵拷锟斤拷锟斤拷锟斤拷一锟斤拷锟斤拷锟斤拷锟斤拷 static:: 只锟斤拷锟斤拷锟节撅拷态锟斤拷锟皆★拷

Example #3 锟角撅拷态锟斤拷锟斤拷锟斤拷使锟斤拷 static::

<?php
class {
    private function 
foo() {
        echo 
"success!\n";
    }
    public function 
test() {
        
$this->foo();
        static::
foo();
    }
}

class 
extends {
   
/* foo() will be copied to B, hence its scope will still be A and
    * the call be successful */
}

class 
extends {
    private function 
foo() {
        
/* original method is replaced; the scope of the new one is C */
    
}
}

$b = new B();
$b->test();
$c = new C();
$c->test();   //fails
?>

锟斤拷锟斤拷锟斤拷锟教伙拷锟斤拷锟斤拷锟�

success!
success!
success!


Fatal error:  Call to private method C::foo() from context 'A' in /tmp/test.php on line 9

Note:

锟斤拷锟节撅拷态锟襟定的斤拷锟斤拷锟斤拷一直锟斤拷取锟斤拷一锟斤拷锟斤拷全锟斤拷锟斤拷锟剿的撅拷态锟斤拷锟斤拷为止锟斤拷锟斤拷一锟斤拷锟芥,锟斤拷锟斤拷锟教拷锟斤拷锟绞癸拷锟� parent:: 锟斤拷锟斤拷 self:: 锟斤拷转锟斤拷锟斤拷锟斤拷锟斤拷息锟斤拷

Example #4 转锟斤拷锟酵凤拷转锟斤拷锟斤拷锟斤拷

<?php
class {
    public static function 
foo() {
        static::
who();
    }

    public static function 
who() {
        echo 
__CLASS__."\n";
    }
}

class 
extends {
    public static function 
test() {
        
A::foo();
        
parent::foo();
        
self::foo();
    }

    public static function 
who() {
        echo 
__CLASS__."\n";
    }
}
class 
extends {
    public static function 
who() {
        echo 
__CLASS__."\n";
    }
}

C::test();
?>

锟斤拷锟斤拷锟斤拷锟教伙拷锟斤拷锟斤拷锟�

A
C
C