定义
override, 子类重写父类中的方法.
子类中重写的方法, 方法名称以及该方法的参数个数和父类中被重写的方法一样, 但是并不要求参数的名称相同.
子类中重写的方法, 访问权限要 >= 父类中的被重写方法的访问权限
代码
<?php
// 父类
class Person
{
protected function say($person)
{
echo 'Person: ' . $person . PHP_EOL;
}
}
// 子类
class Man extends Person
{
public function say($man)
{
parent::say($man);
echo 'Man: ' . $man . PHP_EOL;
}
}
$man = new Man();
// Person: man
// Man: man
$man->say('man');
定义
overload, 一个类中存在多个同名方法, 方法的参数个数 or 参数类型不同, 当传入不同的参数时, 调用不同的方法
在PHP中不允许像JAVA那样多个同名方法, 但是可以用__call魔术方法来实现重载
代码
<?php
// 定义Person类
class Person
{
/**
* public mixed __call ( string $name , array $arguments )
* 在对象中调用一个不可访问方法时, __call() 会被调用
*
* @param string $name 要调用的方法名称
* @param array $arguments 一个枚举数组,包含着要传递给方法$name的参数
*/
public function __call($name, $arguments)
{
if ($name == 'say') {
$argumentsCount = count($arguments);
/**
* bool method_exists ( mixed $object , string $method_name )
* 检查类的方法是否存在
*
* @param mixed $object 对象示例或者类名
* @param string $method_name 方法名
*/
$methodName = 'f' . $argumentsCount;
if (method_exists($this, $methodName)) {
/**
* mixed call_user_func_array ( callable $callback , array $param_arr )
* 调用回调函数, 并把一个数组参数作为回调函数的参数
*
* @param mixed $callback 被调用的回调函数
* @param array $param_arr 要被传入回调函数的数组
*/
call_user_func_array([$this, $methodName], $arguments);
}
}
}
public function f1($param1)
{
echo 'one param: ' . $param1 . PHP_EOL;
}
public function f2($param1, $param2)
{
echo 'two param: ' . $param1 . ',' . $param2 . PHP_EOL;
}
}
$person = new Person;
// one param: one
$person->say('one');
// two param: one,two
$person->say('one', 'two');