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

一、概述

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中国际化的字符串排序和比较对象详解 什么是字符串排序和比较? 在编程中,我们经常需要比较和排序字符串,以便对数据进行正确定序和处理。字符串排序通常基于字母表顺序,而字符串比较则可以基于例如字符串的长度等其他因素。 为何需要中国际化的字符串排序和比较? 在中国,我们有一些常见的汉字和字符,例如“阿姨”和“啊呀”,它们在标准的字符串排序中按照字母表排序的话…

    PHP 2023年5月26日
    00
  • 基于php权限分配的实现代码

    下面我将为您详细讲解“基于PHP权限分配的实现代码”的完整攻略。 简介 在网站开发中,通常需要将系统面向各种角色提供不同的功能和操作权限。本文将介绍如何基于PHP实现基本的权限访问控制,以及如何实现简单的角色权限分配。 步骤 构建数据库 首先,我们需要构建一个数据库,用于保存角色和权限信息。本文中我们将使用MySQL数据库。在数据库中,我们需要创建两个表:r…

    PHP 2023年5月23日
    00
  • php列出一个目录下的所有文件的代码

    PHP可以通过scandir()函数列出指定目录下的所有文件和文件夹。下面是PHP列出一个目录下的所有文件的代码。 首先,需要确定要列出哪个目录下的文件,并将该目录的路径存储在一个字符串变量中: $dir = ‘/path/to/directory’; 接下来,使用scandir()函数获取目录中的所有文件和文件夹: $files = scandir($di…

    PHP 2023年5月26日
    00
  • php截取中文字符串不乱码的方法

    完整攻略:php截取中文字符串不乱码的方法 在php中,由于中文字符的编码问题,普通的字符串截取方法会导致中文字符乱码。那么,如何才能截取中文字符串又不会乱码呢?以下是一些解决方法。 一、使用mb_substr()函数截取字符串 mb_substr()函数是php内置的截取字符串的函数,它可以适应不同编码的中文字符,不会出现乱码问题。具体用法如下: $str…

    PHP 2023年5月26日
    00
  • PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式

    首先需要了解一下正则表达式的基本语法。在正则表达式中,空格可以用”\s”表示、换行符可以用”\n”表示、中文逗号可以用”,”表示、英文逗号可以用”,”表示。 要想把空格、换行符、中文逗号等替换成英文逗号,可以使用PHP中的正则表达式函数preg_replace。这个函数可以用来替换字符串的某些部分。具体的语法如下: preg_replace ( mixed …

    PHP 2023年5月26日
    00
  • PHP如何使用array_unshift()在数组开头插入元素

    使用 array_unshift() 函数可以在 PHP 数组的最前面插入一个或多个元素。下面是使用 array_unshift() 函数的完整攻略: 语法格式: array_unshift(array, value1, value2, …) 参数说明: array :必需,规定要插入数据的数组。 value1, value2, … :必需,规定要插…

    PHP 2023年5月26日
    00
  • PHP守护进程化在C和PHP环境下的实现

    PHP守护进程化在C和PHP环境下的实现 简介 PHP守护进程化是指将PHP脚本作为一个进程运行,并且可以持久化执行,不会因为用户访问结束或者脚本执行完成而结束进程。本攻略将探讨如何在C和PHP环境下实现PHP守护进程。 C语言实现 1. 创建守护进程 在C语言中,创建守护进程可以通过调用fork()创建子进程,然后在子进程中进行守护进程的相关操作,具体代码…

    PHP 2023年5月30日
    00
  • 详解C语言中的字符串拼接(堆与栈)

    详解C语言中的字符串拼接(堆与栈) 在 C 语言中,字符串拼接是一个非常基础且常用的操作,本文将详细讲解 C 语言中的字符串拼接及其涉及到的堆与栈。 什么是字符串拼接 字符串拼接是指将两个或多个字符串连接起来,形成一个新的字符串。在 C 语言中,字符串是以字符数组的形式存储的,因此字符串拼接实际上就是将一个字符数组的内容复制到另一个字符数组中,并加上结尾符号…

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