本文目录一览:
PHP继承的问题,调用父类的方法this指向问题。
我来说一说:
【一】…………public(仅有)属性和方法的继承…………
class a{
public $var = 'var a br/';
public function m(){
echo 'fun a br/';
}
public function run(){
echo $this-var;
$this-m();
}
}
class b extends a{
public $var = 'var b br/';
public function m(){
echo 'fun b br/';
}
}
$li = new b();
$li-run();
echo 'hr';
var_dump($li);
输出:
var b
fun b
————————————————————————————
object(b)[1]
public 'var' = string 'var b br/' (length=11)
在这段代码中所表示的,是我们常见的一种继承方式,同为公有属性的$var 和公有方法m()
在这里,$var和m()都被继承并覆写,实例化过后,内存中只有一个$var实例,通过var_dump($li);我们可以看到它。
【二】…………private(私有)属性和方法的继承…………
class a{
private $var = 'var a br/';
private function m(){
echo 'fun a br/';
}
public function run(){
echo $this-var;
$this-m();
var_dump($this);
echo 'br/br/';
}
}
class b extends a{
private $var = 'var b br/';
private function m(){
echo 'fun b br/';
}
public function run(){
echo $this-var;
$this-m();
var_dump($this);
echo 'br/br/';
parent::run();
}
}
$li = new b();
$li-run();
echo 'hr';
var_dump($li);
输出:
var b
fun b
object(b)[1]
private 'var' = string 'var b br/' (length=11)
private 'var' (a) = string 'var a br/' (length=11)
.
.
var a
fun a
object(b)[1]
private 'var' = string 'var b br/' (length=11)
private 'var' (a) = string 'var a br/' (length=11)
.
————————————————————————————————
object(b)[1]
private 'var' = string 'var b br/' (length=11)
private 'var' (a) = string 'var a br/' (length=11)
这个时候,我们可以看到,在调用run方法时,首先它会调用到b类的私有属性$var 和私有方法m(),随后,又使用parent::run()调用父类的run()方法,我们可以看到,父类的run()方法调用后,它所调用的属性和方法,都是a类的两个私有属性和方法,这种形式,和你的问题一致;
而它与$this指向无关,我们可以在这里看到,两个$this都是指向b类。
而最有意思的是,在$li句柄中,我们却看到了两个属性!一个是b类的属性,一个是a类的属性,这两个属性同时存在着,那么,私有方法也自然是同时存在着。
【三】…………私有属性和方法能不能被继承…………
class a{
private $var = 'var a br/';
private function m(){
echo 'fun a br/';
}
}
class b extends a{
public function run(){
echo $this-var;
$this-m();
}
}
$li = new b();
$li-run();
输出:
Notice: Undefined property: b::$var in E: ... on Line 9
Fatal error: Call to private method a::m() from context 'b' in E: ... on Line 10
这可以证明,私有属性和方法,无法被继承,所以,你的代码示例中所说,将a类的m()方法更改为private后,会显示aa的属性,也就可以理解明白了。
PHP类继承的问题,子类继承父类,实例化子类,先执行父类还是先执行子类?
不是这个意思。所谓“实例化子类的对象前要先实例化父类中的内容,为父类初始化”,是指当子类正在实例化时,总是链式调用父类构造方法初始化父类空间。换句话说,子类的构造方法必须先调用父类的构造方法,完了才能干别的初始化工作。如果子类没有显式调用语句,编译器会隐式帮你加上。
如:
public class A{ public A() { }}public class B extends A{ public B() { }}等价于:
public class A{ public A() { super();//这里实际上是Object(); //其他初始化工作 }}public class B extends A{ public B() { super();//这里实际上是A(); //其他初始化工作 }}另外,如果有这种情况:
public class A{ X x=new X(); public A() { }}public class B extends A{ Y y=new Y(); public B() {//这是类A空间里的字段都已经初始化完毕。 }}在成员y被赋值之前,x一定已经存在。换句话说,X x=new X();一定先于Y y=new Y();执行。
php中静态类的继承
楼主这个问题跟静态没有多大关系,主要是继承的概念没有搞清楚,继承一个类是将子类拥有了调用父类的方法和属性的权利,并不是说将父类的方法复制到了子类中self方法相当于当前类的指针,你那样调用相当于写了
public static function test() {
parent::who();
}
这样的代码,所以才会出现那样的结果