看了php手册中关于后期静态绑定,还是不太明白,原文地址http://cn2.php.net/manual/zh/language.oop5.late-static-bindings.php其中第四个例子<?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
当调用到parent::foo()和self::foo()时,为什么会调用C类的who()?
哪位朋友能解释一下,谢谢。
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
当调用到parent::foo()和self::foo()时,为什么会调用C类的who()?
哪位朋友能解释一下,谢谢。
解决方案 »
- php 连接oracle时,报错:CGI / FastCGI 遇到问题需要关闭
- session传值问题
- PHP编程-数组、文件与图像
- PHP安装配置,MySql配置时最后一步出现了错了,代号10061
- php+txt 写留言本的....基本己经写完了..不过出现了个小错误..不知道怎么更正..望大家帮帮忙
- 100分~小弟今日转向PHP 先混个脸熟,今后难免要有麻烦各位的地方了
- php调用mssql的存储过程无法同时返回输出参数和结果集??请教!!!
- 如何运行?
- foxserv有人用过吗?怎么弄的,教我一下吧!
- 请问哪里有关于php3的中文书籍,比较好的!!!
- php如何每页读取三条xml数据?
- PHP框架
后期静态绑定试图通过引入一个关键字表示运行时最初调用的类来绕过限制。
而这个最初调用的类就是CA::foo(); 调用的是A类的方法,这你明白
self::foo(); // 这个self实际上是C类。明白吗? C::test() C继承了B的test()方法
parent::foo(); // 由于static::who(); 而不是self::who()。该方法调用的当前的类,也就是C类的foo()方法也许你觉得还是弄不懂 A类中又为什么没有调用C的who()方法,这是由于parent的特殊关系。延迟静态绑定就是专门为了解决子类与父类间继承方法的问题才出现的。
------------------------------------------------------
”后期绑定“的意思是说,static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为”静态绑定“,因为它可以用于(但不限于)静态方法的调用。
-------------------------------------------------------#1说的有个小问题self::foo(); // 这个self实际上是C类。明白吗? C::test() C继承了B的test()方法不准确,self还是B类,但是本身没有覆写foo方法,所以就调用父类A的foo方法。
如果self实际是C类,那你试下self::foo();改成self::who();,应当打印C,但是打印B,这也正是self和static的区别。
parent::foo();//调用B类的父类——A的foo方法,并告诉foo方法最原始的调用者是C
self::foo(); //self指代定义该方法的类,即B,但是B没有定义foo方法,它将原始的调用者C向上传递,
// 访问父类的foo方法,最后访问c的who方法;
所以这就回答了三楼的疑问:若是把self::foo(); 改成self::who,因为self指代B,而B有who方法,所以结果是变成了B