PHP 类变量/方法覆盖

[写在前]:

在面向对象编程中,变量/方法的覆盖是十分常见的。各种语言对覆盖的处理方法各不相同。

[代码分析]:
在java中,变量覆盖称为隐藏父类变量,方法称为重载。

class FarClass{

private $myPv;

protected $myVar;

 

public function myFun(){

  ...

}

 

....

}

 

class SonClass extends FarClass{

private $myPv;

protected $myVar;

 

public function myFun(){

...

}

 

...

}

从上面的例子中可以看出, 类的私有变量不会产生覆盖。原因在于private成员无法继承下来。对于protected/pulic变量,则会产生覆盖问题。如果要在子类中访问父类变量,在java中可能使用super关键字,即:

class SonClass{

private $myPv;

protected $myVar;

 

public function myFun{}

 

public fuction myFun2{

 //下面这名将会抛出一个异常,不能访问父类私有变量

//var0 = super.myPv;

var1 = super.myVar;

 

var2 = super.myFun();

 

}

...

}

那么,在PHP中又如何呢?PHP的parent关键词只能用于调用父类的可继承方法(protected/public)及可继承静态变量,而对于非静态成员,则会抛出异常:Fatal error: Access to undeclared static property。如:

<?php

class Far{

protected $myVar;

 

private function Fun1(){}

 

function Fun2(){}

 

}

 

class Son extends Far{

protected $myVar;

funciton Fun2(){

//下面句将会抛出异常,不能访问父类私有方法。

parent :: Fun1();

 

//下面会报错,Fatal error: Access to undeclared static property:

$var = parent :: $myVar;

 

//这一句正常运行,无论方法是否为静态方法。

parent :: Fun2();

}

}

如果要访问父类被覆盖的变量或方法,parent是否可用呢?通过上面的例子可以看出是不行的,那么,唯一的办法是在父类中增加一个方法,通过调用父类方法,从而取得被覆盖的父类变量。

<?php

class Far{

protected $myVar;

 

function getMyVar(){

return $myVar;

}

}

 

class Son extends Far{

protected $myVar;

 

function getMyVar(){

return parent :: getMyVar();

}

}

 
[结论]:
php的面向对象与其它语言有所不同,一定要注意语言问的区别。
posted @ 2017-01-09 21:06  天涯海角路  阅读(908)  评论(0)    收藏  举报