Skip to content

Latest commit

 

History

History
99 lines (91 loc) · 2.58 KB

重写和重载.md

File metadata and controls

99 lines (91 loc) · 2.58 KB

重写和重载

重写

定义

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');