PHP重载

重写,子类重写父类方法。

<?php
/**
 * Created by PhpStorm.
 * User: SillyCat
 * Date: 2024/2/24
 * Time: 20:00
 */



/**
 * php 重写 
 */
class A
{
    public function test($a)
    {
        echo "test1";
    }


}

class childA extends A
{

    public function test($a)
    {
        echo "test2";
    }
}
$obj= new childA();
$obj->test(1);

重载,相同方法名但参数数量或者类型不同。

PHP中不支持同名方法,而且也不区分数据类型,所有PHP不支持传统重载

PHP中的重载:当某些不允许操作发生时,会自动调用的一种内部机制来实现

​ 属性重载:属性不存在或者权限不够访问的时候自动触发

​ 方法重载:方法不存在或者权限不够访问的时候自动触发

1.属性重载

主要使用以下四种魔术方法实现属性重载:

取值:

当对一个对象不存在(未定义或不可见)的属性进行“取值”时,就会自动调用方法:__GET()方法不区分大小写。

赋值:

当对一个对象不存在(未定义或不可见)的属性进行“赋值”时,就会自动调用方法:__SET()

判断(isset):

当对一个对象不存在(未定义或不可见)的属性进行isset()判断时,就会自动调用方法:isset()

销毁(unset):

当对一个对象不存在的(未定义或不可见)属性进行unset()判断时,就会自动调用方法:unset()

以上4个方法,被称为魔术方法。

演示:

<?php

/**
 * Created by PhpStorm.
 * User: SillyCat
 * Date: 2024/2/24
 * Time: 20:10
 */
class UserInfo
{
    public $name;
    private $salary = 999;
    protected $password;

    // 构造函数
    public function __construct($name, $password)
    {
        // 初始化属性
        // 构造函数中可以访问类中私有和受保护的成员
        $this->name = $name;
        $this->password = $password;
    }
    //   属性重载方法:由系统调用
    // 1. __get(): 重载了用户对属性的访问,即读操作
    public function __get($name)
    {
        return ($this->name === 'admin') ? $this->name : 'no admin';
    }
  // 2. __set($name, $value): 写操作
    public function __set($name, $value)
    {
        if ($name === 'salary') {
            if ($this->name === 'admin') {
                $this->salary = $value;
                echo "工资更新成功!<br>";
            } else {
                echo '工资更新需要权限!<br>';
            }
        }
        return $this->name = $value;
    }

    // 3. __isset($name):判断是否有值
    public function __isset(string $name){
        return isset($this->$name);
    }
    ////4. __unset($name):释放资源
   public function __unset(string $name){
        unset($this->$name);
   }
}

$obj= new UserInfo('admin', '123456');

// 读操作
echo $obj->salary.'<hr>';

// 写操作
$obj->salary = 10000;
echo $obj->salary.'<hr>';

// 判断是否有值
echo isset($obj->salary).'<hr>';

// 释放资源(变量)
unset($obj->salary);

echo isset($obj->salary).'<hr>';

2.方法重载

以魔术方法__call()、__callStatic()分别实现对普通方法和静态方法的重载

演示:

<?php

/**
 * Created by PhpStorm.
 * User: SillyCat
 * Date: 2024/2/24
 * Time: 20:29
 */
class TestDemo
{
    // __call(): 访问一个不存在或无权限访问的方法的时候会自动调用
   public function __call($name, $args){
       	return '方法是: ' . $name . '<br>参数列表: <pre>' . print_r($args, true);
   }
    // __callStatic(): 访问一个不存在或无权限访问的静态方法的时候会自动调用
   public static function __callStatic($name, $args){
       	return '静态方法是: ' . $name . '<br>参数列表: <pre>' . print_r($args, true);
   }
}

3.回调执行

实现方法

  • call_user_func()
  • call_user_func_array()

作用:

  • 实现对函数和类方法(包括普通和静态方法)的回调
posted @   傻乎乎的猫  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示