php类与对象(八)重载

php面向对象全攻略 (八)重载新的方法 12.重载新的方法 在学习PHP 这种语言中你会发现,PHP 中的方法是不能重载的,所谓的方法重载就是 定义相同的方法名,通过“参数的个数”不同或“参数的类型”不同,来访问我们的相同方法 名的不同方法。但是因为PHP 是弱类型的语言,所以在方法的参数中本身就可以接收不同类 型的数据,又因为PHP 的方法可以接收不定个数的参数,所以通过传递不同个数的参数调用 不相同方法名的不同方法也是不成立的。所以在PHP 里面没有方法重载。不能重载也就是在 你的项目中不能定义相同方法名的方法。另外,因为PHP 没有名子空间的概念,在同一个页 面和被包含的页面中不能定义相同名称的方法,也不能定义和PHP 给我提 立即下载

PHP所提供的重载(overloading)是指动态地创建类属性和方法。我们是通过魔术方法(magic methods)来实现的。

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

所有的重载方法都必须被声明为 public。

注意:

这些魔术方法的参数都不能通过引用传递。

注意:

PHP中的重载与其它绝大多数面向对象语言不同。传统的重载是用于提供多个同名的类方法,但各方法的参数类型和个数不同。

属性重载

public __set ( string $name , mixed $value ) : void

public __get ( string $name ) : mixed

public __isset ( string $name ) : bool

public __unset ( string $name ) : void

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

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

当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。

当对不可访问属性调用 unset() 时,__unset() 会被调用。

参数 $name 是指要操作的变量名称。__set() 方法的 $value 参数指定了 $name 变量的值。

属性重载只能在对象中进行。在静态方法中,这些魔术方法将不会被调用。所以这些方法都不能被 声明为 static。从 PHP 5.3.0 起, 将这些魔术方法定义为 static 会产生一个警告。

注意:

因为 PHP 处理赋值运算的方式,__set() 的返回值将被忽略。类似的, 在下面这样的链式赋值中,__get() 不会被调用:

 $a = $obj->b = 8; 

注意:

在除 isset() 外的其它语言结构中无法使用重载的属性,这意味着当对一个重载的属性使用 empty() 时,重载魔术方法将不会被调用。

为避开此限制,必须将重载属性赋值到本地变量再使用 empty()。

//属性重载
class PropertyTest {
     /**  被重载的数据保存在此  */
    private $data = array();

 
     /**  重载不能被用在已经定义的属性  */
    public $declared = 1;

     /**  只有从类外部访问这个属性时,重载才会发生 */
    private $hidden = 2;

    public function __set($name, $value) 
    {
        echo "Setting '$name' to '$value'\n";
        $this->data[$name] = $value;
    }

    public function __get($name) 
    {
        echo "Getting '$name'\n";
        if (array_key_exists($name, $this->data)) {
            return $this->data[$name];
        }

        $trace = debug_backtrace();
        trigger_error(
            'Undefined property via __get(): ' . $name .
            ' in ' . $trace[0]['file'] .
            ' on line ' . $trace[0]['line'],
            E_USER_NOTICE);
        return null;
    }

    /**  PHP 5.1.0之后版本 */
    public function __isset($name) 
    {
        echo "Is '$name' set?\n";
        return isset($this->data[$name]);
    }

    /**  PHP 5.1.0之后版本 */
    public function __unset($name) 
    {
        echo "Unsetting '$name'\n";
        unset($this->data[$name]);
    }

    /**  非魔术方法  */
    public function getHidden() 
    {
        return $this->hidden;
    }
}


echo "<pre>\n";

$obj = new PropertyTest;

$obj->a = 1;
echo $obj->a . "\n\n";

var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
echo "\n";

echo $obj->declared . "\n\n";

echo "Let's experiment with the private property named 'hidden':\n";
echo "Privates are visible inside the class, so __get() not used...\n";
echo $obj->getHidden() . "\n";
echo "Privates not visible outside of class, so __get() is used...\n";
echo $obj->hidden . "\n";

 

方法重载

public __call ( string $name , array $arguments ) : mixed

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

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

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

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

//方法重载

class MethodTest 
{
    public function __call($name, $arguments) 
    {
        // 注意: $name 的值区分大小写
        echo "Calling object method '$name' "
             . implode(', ', $arguments). "\n";
    }

    /**  PHP 5.3.0之后版本  */
    public static function __callStatic($name, $arguments) 
    {
        // 注意: $name 的值区分大小写
        echo "Calling static method '$name' "
             . implode(', ', $arguments). "\n";
    }
}

$obj = new MethodTest;
$obj->runTest('in object context');

MethodTest::runTest('in static context');  // PHP 5.3.0之后版本

 

 

 

 

【黑马-产品经理入门基础课笔记】01.认识产品经理 问题定义 ==> 可行性研究 ==> 需求分析。 阅读详情

相关推荐

从充电管理芯片里‘偷师’:拆解一个PMOS双向开关电路,搞定你的固态继电器需求

本文深入解析了PMOS双向开关电路在固态继电器应用中的设计要点,重点探讨了防电流倒灌和高侧双向开关的实现技巧。通过拆解充电管理芯片中的PMOS背靠背结构,工程师可以构建高效可靠的固态开关方案,适用于智能硬件和电池管理系统。文章还提供了关键参数选择、电路优化建议及实测数据对比,助力解决电源防反接等工程难题。

weixin_33698043的博客 483

php 魔术方法 重载

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34258838的博客 118

当 AI + 可视化融入消防:开启智能消防新时代

总结来说,AI + 可视化技术融入消防,开启了智能消防新时代。它以精准预警、高效救援和全面资源管理,革新消防工作方式。从前期规划到系统搭建,再到后期运维,每个环节都为提升消防能力奠定基础。尽管面临技术成本、数据安全和人员适应等挑战,但随着技术发展和应用推广,这些问题将逐步解决。相信在 AI + 可视化助力下,消防领域将不断进步,为人们创造更安全生活环境,有效抵御火灾威胁。

2401_87844374的博客 1220

php8拦截器,新的概念:php后期静态绑定与重载/拦截器的所有方法

一、后期静态绑定的原理与实现:后期静态绑定的功能,用于在继承范围内引用静态调用的类。“后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。1-当实现类中2个函数功能相同时,可以写在抽象类中,抽象类不能实例化。2-将类的定义与类的调用分离开。3-用后期静态绑定,使用关键字static将self替换self 始终与定义它的类绑定static始终与调用它的类...

weixin_39609051的博客 209

Adobe Acrobat Pro(Adobe PDF) - 使用技巧

Adobe Acrobat Pro为Adobe出品的PDF查看和编辑软件,下文简称Adobe PDF,该软件功能强大,拥有查看PDF、编辑PDF、打印PDF、导出PDF、合并文件、组织页面、文本标注、注释、动作向导、等功能。本文介绍Adobe PDF的一些使用技巧,最后介绍软件设置。

NSJim的博客 4万+

从零搭建Arduino仿真开发环境:SimulIDE与IDE配置全攻略

本文详细介绍了如何从零搭建Arduino仿真开发环境,涵盖SimulIDE与Arduino IDE的配置全流程。通过仿真模拟环境,开发者可以零成本试错,快速验证电路设计和程序逻辑,特别适合初学者和便携开发需求。文章提供了软件安装、环境配置、项目实战及问题排查的完整指南,帮助读者高效掌握Arduino仿真开发技巧。

weixin_29284657的博客 523

php实现重载

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

Hello World 4526

华为OD机试真题 新系统 【社交网络相同爱好好友查询】

华为od机试真题 新系统【社交网络相同爱好好友查询】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为od机试真题【社交网络相同爱好好友查询】多语言题解实现。

qq_45776114的博客 1337

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

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

weixin_43749992的博客 960

华为OD机考双机位C卷 - 信道分配(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 信道分配

算法大师! 453

Qt版Dalsa线扫相机的采集Demo

Qt Dalsa

追赶时代的博客 605

php类的重载,【php类与对象】重载

本篇文章给大家分享的内容是关于【php类与对象】重载,有着一定的参考价值,有需要的朋友可以参考一下重载(overloading)定义:指动态地”创建”类属性和方法。实现:魔术方法。当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。所有的重载方法都必须被声明为 public这些魔术方法的参数都不能通过引用传递。属性重载public void __set ( string $name ...

weixin_32762821的博客 156

DataCastle-租金预测

ID:编号;时间:房屋信息采集的时间;小区名:房屋所在小区,已脱敏处理;小区房屋出租数量:小区出租房屋数量,已脱敏处理;楼层:0、1、2分别表示楼层低,中,高;总层数:房屋所在建筑的总楼层数,已脱敏处理;房屋面积:房屋面积数值,已脱敏处理;房屋朝向:房屋的朝向;居住状态:房屋的居住状态,表示是否已出租或居住中,已脱敏处理;卧室数量:户型信息,数字表示卧室的个数;卫的数量:户型信息,数字表示卫生间的个数;厅的数量:户型信息,数字表示厅的个数;

优快云 精品推荐 3457

Java面向对象(类,对象,构造方法,方法重载以及对象与引用

成员变量:类中的方法外的变量 就是为成员变量局部变量:方法中的变量 局部变量。

JUGkingCanYon的博客 1733

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

PHP类与对象 (基础)

在面向对象编程(Object-Oriented Programming,简称OOP)中,类和对象是两个关键概念。类是一种抽象的数据类型,用于定义对象的属性和行为。对象是类的具体实例,具有类所定义的属性和行为。

diaobusi的博客 2437

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

php基础:类与对象

在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。任何类的划分都是主观的,但必须与具体的应用有关。在面向对象的程序设计(英语:Object-oriented programming,缩写:OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。− 简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。

qq_52957703的博客 1060

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

php5 面向对象总结(类与对象)

1. PHP 类与对象  2. PHP 类的继承 extends 关键字  3. PHP 构造方法 __construct()  4. PHP 析构方法 __destruct()  5. PHP final 关键字  6. PHP 类的接口 interface 与 im

rh09jhl的专栏 1355

PHP面向对象之重写与重载

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

邴辉 1万+

重载与过载 php,PHP中的重载与接口

遗留问题:资源和对象区别:我们目前学习到的资源只有两种:1.$link=mysql_connect("localhost","root","123");得到一个"连接MySQL数据库"的资源。2.$result=mysql_query("select...");结果集资源,资源变量可以理解为php代码之外的已经有的"对象"。PHP对象是通过PHP代码创建出来的。重载一个类中,有多个同名方法,每个方...

weixin_28752415的博客 298

PHP 类与对象 —— 重载

动态地“创建”类属性和方法。 通过魔术方法(magic methods)来实现。 当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。 所有的重载方法都必须被声明为 public。 //在给不可访问属性赋值时,__set() 会被调用。 //参数 $name 是指要操作的变量名称。__set() 方法的 $value 参数指定了 $name 变量的值。 public __set ( string $name , mixed $value ) : void //读取不可访问属性的值时,__g.

lzh469669355的博客 335

php 类与对象 所有用法,PHP中类与对象功能、用法实例解读

本文实例讲述了PHP中类与对象功能、用法。分享给大家供大家参考,具体如下:1. 类与对象类是面向对象程序设计的基本概念,是一类东西的结构描述 , 是一种抽象的概念 . 对象是一类东西的一个具体的实例 , 是具体事物 .对象通过new关键字进行实例化:比如汽车可以抽象为一个类,汽车拥有名字、轮胎、速度、重量等属性,可以有换挡、前进、后退等操作方法。// 定义一个汽车类class Car {$name...

weixin_39636717的博客 113

php的类和面向对象,PHP基础学习 之 类与面向对象

一、类的定义与对象创建1.定义一个类class Car {//定义属性public $name = '汽车';//定义方法public function getName() {//方法内部可以使用$this伪变量调用对象的属性或者方法return $this->name;}创建对象第一种方式:$car = new Car();第二种方式:用变量来创建$className = 'Car';$c...

weixin_36280540的博客 224

php面向对象之重载(overloading)

在java中,重载就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法,这也牵涉到了多态。 在PHP中呢,有人说php没有多态,那重载呢? PHP所提供的"重载"(overloading)是指动态地"创建"类属性和方法,分为属性的重载和方法的重载; 我们是通过魔术方法(magic methods)来实现的,当调用当前环境下未

lightWay的博客 4094

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

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

沉梦昂志 268

php继承和重载区别,PHP类的继承与重载

/*?* WEB开发笔记 www.chhua.com 每日练习之 继承与重载?*/class Product {//基类?public $name;?public $type;??public function __construct($name,$type){??$this->name=$name;??$this->type=$type;?}??public function get...

weixin_30728435的博客 170

php的对象可以遍历吗,【php类与对象】遍历

本篇文章给大家分享的内容是关于【php类与对象】遍历 ,有着一定的参考价值,有需要的朋友可以参考一下遍历对象PHP 5 提供了一种定义对象的方法使其可以通过单元列表来遍历默认情况下,所有可见属性都将被用于遍历。Example #1 简单的对象遍历(foreach 遍历所有其能够访问的可见属性。)...

weixin_28782823的博客 148
上一篇: php类与对象(七)面向对象的三大基本特征,五大基本原则
下一篇: php类与对象(九)魔术方法
wiscourper_
博客等级 码龄17年 1641粉丝 272原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值