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 ...
随机推荐
- Flash-aware Page Replacement Algorithm
1.Abstract:(1)字体太乱,单词中有空格(2) FAPRA此名词第一出现时应有“ FAPRA(Flash-aware Page Replacement Algorithm)”说明. 2.in ...
- HP UNIX弱口令
这种弱口令直接丢进kali linu里用john --wordlist=zd.txt 加上文件
- PTA(Basic Level)1048.数字加密
本题要求实现一种数字加密方法.首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余--这里用 J 代表 ...
- Redis缓存击穿
缓存击穿 缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞. 比如在做 ...
- Kick Start 2019 Round A Parcels
题目大意 $R \times C$ 的网格,格子间的距离取曼哈顿距离.有些格子是邮局.现在可以把至多一个不是邮局的格子变成邮局,问每个格子到最近的邮局的曼哈顿距离的最大值最小是多少. 数据范围 $ 1 ...
- Eclipse 新建.jsp页面后,页面头部标签报错的解决方法
Eclipse 新建.jsp页面后,页面头部标签报错的解决方法 1.报错地方: 2.解决方法: .jsp页面右键==>BUild Path ==>Configure Build Path. ...
- Java服务,内存OOM问题如何快速定位? (转)
转自:公众号 架构师之路 问题:有一个Java服务出现了OOM(Out Of Memory)问题,定位了好久不得其法,请问有什么好的思路么? OOM的问题,印象中之前写过,这里再总结一些相对通用的方 ...
- Elasticsearch6.2集群搭建, centos7
原文地址,转载请注明出处:https://blog.csdn.net/qq_34021712/article/details/79330028 ©王赛超 环境介绍 服务器 是否可以成为主节点 是否 ...
- Sklearn使用良心完整入门教程
The complete .ipynb file can be download through my share in onedrive:https://1drv.ms/u/s!Al86h1dThX ...
- JavaScript金字塔打印
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...