很多站长朋友们都不太清楚php重写父类方法,今天小编就来给大家整理php重写父类方法,希望对各位有所帮助,具体内容如下:
本文目录一览: 1、 PHP 继承、封装、多态 2、 php子类能不能重写父类的private属性? 3、 PHP继承的问题,调用父类的方法this指向问题。 4、 PHP真的能算是面向对象的语言吗? PHP 继承、封装、多态-子类只能继承父类的非私有属性
-子类继承父类后,相当于将父类的属性和方法copy到子类,可以直接使用$this调用该属性;
-php只能单继承,不支持一个类继承多个类。但是一个类可以进行多层继承
类实现封装是为了不让外面的类随意修改一个类的成员变量,所以在定义一个类的成员的时候,我们使用private关键字设置这个成员的访问权限只能被这个类的其他成员方法调用,而不能被其他类中的方法调用,即通过本类中提供的方法来访问本类中的私有属性
-所以在该类中我们会提供一个访问私有属性的方法
-然后我们一般会定义两个方法来实现对一个变量的操作,即__get()和__set()方法
一个类被多个子类继承,如果这个类的某个方法,在多个子类中,表现出不同的功能,我们称这种行为为多态(同一个类的不同子类表现出不同的形态)
-子类继承父类->子类重写父类的方法->父类引用指向子类对象
php子类能不能重写父类的private属性?在父类中加个public方法,如private$aaa='test';publicfunctiongetAAA(){return$this->aaa;}在子类中调用parent::getAAA();就可以获得父类私有属性当然如果你想获取多个,可以改成动态变量名,getAAA($v){return$this->{$v};}
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真的能算是面向对象的语言吗?面向对象三大特性:封装,继承,多态
php可以封装对象,也可以继承,同样可以实现多态
多态是指指出重写和重载,php子类可以重写父类的方法,也可以通过方法的参数数量不同来重载方法,我觉得是面向对象语言
关于php重写父类方法的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。
查看更多关于php重写父类方法 php 重写 重载的详细内容...