php重写与重载
转载:https://blog.csdn.net/binghui1990/article/details/9105237
重写/覆盖 override 指:子类重写了父类的同名方法 (注:1.重写权限不能缩小 2.非静态不能重写成静态,静态也不能重写成非静态 3.参数数量要一样)
重载: overload 重载是指:存在多个同名方法,但参数类型/个数不同. 传不同的参数,调用不同的方法
但是在PHP中,不允许存在多个同名方法. 因此,不能够完成java,c++中的这种重载 ,但是,PHP的灵活,能达到类似的效果
class human{
public function say($name){
echo $name,' 吃了吗?<br />';
}
}
class stu extends human{
public function say($name){
echo '切克闹,卡猫百比<br />';
}
}
$a = new stu;
$a->say(1); //在重写的时候,父类中的方法有参数,子类必须也有参数,就是要兼容的意思。否则会报错。
重写
class Calc {
public function area() {
// 判断一个调用area时,得到的参数个数
$args = func_get_args();
if(count($args) == 1) {
return 3.14 * $args[0] * $args[0];
} else if(count($args) == 2) {
return $args[0] * $args[1];
} else {
return '未知图形';
}
}
}
echo '<br><br>';
$calc = new Calc();
// 计算圆的页面
echo $calc->area(10),'<br />';
// 计算矩形的面积
echo $calc->area(5,8);
模拟重载
转载:https://blog.51cto.com/cnn237111/1284085
由于PHP是弱类型语言,因此函数的输入参数类型无法确定,并且对于一个函数,比如只定义了3个输入参数,PHP却运行调用的时候输入4个或者更多的参数。因此基于这2点,注定了PHP中无法重载函数,事实上,PHP的提供了一个魔术方法,mixed __call ( string name, array arguments )。据官方文档,称此方法可以实现函数重载。
class A
{
function __call ($name, $args )
{
if($name=='f')
{
$i=count($args);
if (method_exists($this,$f='f'.$i)) {
call_user_func_array(array($this,$f),$args);
}
}
}
function f1($a1)
{
echo "1个参数".$a1."<br/>";
}
function f2($a1,$a2)
{
echo "2个参数".$a1.",".$a2."<br/>";
}
function f3($a1,$a2,$a3)
{
echo "3个参数".$a1.",".$a2.",".$a3."<br/>";
}
}
(new A)->f('a');
(new A)->f('a','b');
(new A)->f('a','b','c');
利用__call()重载
同样的在PHP中,实现构造函数的重载,也只能变通的实现。实现的关键要素是获取输入参数,并且根据输入参数判断调用哪个方法。
class A
{
function __construct()
{
echo "执行构造函数<br/>";
$a = func_get_args(); //获取构造函数中的参数
$i = count($a);
if (method_exists($this,$f='__construct'.$i)) {
call_user_func_array(array($this,$f),$a);
}
}
function __construct1($a1)
{
echo "1个参数".$a1."<br/>";
}
function __construct2($a1,$a2)
{
echo "2个参数".$a1.",".$a2."<br/>";
}
function __construct3($a1,$a2,$a3)
{
echo "3个参数".$a1.",".$a2.",".$a3."<br/>";
}
}
$o = new A('a');
$o = new A('a','b');
$o = new A('a','b','c');
构造函数的重载
php中,把构造函数设成私有或者protected,就不能实例化该对象了。
————————————————————————————————————————————————————————
PHP手册中关于重载的内容如下:PHP所提供的"重载"(overloading)是指动态地"创建"类属性和方法。
我们是通过魔术方法(magic methods)来实现的。
如__call($funcname, $arguments) 、 __callStatic($funcname, $arguments)
而JAVA语言中的重载,是指在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。
调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法。
public class DataArtist {
...
public void draw(String s) {
...
}
public void draw(int i) {
...
}
public void draw(double f) {
...
}
public void draw(int i, double f) {
...
}
}
Java 重载
(This article should call this technique "interpreter hooks".=》本文将此技术称为“解释器挂钩”。)———(https://segmentfault.com/q/1010000006038888/a-1020000006039437)
————————————————————————————————————————————————————————
转自:https://www.jianshu.com/p/3e249eada220
重写 :
子类继承父类, 定义和父类名称, 参数列表 完全一致的函数, 新的函数会覆盖旧的方法
重载:
同一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表,即参数的数量或参数类型不能完全相同
联系 && 区别:
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性
重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法 和 相同的参数列表
重载对返回类型没有特殊的要求,不能根据返回类型进行区分
php 不支持重载, 若要实现类似功能使用 Trait 机制
php重写与重载的更多相关文章
- Java中,方法的重写、重载的区别,以及多态的实例
首先我们要明白什么是重写和重载 重写(override):子类方法覆盖了父类的方法. (类与类之间继承的关系) 例:父类代码 public class Deng { public void Qi ...
- PHP面向对象——重写与重载
重写/覆盖 override 指:子类重写了父类的同名方法 class Human{ public function say($name){ echo $ ...
- java知识点--重写与重载
重载(Overload): (1)方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型.重载Overloading是一个类中多态性的一种表现. ...
- Java中重写与重载的辨析
摘要:在我们学习Java过程中,重写与重载使我们在面向对象里要学习的重要知识点之一,那我们看看它们有那些区别: 一.重写 1.概念:简单的说就是子类将从父类继承而来的方法重新实现一次. 2.特点: ① ...
- java_重写与重载的区别
重写与重载的区别 重载(Overloading)和重写(Overriding)是Java中两个比较重要的概念.但是对于新手来说也比较容易混淆.本文通过两个简单的例子说明了他们之间的区别. 定义 重载 ...
- JavaSE基础知识(5)—面向对象(方法的重写与重载)
一.重写 1.说明 子类对继承过来的父类的方法进行改造,这种现象称为方法的重写或覆盖或覆写(Override) 2.要求 方法签名完全一致,jdk5.0之后,允许返回类型可以是子类类型,权限修饰符可以 ...
- 重写(Override) 重载(Overload)
重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重载(Overload)- 参数必须不同 重载(overloadin ...
- Java 面向对象之继承和重写OverWrite,重写和重载的区别,抽象类
01继承的概述 A:继承的概念 a:继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系 b:在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作 ...
- Java基础(七):重写与重载
一.重写(Override): 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是 ...
- 009-对象—— 构造方法__construct析构方法__destruct使用方法 PHP重写与重载
<?php /**构造方法__construct析构方法__destruct使用方法 PHP重写与重载 */ //构造方法:当实例化对象时,自动运行的方法 /*class channel{ fu ...
随机推荐
- Jenkins中shell-script执行报错sh: line 2: npm: command not found
<1>本地执行npm run build--正常 <2>查看环境变量--正常 [root@localhost bin]# echo $PATH /usr/local/node/ ...
- String和ByteBuffer互转
String 转换 ByteBuffer: public static ByteBuffer getByteBuffer(String str) { return ByteBuffer.wrap(st ...
- PHP反序列化进阶寻找和构造
POP链的构造 如果关键代码不在魔术方法中,而是在一个类的普通方法中. 这时候可以通过寻找相同的函数名将类的属性和敏感函数的属性联系起来 <?phpclass lemon { protec ...
- 2019牛客暑期多校训练营(第二场)-D Kth Minimum Clique
题目链接:https://ac.nowcoder.com/acm/contest/882/D 题意:求给定点权无向图中,点权和第k小的完全子图的点权和.(包括空集) 思路:从空集开始,每找到一个完全子 ...
- 浅谈Linux du命令
**du(disk usage),顾名思义,查看目录/文件占用空间大小** 1.查看当前目录下的所有目录以及子目录的大小 du -h du -ah #-h:用K.M.G的人性化形式显示#-a:显示目 ...
- Hive 教程(七)-DML基础
DML,Hive Data Manipulation Language,数据操作语言: 通俗理解就是数据库里与数据的操作,如增删改查,统计汇总等: Loading files into tables ...
- USBIP源码分析
简介 在普通的电脑上,想使用USB设备,必须将插入到主机.USBIP却可以通过网络,让主机访问其他主机上的外部设备,而用户程序完全感知不到区别. usbip的文章在这里:https://pdfs.se ...
- 前端之BOM,DOM
前戏 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的一些交互,我们需要继续学习BOM和DO ...
- 使用zookeeper报错 stat is not executed because it is not in the whitelist. envi is not executed because it is not in the whitelist.
在使用四字命令或者zk ui界面查看zookeeper集群时,出现如下提示: stat is not executed because it is not in the whitelist. envi ...
- 第六篇 ajax
加载异步数据 6-1 加载异步数据 XMLHttpRequest--传统的JavaScript方法实现Ajax功能 6-1-a <!DOCTYPE html PUBLIC "-//W3 ...