�� PHP 5.3.0 ��PHP ������һ���������ھ�̬�Ĺ��ܣ������ڼ̳з�Χ�����þ�̬���õ��ࡣ
ȷ˵�����ھ�̬����ԭ���Ǵ洢������һ��"��ת������"��non-forwarding call���������������о�̬��������ʱ����������Ϊ��ȷָ�����Ǹ���ͨ���� :: �������ಿ�֣��������зǾ�̬��������ʱ����Ϊ�ö����������ࡣ��ν��"ת������"��forwarding call��ָ����ͨ�����¼��ַ�ʽ���еľ�̬���ã�self::��parent::��static:: �Լ� forward_static_call()������ get_called_class() �������õ������õķ������ڵ�������static:: ��ָ�����䷶Χ��
�ù��ܴ������ڲ��Ƕȿ��DZ�����Ϊ"���ھ�̬��"��"���ڰ�"����˼��˵��static:: ���ٱ�����Ϊ���嵱ǰ�������ڵ��࣬������ʵ������ʱ����ġ�Ҳ���Գ�֮Ϊ"��̬��"����Ϊ���������ڣ��������ڣ���̬�����ĵ��á�
ʹ�� self:: ���� __CLASS__ �Ե�ǰ��ľ�̬���ã�ȡ���ڶ��嵱ǰ�������ڵ��ࣺ
Example #1 self:: �÷�
<?php
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
self::who();
}
}
class B extends A {
public static function who() {
echo __CLASS__;
}
}
B::test();
?>
�������̻������
A
���ھ�̬����ͨ������һ���µĹؼ��ֱ�ʾ����ʱ������õ������ƹ����ơ���˵������ؼ����ܹ����������������е��� test() ʱ���õ����� B ������ A�����վ����������µĹؼ��֣�����ʹ���Ѿ�Ԥ���� static �ؼ��֡�
Example #2 static:: ���÷�
<?php
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
static::who(); // ���ھ�̬�����↑ʼ
}
}
class B extends A {
public static function who() {
echo __CLASS__;
}
}
B::test();
?>
�������̻������
B
Note:
�ڷǾ�̬�����£������õ��༴Ϊ�ö���ʵ���������ࡣ���� $this-> ����ͬһ���÷�Χ�ڳ��Ե���˽�з������� static:: ����ܸ�����ͬ�������һ�������� static:: ֻ�����ھ�̬���ԡ�
Example #3 �Ǿ�̬������ʹ�� static::
<?php
class A {
private function foo() {
echo "success!\n";
}
public function test() {
$this->foo();
static::foo();
}
}
class B extends A {
/* foo() will be copied to B, hence its scope will still be A and
* the call be successful */
}
class C extends A {
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 A {
public static function foo() {
static::who();
}
public static function who() {
echo __CLASS__."\n";
}
}
class B extends A {
public static function test() {
A::foo();
parent::foo();
self::foo();
}
public static function who() {
echo __CLASS__."\n";
}
}
class C extends B {
public static function who() {
echo __CLASS__."\n";
}
}
C::test();
?>�������̻������
A C C