面向对象三大特性
多态
方法重写
- 子类重写了父类的同名的方法
- 子类的方法必须和父类的方法同名
- 参数个数要一致
- 子类修饰的不能比父类更加严格
<?php
class A{
protected function say($name){
echo $name,',狗!<br/>';
}
protected function says($name){
echo $name,',狗!<br/>';
}
}
class B extends A{
public function say($name){
echo $name,',猫!<br/>';
}
}
$per= new B();
$per->say('Sunny');
$per->says('Sunny');
?>
方法重载
- 方法重载
- 在同一个类中,有多个同名的函数,通过参数的不同来区分不同的方法
- PHP不支持方法重载,但是PHP可以通过其他方法来模拟方法重载
# 利用魔术方法模拟方法重载
<?php
class Math {
public function __call($fn_name,$fn_args) {
$sum=0;
foreach($fn_args as $v) {
$sum+=$v;
}
echo implode(',',$fn_args).'的和是:'.$sum,'<br>';
}
}
$math=new Math();
$math->call(10,20);
$math->call(10,20,30);
$math->call(10,20,30,40);
?>
<?php
class Overloader {
private $properties= array();
function __get($property_name){
if(isset($this->properties[$property_name])){
return($this->properties[$property_name]);
}else{
return(NULL);
}
}
function __set($property_name, $value){
$this->properties[$property_name]= $value;
}
public function __call($method, $p){
print("Invoking $method()<br>\n");
//print("Arguments: ");
//print_r($args);
if($method == 'display'){
if(is_object($p[0]))
$this->displayObject($p[0]);
else if(is_array($p[0]))
$this->displayArray($p[0]);
else $this->displayScalar($p[0]);
}
}
public function displayObject($p){
echo ("你传入的是个对象,内容如下:<br>");
print_r($p);
echo "<hr>";
}
public function displayArray($p){
echo ("你传入的是个数组,内容如下:<br>");
print_r($p);
echo "<hr>";
}
public function displayScalar($p){
echo ("你传入的是个单独变量,内容如下:<br>" . $p);
echo "<hr>";
}
}
$obj= new Overloader();
//调用 __set() 给一个不存在的属性变量赋值
$obj->dynaProp = "Dynamic Content";
//调用 __get()
print($obj->dynaProp."<br>\n");
//调用 __call()
$obj->dynaMethod("Leon", "Zeev");
// $obj->display(array(1,2,3));
// $obj->display('Cat');
?>