php面向对象之重载(overloading)

PHP的重载 传统的”重载”是用于提供多个同名的类方法,但各方法的参数类型和个数不同。__set() 方法的 value参数指定了value参数指定了name 变量的值。当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。当对不可访问属性调用 unset() 时,__unset() 会被调用。在对象中调用一个不可访问方法时,__call() 会被调用。读取不可访问属性的值时,__get() 会被调用。 阅读详情

在java中,重载就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法,这也牵涉到了多态。

在PHP中呢,有人说php没有多态,那重载呢?

PHP所提供的"重载"(overloading)是指动态地"创建"类属性和方法,分为属性的重载和方法的重载;

我们是通过魔术方法(magic methods)来实现的,当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。本节后面将使用"不可访问属性(inaccessible properties)"和"不可访问方法(inaccessible methods)"来称呼这些未定义或不可见的类属性或方法。

属性重载

public void __set ( string $name , mixed $value )
public mixed __get ( string $name )
public bool __isset ( string $name )
public void __unset ( string $name )

在给不可访问的属性赋值时,__set() 会被调用。

读取不可访问的属性的值时,__get()会被调用。

当判断不可访问的属性是否存在的时候(使用isset(),empty())时,__isset()会被调用。

当对不可访问的属性执行销毁操作(unset())的时候,__unset()会被调用。

__get()方法,有两个参数,$name是指要操作的变量名称(另外三个都是这个意思),$value是指对应name的值。

一个很简单的例子:

class Person {
    public $name;
    private $age;

    public function __set($name, $value)
    {
        echo "你赋值的属性{$name}不存在";
    }

    public function __get($name)
    {
        echo "你所访问的属性{$name}不存在";
    }

    public function __isset($name)
    {
        echo "你判断的属性{$name}不存在";
    }

    public function __unset($name)
    {
        echo "你销毁的属性{$name}不存在";
    }
}

$person = new Person();
echo '赋值操作:',$person->gender = 'nale',<br />';
echo '取值操作:',$person->gender,'<br />';
echo 'isset判断操作:',isset($person->gender),'<br />';
echo 'empty判断操作:',empty($person->gender),'<br />';
echo 'empty判断操作:',empty($person->gender),'<br />';
echo 'unset操作:';unset($person->gender);
结果如下:


empty这里后面有个1是因为当前返回的是true,输出来就是1了;

当然,大家也会发现,没有这些魔术方法,我照样可以跑通,我把这些魔术方法注释掉:

class Person {
    public $name;
    private $age;

//    public function __set($name, $value)
//    {
//        echo "你赋值的属性{$name}不存在";
//    }
//
//    public function __get($name)
//    {
//        echo "你所访问的属性{$name}不存在";
//    }
//
//    public function __isset($name)
//    {
//        echo "你判断的属性{$name}不存在";
//    }
//
//    public function __unset($name)
//    {
//        echo "你销毁的属性{$name}不存在";
//    }
//
//    public function __call($name, $arguments)
//    {
//        echo '你在调用不存在的方法';
//    }
}

$person = new Person();
echo '赋值操作:',$person->gender = 123,'<br />';
echo '取值操作:',$person->gender,'<br />';
echo 'isset判断操作:',isset($person->gender),'<br />';
echo 'empty判断操作:',empty($person->gender),'<br />';
echo 'empty判断操作:',empty($person->gender),'<br />';
echo 'unset操作:';unset($person->gender);
echo '取值操作:',$person->gender,'<br />'; //访问不存在的属性,因为被销毁了,应该会报一个notic级别的错误

运行如下所示:


这个是因为在PHP中,并没有强制属性都在类中声明,这是动态的给对象属性赋值,在其它强类型语言中,可能行不通,所以在一般时候,并不建议这样写。

那如果有这种动态增加值的需求的时候怎么办呢,我们可以利用属性的重载来完成,如下:

class Person {
    public $name;
    private $age;
    private $_attr = array();

    public function __construct($name,$age)
    {
        $this->name = $name;
        $this->age = $age;
    }

    public function __get($name)
    {
        if($this->_attr[$name]){
            return $this->_attr[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        $this->_attr[$name] = $value;
    }

    public function __isset($name)
    {
        return isset($this->_attr[$name]);
    }
    public function __unset($name)
    {
        unset($this->_attr[$name]);
    }
}

$person = new Person('lightWay', 24);

//赋值操作
$person->gender = 'male';
$person->home = 'hubei';

echo $person->home; //取值操作
unset($person->home); //销毁操作

方法重载

public mixed __call ( string $name , array $arguments )
public static mixed __callStatic ( string $name , array $arguments )

在对象中调用一个不可访问方法时,__call() 会被调用。


在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。

$name 参数是要调用的方法名称。$arguments 参数是一个枚举数组,包含着要传递给方法 $name 的参数。

上代码说明吧:

class Person {
    public function __call($name, $arguments)
    {
        echo '您正在调用一个不存在的方法',self::class,'::',$name,PHP_EOL;
        print_r($arguments);
    }

    public static function __callStatic($name, $arguments)
    {
        echo '您正在调用一个不存在的静态方法',self::class,'::',$name,PHP_EOL;
        print_r($arguments);
    }
}

$person = new Person();
$person->sayMyInfo1('123',2,true);
$person::show(1,2,3);
执行结果如下:



我们可以用PHP中的重载,去模拟其他语言中的重载,代码如下:

class Person {
    public $name;
    public function __construct($name)
    {
        $this->name = $name;
    }

    public function __call($name, $arguments)
    {
        if($name == 'eating') {
            switch (count($arguments)) {
                case 1 :
                    echo "{$this->name}正在用{$arguments[0]}吃中餐",PHP_EOL;
                    break;
                case 2 :
                    echo "{$this->name}正在用{$arguments[0]}和{$arguments[1]}吃西餐",PHP_EOL;
                    break;
                case 0:
                default:
                    echo "{$this->name}在喝西北风",PHP_EOL;
                    break;
            }
        } else {
            echo '您访问的方法不存在';
        }
    }


}

$my = new Person('lightWay');

$my->eating('筷子');

$my->eating('刀','叉子');

$my->eating();

执行结果如下:


这里只是用了参数的不同,来执行不同的动作,可以利用的点很多,很多框架都会到这个,好吧,这里就完了,看完了,你还觉得PHP没用多态吗?

Windows10下部署Heygem进行数字人生成 对于使用Heygem生成数字人,需要注意几个问题: + 需要使用Nvidia的显卡。 + 需要在Windows上进行本地部署。主要原因为客户端是Windows的,客户端对上传的视频写入硬编码的`D:\heygem_data\voice\data`目录,需要在容器上读取这些文件。 + 需要在Windows上部署Docker,将Windows的目录映射到容器中,由容器中的服务进行读取。 + 需要特别注意,一定要有D盘,这个D盘是Windows的D盘,不能是插入的USB设备后产生的D盘。 + 需要下载3个Doc 阅读详情

相关推荐

宏基因组分析|从Binning到MAG优化的全流程实战指南

本文提供了一份宏基因组分析从Binning到MAG优化的全流程实战指南。详细解析了宏基因组分箱(Binning)的核心原理与必要性,并手把手指导如何利用Bowtie2、MetaBAT2和CheckM等工具构建分箱流水线,进行质量评估与筛选,最终获得高质量宏基因组组装基因组(MAG)。文章还分享了常见问题排查与进阶优化策略,为后续物种分类、功能注释等深度分析奠定坚实基础。

weixin_29260291的博客 455

php重载overload,PHP和JAVA中的重载(overload)和覆盖(override) 介绍_PHP教程

重载:同一个类中,函数名一样,返回值或者参数类型,个数不一样的叫做重载。覆盖:同名函数,同返回值类型,同参数的叫做覆盖。指的是子类对父类中方法的覆盖。PHP不支持方法和操作符重载。JAVA不支持操作符的重载(但是“+”实际上是一种操作符重载)。复制代码 代码如下:Class Father {public function fmeth1() {echo “fmeth1()…“;}//public f...

weixin_39808877的博客 159

Java 开发 修改【冒险岛 079 私服】完整学习流程

第 1-2 天:环境搭建 + 运行原版 079 服务端,能正常登录游戏;第 3-4 天:纯配置文件修改,掌握倍率、属性、怪物、道具的修改,改出第一个「百倍经验私服」;第 5-10 天:Java 代码基础修改,掌握 Player/Skill/Monster 核心类的修改,实现技能无冷却、一刀秒怪、升级满属性;第 11-20 天:Java 代码进阶修改,掌握业务逻辑修改,实现死亡不掉经验、自动捡物、装备强化无失败;第 21-30 天。

萧曳丶 3888

PHP中重载

PHP中的重载 PHP中重载就重新在加载的意思,和c++,Java里面的重载的概念不太一样,c++,java一般指的是重复加载; 重载overload是指PHP对当前对象的不可访问成员的处理; 其中不可访问成员指的是:没有定义的成员,还有因为受到访问控制而访问不到的; 默认的处理方式是: 1、当访问不存在的成员的时候会自动把访问的成员按照共有的属性添加到类中‘ 2、受到访问权限控制

woshinannan的专栏 2667

别再被SpringerLink虐了!手把手教你搞定LaTeX源文件提交(附正确文件顺序和类型选择)

本文详细解析了SpringerLink投稿系统中LaTeX源文件提交的常见问题与解决方案,包括文件打包、类型选择和顺序排列等关键步骤。通过实战经验,帮助科研人员避开隐形陷阱,一次性完成LaTeX提交,提升投稿效率。特别针对`.bst`和`.cls`文件的正确处理提供了专业指导。

weixin_42522964的博客 444

android studio 2022打开了v1 签名但是生成的apk没有v1签名问题

我使用了Android Studio Flamingo | 2022.2.1 Patch 2版本的IDE编译了一个apk,但是apksigner查看apk的签名信息时,发现只有v2签名,没有v1签名。试着改小一下minSdkVersion 为23重新编译apk,再检测一下签名版本v1居然打开了!参考网上搜索到的方法,手动在build.gradle里面添加。但是编译出来的apk还是只有v2的签名。里面提到了v1签名还和。

hedalei的博客 466

php 类的重载,PHP中重载详解

PHP中的重载和别的面向对象(C#、Java)语言不同,如:在C#中的重载表示,具有相同的方法名,但是形参列表不同(即形参的个数、类型、排列方式中的一个不同)函数,会在调用时根据形参列表来决定该调用那个方法。而在PHP中重载是针对当前对象不可访问成员(没有定义或者定义了但访问不到)的处理:...

weixin_39913648的博客 314

CorelDraw插件开发-Cdr插件-CPG插件-GMS插件-安装位置

文章目录1.gms格式插件2.cpg格式插件3.作者答疑   CorelDraw软件是一款使用非常广泛的矢量图形软件,系统本身提供了非常便利的二次开发环境,制作插件的格式有两种,一种是gms格式的脚本插件,另外一种是cpg格式dll插件。 1.gms格式插件   gms格式插件是使用微软的 VBA 技术,编写和调试都比较方便,从9的版本开始支持。   安装:把gms文件复制到程序所安装的目录 gms 下,一般在C:\Program Files\Corel\CorelDRAW Graphics Suite 1

插件开发 2750

php实现重载

php是弱类型语言,并没有像JAVA这种强类型语言一样有重载。 重载一般来说就是拥有相同的函数名或方法名,但是参数列表却不同(包括参数个数和参数类型) 从这个定义来说,php是没有重载的,因为php不允许存在相同的函数名。 但是没有并不意味着不能实现。 php有四种机制可以实现重载:(下面用java进行对比)1.弱类型,无需定义变量类型 先举一个JAVA重载的例子:class demo

Hello World 4526

今日头条面试——iOS开发面试题

layoutIfNeeded和setNeedsLayout的区别。* Pod update和pod install的区别。* 10、autoreleasepool的使用场景。* 如何hook一个对象的方法,而不影响其它对象。* 数组cop后里面的元素会复制一份新的吗。* 介绍项目,主要介绍自己强项一点的地方。* assing可以使用在对象中吗。* isEquel和hash的关系。* 4、谈谈runtime的理解。* 8、谈谈runloop的理解。* copy和strong的区别。

FPGA/MATLAB学习教程/源码/项目合作开发 593

【SWAT】SWAT中预定义河网及流域

平原圩区没有明显的海拔差异。DEM中包含的地形信息无法定义河段的位置和水文连接,SWAT模型Watershed Delineator中提供两种方法,帮助用户输入流域拓扑信息。第一种方法,“Burn-in”和手动绘制河段和子流域边界。首先,使用“Burn-in”功能导入数字河道网络(DCN),并根据DEM和DCN绘制河流和子流域。然后在ArcGIS中编辑“流域”和“河段”层,可以调整位置、范围和水文连接。第二种方法,可以手动绘制或重新编辑河流和子流域,预定义河网及流域。

```On Earth, Be Water, By Coding``` 3273

PHP面向对象_重载(overloading)

重载PHP所提供的”重载”(overloading)是指动态地”创建”类属性和方法。是通过魔术方法(magic methods)来实现的。当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。本节后面将使用 “不可访问成员(inaccessible members)”和”不可访问方法(inaccessible methods)”来称呼这些未定义或不可见的类属性或方法。所有的重载方法都必须

Yeoman92的博客 1440

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

PHP面向对象1-重载overloading

PHP中的重载,并不是传统意义上的重载。 当程序中碰到未定义的属性或方法时,自动调用对应的方法进行处理,就是PHP中的重载!!! 链接:http://www.php.net/manual/zh/language.oop5.overloading.php1.属性重载__set(),__get(),__isset(),__unset()四个方法,分别用于赋值,取值,判断是否赋值,释放。1.__set

kikajack的博客 461

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

mysql 函数重载_PHP面向对象程序设计重载(overloading)操作详解

本文实例讲述了PHP面向对象程序设计重载(overloading)操作。分享给大家供大家参考,具体如下:重载PHP中的”重载”与其它绝大多数面向对象语言不同,只是他们都是用的相同的名词而已。传统的”重载”是用于提供多个同名的 类方法,但各方法的参数类型和个数不同。 PHP所提供的”重载”(overloading)是指动态地”创建”类属性和方法。当调用当前环境下未定义或不可见的类属性或方法时,重载方...

weixin_29696711的博客 171

php面向对象程序设计心得,PHP面向对象程序设计重载(overloading)操作详解

本文实例讲述了PHP面向对象程序设计重载(overloading)操作。分享给大家供大家参考,具体如下:重载PHP中的”重载”与其它绝大多数面向对象语言不同,只是他们都是用的相同的名词而已。传统的”重载”是用于提供多个同名的 类方法,但各方法的参数类型和个数不同。 PHP所提供的”重载”(overloading)是指动态地”创建”类属性和方法。当调用当前环境下未定义或不可见的类属性或方法时,重载方...

weixin_36386962的博客 151

php面向对象重载实例,PHP面向对象重载重写的不同

PHP面向对象重载重写的不同重载(Overloading)a、方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。b、Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是...

weixin_39727976的博客 93

【PHP 重载(Overloading)——不是你想的那样!】

你找的东西不存在?别急,我有魔法帮你搞定!这些“魔法”就是所谓的魔术方法(Magic Methods)。问题回答PHP 有 Java 那种方法重载吗?❌ 没有!PHP 不支持同名不同参的方法PHP 的“重载”是啥?✅ 是“动态处理不存在的属性/方法”靠什么实现?__get__set__call等什么时候触发?✅ 访问“不可访问”或“不存在”的属性/方法时能做什么?✅ 动态属性、API 路由、Mock 对象、配置类等。

weixin_43749992的博客 960

PHP 重载(Overloading)——不是你想的那样!

你找的东西不存在?别急,我有魔法帮你搞定!这些“魔法”就是所谓的魔术方法(Magic Methods)。问题回答PHP 有 Java 那种方法重载吗?❌ 没有!PHP 不支持同名不同参的方法PHP 的“重载”是啥?✅ 是“动态处理不存在的属性/方法”靠什么实现?__get__set__call等什么时候触发?✅ 访问“不可访问”或“不存在”的属性/方法时能做什么?✅ 动态属性、API 路由、Mock 对象、配置类等。

2401_89221445的博客 339

PHP面向对象之重写与重载

<?php /*** ====笔记部分==== 重写/覆盖 override 指:子类重写了父类的同名方法 重载: overload 重载是指:存在多个同名方法,但参数类型/个数不同. 传不同的参数,调用不同的方法 但是在PHP中,不允许存在多个同名方法. 因此,不能够完成java,c++中的这种重载 但是,PHP的灵活,能达到类似的效果 ***/ /**** 代码部分

邴辉 1万+

php面向对象(三),抽象类,抽象方法,接口及php的”重载“

抽象类 定义:一个抽象的不能被实例化的类。 定义形式(abstract关键字):abstract class 类名{ // ... } 抽象方法 定义:一个只有方法头,没有方法体的方法 定义形式(用abstract修饰方法)abstract class 类名{ abstract function 方法名(形参列表); // 没有方法体,结尾分号不能省略 } 抽象类和抽象方法的细节:

宿罪的博客 4008

php面向对象——重写与重载

重写 override 子类重写父类的同名方法 PHP的类方法重写规则 1、final修饰的类方法不可被子类重写 重载 overload

沉梦昂志 268

php版本哪个没有面向对象,php面向对象的方法重载两种版本比较

php面向对象的方法重载两种版本比较发布于 2014-09-28 09:40:01 | 63 次阅读 | 评论: 0 | 来源: 网友投递PHP开源脚本语言PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适用于Web开发领域。PHP的文件后缀名为ph...

weixin_42351606的博客 196

php面向对象中重载_php面向对象中子类中重载父类详解

本文章来给大家整理一下关于php面向对象中子类中重载父类详解,希望此文章对各位理解php子类中重载父类有所帮助哦。因为在PHP中不能存在同名的函数,所以在同一个类中也就不能定义重名的方法。这里所说的重载是指在 子类中可以定义和父类同名的方法从而覆盖从父类中继承过来的方法。子类中重载父类的方法代码如下复制代码class Person{public $name;public function _...

weixin_39926943的博客 168

php深入学习三——面向对象以及函数重载

本文仅就Php面向对象的函数重载(多态)作介绍。并给出一段实例代码和控制台输出结果,并对其运行过程作相对详细的讲解。便于理解。但注意需要自己多做不同的尝试,举一反三。

FUNCO_小风 756

php面向对象重载和重写,php面向对象的方法重载两种版本比较

多个函数用同一个名字,但参数表,即参数的个数或(和)数据类型可以不同,调用的时候,虽然方法名字相同,但根据参数表可以自动调用对应的函数。PHP4 中仅仅实现了面向对象的部分的、简单的功能,而 PHP5 以后对对象的支持就强大的多了。对于多态的实现,PHP4 只支持覆盖(override),而不支持重载(overload)。但我们可以通过一些技巧来“模拟”重载的实现。PHP5 虽然可以支持覆盖和重载...

weixin_35044945的博客 146
上一篇: php中的反射机制
下一篇: php删除文件夹
键盘钢琴师
博客等级 码龄11年 21粉丝 58原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值