PHP __call()方法实现委托示例

yizhihongxing

一、概述

PHP的__call()方法是一个魔术方法,可以动态地处理对象实例化之后的方法调用。通过__call()方法,我们可以将一个对象实例的方法调用委托给另一个对象实例处理,使代码更加灵活、易于拓展。

二、使用示例

下面给出一个借助__call()方法实现委托的示例,以便更好地理解和掌握这个方法。

具体场景:假设有两个类,分别为“Price”和“Discount”,其中“Discount”类继承自“Price”类。现要实现的功能是:在“Discount”类中,对“Price”类中的所有方法进行重新实现,并在原有实现中添加一定的优惠策略。

示例说明1:

class Price 
{
    public function cost() 
    {
        return 100;
    }
}

class Discount extends Price 
{
    private $price = null;

    public function __construct() {
        $this->price = new Price();
    }

    public function __call($name, $args) {
        if (method_exists($this, $name)) {
            return call_user_func_array(array($this, $name), $args);
        }
        else {
            return call_user_func_array(array($this->price, $name), $args) * 0.9;
        }
    }
}

$discount = new Discount();
echo $discount->cost(); // 输出90

在上面的示例中,我们定义了两个类,“Price”和“Discount”。在“Price”类中,我们定义了一个名为“cost()”的方法,该方法返回数值100。

在“Discount”类中,我们继承了“Price”类,同时重载了其中的“__call()”方法。在该方法中,我们使用了“method_exists()”函数判断是否该方法已经在当前类中定义,如果已定义,则直接调用;否则,委托给“Price”类中的同名方法,并在原有实现上打9折。最后,通过测试,我们可以看到输出的结果为90。

示例说明2:

class Price 
{
    public function cost() 
    {
        return 100;
    }
}

class Discount extends Price 
{
    private $price = null;

    public function __construct() {
        $this->price = new Price();
    }

    public function __call($name, $args) {
        if ($name == "cost") {
            return $this->price->cost() * 0.9;
        }
        else {
            return $this->price->$name(...$args);
        }
    }
}

$discount = new Discount();
echo $discount->cost(); // 输出90

在上面的示例中,我们同样定义了两个类,“Price”和“Discount”。在“Price”类中,我们同样定义了一个名为“cost()”的方法,该方法返回数值100。

在“Discount”类中,我们同样继承了“Price”类,并重载了其中的“__call()”方法。在该方法中,我们首先判断是否为“cost()”方法,在该方法中,我们直接返回原有实现上打9折后的结果;否则,委托给“Price”类中的同名方法。最后,通过测试,我们可以看到输出的结果为90。

三、总结

以上就是PHP中使用__call()方法实现委托的攻略。总体上来说,__call()方法并不是一种推荐使用的方法,因为它容易产生“魔术”效果,增加了代码的复杂性和可维护性。不过,在一些特定的场景下,如需实现对象方法的动态委托,__call()方法仍然是一种不错的选择。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP __call()方法实现委托示例 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • php实现遍历文件夹的方法汇总

    为了实现遍历文件夹的功能,可以使用PHP提供的目录迭代器(DirectoryIterator)、文件迭代器(FilesystemIterator)和递归函数等方式。 目录迭代器(DirectoryIterator) DirectoryIterator 的基本使用 DirectoryIterator 可以基于指定的目录路径或文件夹资源句柄来创建,然后通过对其进…

    PHP 2023年5月26日
    00
  • php实现每日签到功能

    关于如何实现每日签到功能,我给出如下的攻略: 1. 前置条件 需要一个具备MySQL数据库和PHP环境的Web服务器。 用户需要有一个账号系统,存储用户的账号信息和签到记录。 2. 创建MySQL表格 我们需要创建一个名为’members’的表格,用于存储会员的信息,例如会员ID,会员名,上次签到时间等信息,其中ID和会员名需要设置为索引,以方便后期的查询。…

    PHP 2023年5月27日
    00
  • PHP查找数组中只出现一次的数字实现方法【查找特定元素】

    PHP查找数组中只出现一次的数字实现方法【查找特定元素】攻略: 问题描述 给定一个整数数组,在该数组中只有一个元素出现了一次,其它元素均出现了两次。请找出只出现一次的那个数字。 实现步骤 创建一个空数组,用于存放不重复的元素; 遍历给定的整数数组,对于每个元素: 如果该元素已经在新数组中,就从新数组中移除该元素; 如果该元素不在新数组中,就将该元素加入新数组…

    PHP 2023年5月26日
    00
  • php通过asort()给关联数组按照值排序的方法

    以下是关于如何使用asort()函数对PHP关联数组按照值进行排序的完整攻略。 什么是asort()函数? asort()函数是PHP的一个数组排序函数,它可以按照值的大小对关联数组进行排序。 此函数将改变原始数组,并使排序后的数组保留索引关系。 语法格式 asort(array $array, int $sort_flags = SORT_REGULAR)…

    PHP 2023年5月26日
    00
  • php切割页面div内容的实现代码分享

    让我为您详细讲解一下“php切割页面div内容的实现代码分享”完整攻略。 1. 确认需要切割的页面 首先,需要确认需要切割的页面。在这个页面中,需要确定需要切割的 div 的选择器,这样才能准确地获取需要切割的内容。 2. 使用php函数获取页面内容 接下来,需要使用PHP的 file_get_contents() 函数获取需要切割的页面的内容。这个函数能够…

    PHP 2023年5月23日
    00
  • PHP爬虫框架盘点

    PHP爬虫框架盘点 一、什么是爬虫? 爬虫是一种模拟浏览器发送网络请求获取网页数据的程序。爬虫程序可以自动化地从互联网上收集各种数据,例如文本、图片、视频等,也可以对数据进行处理和分析,提供更多有价值的信息。 爬虫程序一般由两部分组成:爬虫引擎和数据处理模块。其中,爬虫引擎主要是通过网络请求模拟浏览器获取数据,数据处理模块则负责对采集到的数据进行解析、清洗、…

    PHP 2023年5月27日
    00
  • php使用ftp实现文件上传与下载功能

    下面我将详细讲解如何使用PHP中的FTP扩展实现文件上传和下载功能。 概述 FTP(File Transfer Protocol)是用来在网络上进行文件传输的一种协议。在WEB开发中,我们可能会需要使用FTP协议进行文件上传和下载。PHP提供了FTP扩展,可以通过该扩展实现文件的上传、下载、删除等操作。 实现文件上传 使用PHP实现FTP文件上传功能主要分为…

    PHP 2023年5月26日
    00
  • 如何利用微信小程序和php实现即时通讯聊天功能

    下面是详细讲解如何利用微信小程序和php实现即时通讯聊天功能的完整攻略。 第一步:创建微信小程序 首先,我们需要在微信开发者工具中创建一个新的小程序。具体步骤如下: 打开微信开发者工具,选择“小程序项目”。 填写相应的小程序名称、AppID等信息。 选择“不使用云开发”,并将“AppID”、 “默认请求域名” 和 “默认上传域名” 填写完成。 点击“创建”,…

    PHP 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部