php 重写对象方法吗,面向对象设计 5 —— PHP5面向对象进阶(重写(override))

//重写(override)

/**

* 如果从父类继承的方法不能满足子类的需求,可以对其进行改写,

* 这个过程叫方法的覆盖(override),也称为方法的重写。

* 当对父类的方法进行重写时,子类中的方法必须和父类中对应的方法具有相同的方法名称,

* 在PHP5中不限制输入参数类型、参数数量和返回值类型。(这点和JAVA不同)

* 子类中的覆盖方法不能使用比父类中被覆盖方法更严格的访问权限。

* 声明方法时,如果不定义访问权限。默认权限为public。

*/

/**

* 先设置一个父类,这个父类是 “Dog”类,这个类描述了dog的特性。

* Dog有2个眼睛,会跑,会叫。就这样描述先。

* 我养了一直狗,是只小狗,符合Dog类的特性,但有所不同。

* 我的小狗有名字,我的小狗太小了,不会大声的叫,只会哼哼。

*/

//狗有两只眼睛,会汪汪叫,会跑。

class Dog{

protected $eyeNumber = 2; //属性

//返回封装属性方法

public function getEyeNumber(){

return $this->eyeNumber;

}

//狗会叫

public function yaff(){

return "Dog yaff,wang...wang....";

}

//狗会跑

public function run(){

return "Dog run. runing....";

}

}

$dog = new Dog();

echo "dog have".$dog->getEyeNumber()." eyes.
";

echo $dog->yaff()."
".$dog->run();

echo "
";

class MyDog extends Dog{

private $name = "狗狗";

public function getName(){

return $this->name;

}

public function yaff(){

return $this->name." , heng...heng...";

}

}

$myDog = new myDog();

echo $myDog->getName()."have".$myDog->getEyeNumber()." cyco.
";

echo $myDog->yaff()."
".$myDog->run();

?>

//重写方法与访问权限

//子类中的覆盖方法不能使用比父类中被覆盖方法更严格的访问权限。

//父类为public子类为private protected

class Dog{

protected $eyeNumber = 2; //属性

//返回封装属性方法

public function getEyeNumber(){

return $this->eyeNumber;

}

//狗会叫

public function yaff(){

return "Dog yaff,wang...wang....";

}

//狗会跑

public function run(){

return "Dog run. runing....";

}

}

class MyDog extends Dog{

private $name = "狗狗";

public function getName(){

return $this->name;

}

//父类是public

private function yaff(){

return $this->name." , heng...heng...";

}

//父类是private

protected function run(){

return "Dog run. runing....";

}

}

//会提示错误因为php中不允许这样做

?>

//重写时的参数数量

//子类可以拥有与父类不同的参数数量。(这点与java不同,PHP是弱类型语言。)

class Dog{

protected $eyeNumber = 2;

public function getEysNumber(){

return $this->eyeNumber;

}

}

class MyDog extends Dog{

public function getEyeNumber($eys){

$this->eyeNumber = $eys;

return $this->eyeNumber;

}

}

$myDog = new MyDog();

echo "my dog have ".$myDog->getEyeNumber(3)." eyes.";

//如果我们不进行参数传递会报错,下面这句就会出错

echo "my dog have ".$myDog->getEyeNumber()." eyes.";

?>

//构造函数重写

//下面这个例子中,父类和子类都有自己的构造函数,当子类被实例化时,

//子类的构造函数被调用,而父类的构造函数没有被调用,

//请对比第一节的构造函数继承。

class Animal{

public $legNum = 0;

public function __construct(){

$this->legNum = 4;

echo "I am an animal
";

}

}

class Dog1 extends Animal{

public function __construct(){

$this->legNum = 4;

echo "I am a Dog
";

}

}

$dog1 = new Dog1();

echo "
";

echo "legNum is ".$dog1->legNum;

//实例化子类时只是调用了子类的构造函数

//(注:这点和Java不同,在java中构造函数是不能被继承的,而且子类实例化时,子类的构造函数被调用,父类的构造函数也会调用。)

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值