���ھ�̬��

�� PHP 5.3.0 ��PHP ������һ���������ھ�̬�󶨵Ĺ��ܣ������ڼ̳з�Χ�����þ�̬���õ��ࡣ

׼ȷ˵�����ھ�̬�󶨹���ԭ���Ǵ洢������һ��"��ת������"��non-forwarding call���������������о�̬��������ʱ����������Ϊ��ȷָ�����Ǹ���ͨ���� :: �������ಿ�֣��������зǾ�̬��������ʱ����Ϊ�ö����������ࡣ��ν��"ת������"��forwarding call��ָ����ͨ�����¼��ַ�ʽ���еľ�̬���ã�self::��parent::��static:: �Լ� forward_static_call()������ get_called_class() �������õ������õķ������ڵ�������static:: ��ָ�����䷶Χ��

�ù��ܴ������ڲ��Ƕȿ��DZ�����Ϊ"���ھ�̬��"��"���ڰ�"����˼��˵��static:: ���ٱ�����Ϊ���嵱ǰ�������ڵ��࣬������ʵ������ʱ����ġ�Ҳ���Գ�֮Ϊ"��̬��"����Ϊ���������ڣ��������ڣ���̬�����ĵ��á�

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�����վ����������µĹؼ��֣�����ʹ���Ѿ�Ԥ���� 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:

�ڷǾ�̬�����£������õ��༴Ϊ�ö���ʵ���������ࡣ���� $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