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四种基础算法代码实例,包括查找、排序、递归、动态规划四个方面,旨在帮助读者提高对PHP算法的理解和应用。 查找算法 二分查找 二分查找是一种基于比较目标值和查找中值的算法。查找前必须先体会「有序」的重要性。如果数据未排序,需要先排序。 代码实例: function binar…

    PHP 2023年5月23日
    00
  • php打印一个边长为N的实心和空心菱型的方法

    针对您提出的问题,我将会给出详细的Markdown格式的解答及示例说明。我们先依次了解实现的步骤。 实现步骤 判断输入的边长是否为奇数,如果不是则输出错误信息并终止程序; 分别使用双层for循环输出实心和空心菱型。 代码示例 //定义边长N的变量 $N = 5; //判断N是否为奇数 if($N % 2 != 1){ echo "输入的数不是奇数,…

    PHP 2023年5月26日
    00
  • echo, print, printf 和 sprintf 区别

    当我们需要将变量或文本输出到屏幕或文件时,通常会用到一些输出函数,如 echo、print、printf 和 sprintf。这些函数在PHP中都是用来输出字符串的,在使用中我们经常会混淆它们的使用,下面就详细讲解一下它们之间的区别。 echo echo是PHP中最常用的一个输出函数,它可以直接将字符串、变量输出到浏览器或其他输出设备上,输出结果没有返回值,…

    PHP 2023年5月26日
    00
  • php面向对象全攻略 (四)构造方法与析构方法

    下面我将为你详细讲解“php面向对象全攻略(四)构造方法与析构方法”的完整攻略。 一、什么是构造方法和析构方法? 在面向对象编程中,构造方法和析构方法是两个重要的概念。 构造方法 构造方法是一种特殊的方法,它在对象创建时被调用。它用于对新创建的对象进行初始化操作,比如给成员变量赋初值等。 在PHP中,构造方法的函数名必须是__construct,它没有任何返…

    PHP 2023年5月25日
    00
  • PHP实现的AES 128位加密算法示例

    下面我将详细讲解“PHP实现的AES 128位加密算法示例”的完整攻略。 简介 AES是一种对称加密算法,是目前广泛使用的加密算法之一,其中AES-128是AES算法中使用的一种密钥长度为128位的加密方式。在PHP中,可以使用mcrypt扩展程序来实现AES-128加密算法的加密和解密操作。 准备工作 在使用PHP实现AES-128加密算法之前,需要确保已…

    PHP 2023年5月26日
    00
  • PHP会话处理的10个函数

    PHP会话处理是指在web应用程序中建立、维护和终止用户会话的过程。PHP提供了10个函数来处理会话,并随着PHP版本的不同而有所变化。下面是这10个函数的详细介绍及示例说明: session_start() session_start()函数用于创建一个会话或者重新打开一个已经存在的会话,它必须在使用任何其它与会话相关函数前调用。例如,下面的示例展示了如何…

    PHP 2023年5月27日
    00
  • php模拟登陆的实现方法分析

    PHP模拟登录的实现方法分析 在爬取数据的过程中,很多时候需要进行模拟登录才能获取到需要的数据。本篇文章将从理论和实际两方面分析PHP模拟登录的实现方法。 理论分析 相关概念 Cookie 在HTTP协议中,cookie是服务器保存在客户端的一小段文本信息。每次客户端向服务器发送请求时,都会带上这个cookie。服务器通过这个cookie来识别客户端。 Se…

    PHP 2023年5月27日
    00
  • 微信小程序 wx.login解密出现乱码的问题解决办法

    微信小程序 wx.login解密出现乱码的问题解决办法 在微信小程序开发中,经常会用到 wx.login 方法获取用户登录凭证 code,然后将 code 发送给服务器进行解密验证。但是,在解密时可能会遇到解密出现乱码的问题,本文将详细讲解如何解决这个问题。 问题描述 当获取用户登录凭证 code 后,可以调用微信提供的 wx.getUserInfo 方法获…

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