导航:首页 > 编程语言 > php重载和重写

php重载和重写

发布时间:2022-08-21 08:27:52

php怎么重载已经存在的方法

PHP不支持重载,但是可以利用灵活性模拟java的重载,另外PHP是支持重写的。
模拟重载的例子我写了个,你参考一下
function overloadTest(){
$name = "overload".func_num_args();
$name();
}
function overload0(){
echo 'overload0';
}
function overload1(){
echo 'overload1';
}
function overload2(){
echo 'overload2';
}
overloadTest(); //overload0
overloadTest(1); //overload1
overloadTest(1,1); //overload2

希望对你有帮助!

⑵ PHP面向对象,方法重写的问题

PHP面向对象中方法是不能重载的,
所谓的的方法重载就是:定义相同的方法名. 通过“参数个数”不同或者"参数的类型"不同,来访问相同方法名的不同方法。
所以你这种属于:通过“参数个数”不同,所以PHP中是不允许的。

完全可以采用 抽象类+类实现的方式实现多种不同情况的对象类。

⑶ 什么是PHP面向对象中的重载重写

封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。

重载是一个类里面多态性的体现

重写是父类和子类多态性的体现

⑷ php重载与重写,这里有两幅图,求细说

第二个感觉好奇怪

第二个不算重载吧?

⑸ 重载与重写区别

您写的是方法的重载。
class Bar extends Foo{
/*
void kk(){
}
这个方法是从Foo这个类里继承而来
*/
void kk(String x){
}
}
因此bar类里面有两个方法同名,但是参数类型不一样。
如果
class Bar extends Foo{
/*
void kk(){
}
这个方法是从Foo这个类里继承而来
*/
void kk(){
}
}
这样的话,就是方法的重写,你可以在kk方法里面写您需要的方法。
下面是的一点,您仔细看看
1, 重载(Overloading)
(1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时
存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。
(2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具
有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型
来决定具体使用哪个方法, 这就是多态性。
(3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同
也可以不相同。无法以返回型别作为重载函数的区分标准。
下面是重载的例子:
package c04.answer;//这是包名
//这是这个程序的第一种编程方法,在main方法中先创建一个Dog类实例,然后在Dog
类的构造方法中利用this关键字调用不同的bark方法。不同的重载方法bark是根据其参
数类型的不同而区分的。

//注意:除构造器以外,编译器禁止在其他任何地方中调用构造器。
package c04.answer;

public class Dog {
Dog()
{
this.bark();
}
void bark()//bark()方法是重载方法
{
System.out.println("no barking!");
this.bark("female", 3.4);
}
void bark(String m,double l)//注意:重载的方法的返回值都是一样的,
{
System.out.println("a barking dog!");
this.bark(5, "China");
}
void bark(int a,String n)//不能以返回值区分重载方法,而只能以“参数类型”和“类名”来区分
{
System.out.println("a howling dog");
}

public static void main(String[] args)
{
Dog dog = new Dog();
//dog.bark();
//dog.bark("male", "yellow");
//dog.bark(5, "China");

2, 重写(Overriding)
(1) 父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某

方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,
子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不
动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又
称方法覆盖。
(2) 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,
则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键
字引用了当前类的父类。
(3) 子类函数的访问修饰权限不能少于父类的;
下面是重写的例子:
public class Base
{
void test(int i)
{
System.out.print(i);
}
void test(byte b)
{
System.out.print(b);
}
}
public class TestOverriding extends Base
{
void test(int i)
{
i++;
System.out.println(i);
}
public static void main(String[]agrs)
{
Base b=new TestOverriding();
b.test(0)
b.test((byte)0)
}
}
这时的输出结果是1 0,这是运行时动态绑定的结果。

概念:即调用对象方法的机制。

动态绑定的内幕:

1、编译器检查对象声明的类型和方法名,从而获取所有候选方法。试着把上例Base
类的test注释掉,这时再编译就无法通过。

2、重载决策:编译器检查方法调用的参数类型,从上述候选方法选出唯一的那一个
(其间会有隐含类型转化)。如果编译器找到多于一个或者没找到,此时编译器就会
报错。试着把上例Base类的test(byte b)注释掉,这时运行结果是1 1。

3、若方法类型为priavte static final ,java采用静态编译,编译器会准确知道该调用哪
个方法。

4、当程序运行并且使用动态绑定来调用一个方法时,那么虚拟机必须调用对象的实
际类型相匹配的方法版本。在例子中,b所指向的实际类型是TestOverriding,所以
b.test(0)调用子类的test。但是,子类并没有重写test(byte b),所以b.test((byte)0)调用
的是父类的test(byte b)。如果把父类的(byte b)注释掉,则通过第二步隐含类型转化为
int,最终调用的是子类的test(int i)。

总结:重载和重写(覆盖)。

方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写
Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性
的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法
被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而
言,父类中的定义如同被“屏蔽”了,而且如果子类的方法名和参数类型和个数都和
父类相同,那么子类的返回值类型必须和父类的相同;如果在一个类中定义了多个同
名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载
(Overloading)。Overloaded的方法是可以改变返回值的类型。也就是说,重载的返回
值类型可以相同也可以不同。

⑹ php 到底可不可以重载

php 作为一种弱类型语言,本身不能像强类型如java ,c++那样,直接的实现重载。不过可以通过一些方法,间接的实现重载。

  1. 使用一个统一的函数来实现重载。该方法要使用func_get_args()和func_num_args()方法。

<?php

functiontest1($name){
echo$name;
}

functiontest2($name,$age){
echo$name.$age;
}

functionload(){
//返回输入的元素数目
$num=func_num_args();
//返回输入元素列表的数组形式
$arr=func_get_args();

if($num==1){
test1($arr[0]);
}else{
test2($arr[0],$arr[1]);
}
}

load("a");
echo"<br/>";
load("a","b");
?>


2.当对象试着调用不存在或者受权限限制的方法时,__call()方法会被自动调用,从而可以实现类型重载的效果。该方法是php5新增的方法。

<?php
classA{
//name:调用的方法名字。args:参数列表
function__call($name,$args){
$num=count($args);
if($num==1){
$this->test1($args[0]);
}
else{
$this->test2($args[0],$args[1]);
}
}

functiontest1($name){
echo$name;
}
functiontest2($name,$age){
echo$name."".$age;
}
}

$a=newA();
$a->a("a");
echo"<br/>";
$a->a("a","b");

?>

⑺ 重载和重写有什么区别

重载和重写的区别有以下几点:

一、定义上的区别:

1、重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据函数的参数来区别不同的函数。

2、覆盖(也叫重写)是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现。即函数名和参数都一样,只是函数的实现体不一样。

二、规则上的不同:

1、重载的规则:

①必须具有不同的参数列表。

②可以有不同的访问修饰符。

③可以抛出不同的异常。

2、重写方法的规则:

①参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。

②返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。

③访问修饰符的限制一定要大于被重写方法的访问修饰符。

④重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。

三、类的关系上的区别:

重写是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系。

⑻ 重载和重写有什么区别

重载: 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。

重写: 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。


阅读全文

与php重载和重写相关的资料

热点内容
爱上北斗星男友在哪个app上看 浏览:413
主力散户派发源码 浏览:663
linux如何修复服务器时间 浏览:55
荣县优途网约车app叫什么 浏览:472
百姓网app截图是什么意思 浏览:222
php如何嵌入html 浏览:809
解压专家怎么传输 浏览:743
如何共享服务器的网络连接 浏览:132
程序员简易表白代码 浏览:166
什么是无线加密狗 浏览:62
国家反诈中心app为什么会弹出 浏览:67
cad压缩图打印 浏览:102
网页打开速度与服务器有什么关系 浏览:863
android开发技术文档 浏览:65
32单片机写程序 浏览:51
三星双清无命令 浏览:839
汉寿小程序源码 浏览:344
易助erp云服务器 浏览:533
修改本地账户管理员文件夹 浏览:420
python爬虫工程师招聘 浏览:287