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 ...
随机推荐
- deepin系统换软件下载源&商店卡死刷新空白问题解决
deepin换源方法 1. deepin默认的软件下载源网速很慢,所以我们可以自己手动换软件下载源,方法如下: 1.1. 任意地方,右键选择在此打开终端,(快捷键:Ctrl+Alt+T),输入sudo ...
- [Python3] 033 异常
目录 异常 1. 简介 2. 异常的分类 3. 出现异常小例子 例子 4. 异常处理 5. 解决异常小例子 5.1 例子1 5.2 例子2 5.3 例子3 5.4 例子4 6. 手动引发异常 6.1 ...
- Python学习【day05】- Python文件处理
一.打开文件 对文件的操作主要为三步:1.打开文件,得到文件句柄.2.通过句柄对文件进行操作.3.关闭文件 # 默认打开模式为r,encoding默认为系统文件编码 f=open('F:/Go.txt ...
- failed to push some refs to 'git@github.com:cq1415583094/MyBatis.git'解决办法
将本地git仓库代码提交到GitHub上时,出现failed to push some refs to 'git@github.com:cq1415583094/MyBatis.git', 导致的原因 ...
- HDU1305 Immediate Decodability (字典树
Immediate Decodability An encoding of a set of symbols is said to be immediately decodable if no cod ...
- WINDOWS7 系统中建立文件夹映射
如何在WIN7中建立文件夹映射,还有以及MKLINK的具体使用方法: 步骤如下: 1.以映射d盘1文件夹为例: 2.按win+r,输入cmd,点击确定: 3.提示符后输入mklink /J " ...
- PHP 网站大数据大流量与高并发 笔记
前端: 1.域名开启cdn 2.大文件使用oss php: 1.模板编译缓存 服务器: 1.负载均衡 数据库: 1.读写分离 待完善
- 入门&常量&变量
位:二进制中,每个0或1就是一个位,叫做bit(比特) 字节:计算机最小是存储单元(byte或B) 8bit = 1B 常用cmd命令: 启动: Win+R,输入cmd回车切换盘符 盘符名称:进入文件 ...
- jQuery制作弹出窗(模态框)
来源:(二少)在南极 ##index.html <!DOCTYPE html><html lang="zh"><head> <meta c ...
- jq sku实现
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...