php重写父类方法,php调用父类的方法

本文目录一览:

php子类能不能重写父类的private方法?

不能 就算你重写了同名方法 这个方法和父类的同名方法完全没有任何关系

PHP真的能算是面向对象的语言吗?

面向对象三大特性:封装,继承,多态

php可以封装对象,也可以继承,同样可以实现多态

多态是指指出重写和重载,php子类可以重写父类的方法,也可以通过方法的参数数量不同来重载方法,我觉得是面向对象语言

php怎么方法重载

php面向对象(OOP)编程完全教程:12.重载新的方法

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

我们这里所指的重载新的方法所指的是什么呢?其实我们所说的重载新的方法就是子类覆盖父类的已有的方法,那为什么要这么做呢?父类的方法不是可以继承过来直接用吗?但有一些情况是我们必须要覆盖的,比如说我们前面提到过的例子里面, “Person”这个人类里面有一个“说话”的方法,所有继承“Person”类的子类都是可以“说话”的, 我们“Student”类就是“Person”类的子类,所以“Student”的实例就可以“说话“了, 但是人类里面“说话”的方法里面说出的是“Person”类里面的属性, 而“Student”类对“Person”类进行了扩展,又扩展出了几个新的属性,如果使用继承过来的“say()”说话方法的话,只能说出从“Person”类继承过来的那些属性,那么新扩展的那些属性使用这个继承过来的“say()”的方法就说不出来了,那有的人就问了,我在“Student”这个子类中再定义一个新的方法用于说话,说出子类里面所有的属性不就行了吗?一定不要这么做, 从抽象的角度来讲, 一个“学生”不能有两种“说话”的方法,就算你定义了两个不同的说话的方法,可以实现你想要的功能,被继承过来的那个“说话“方法可能没有机会用到了,而且是继承过来的你也删不掉。这个时候我们就要用到覆盖了。

虽然说在PHP里面不能定义同名的方法, 但是在父子关系的两个类中,我们可以在子类中定义和父类同名的方法,这样就把父类中继承过来的方法覆盖掉了。

代码

?

//定义一个”人”类做为父类

class Person

{

//下面是人的成员属性

var $name; //人的名子

var $sex; //人的性别

var $age; //人的年龄

//定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值

function __construct($name, $sex, $age)

{

$this-name=$name;

$this-sex=$sex;

$this-age=$age;

}

//这个人可以说话的方法, 说出自己的属性

function say()

{

echo “我的名子叫:”.$this-name.” 性别:”.$this-sex.” 我的年龄是:”.$this-age;

}

}

class Student extends Person

{

var $school; //学生所在学校的属性

//这个学生学习的方法

function study()

{

echo “我的名子叫:”.$this-name.” 我正在”.$this-school.” 学习”;

}

//这个学性可以说话的方法, 说出自己所有的属性,覆盖了父类的同名方法

function say()

{

echo “我的名子叫:”.$this-name.” 性别:”.$this-sex.” 我的年龄是:”.$this-age.”我在”.$this-school.”上学;

}

}

?

上面的例子, 我们就在“Student”子类里覆盖了继承父类里面的”say()”的方法,通过覆盖我们就实现了对“方法”扩展。

但是,像这样做虽然解决了我们上面说的问题,但是在实际开发中,一个方法不可能就一条代码或是几条代码,比如说“Person”类里面的“say()”方法有里面有100条代码,如果我们想对这个方法覆盖保留原有的功能外加上一点点功能,就要把原有的100条代码重写一次, 再加上扩展的几条代码,这还算是好的,而有的情况,父类中的方法是看不见原代码的,这个时候你怎么去重写原有的代码呢?我们也有解决的办法,就是在子类这个方法中可以调用到父类中被覆盖的方法, 也就是把被覆盖的方法原有的功能拿过来再加上自己的一点功能,可以通过两种方法实现在子类的方法中调用父类被覆盖的方法:

一种是使用父类的“类名::“来调用父类中被覆盖的方法;

一种是使用“parent::”的方试来调用父类中被覆盖的方法;

代码

class Student extends Person

{

var $school; //学生所在学校的属性

//这个学生学习的方法

function study()

{

echo “我的名子叫:”.$this-name.” 我正在”.$this-school.” 学习”;

}

//这个学性可以说话的方法, 说出自己所有的属性,覆盖了父类的同名方法

function say()

{

//使用父类的”类名::”来调用父类中被覆盖的方法;

// Person::say();

//或者使用”parent::”的方试来调用父类中被覆盖的方法;

parent::say();

//加上一点自己的功能

echo “我的年龄是:”.$this-age.”我在”.$this-school.”上学.”;

}

}

现在用两种方式都可以访问到父类中被覆盖的方法,我们选那种方式最好呢?用户可能会发现自己写的代码访问了父类的变量和函数。如果子类非常精炼或者父类非常专业化的时候尤其是这样。 不要用代码中父类文字上的名字,应该用特殊的名字 parent,它指的就是子类在 extends 声明中所指的父类的名字。这样做可以避免在多个地方使用父类的名字。如果继承树在实现的过程中要修改,只要简单地修改类中 extends 声明的部分。

同样,构造方法在子类中如果没有声明的话,也可以使用父类中的构造方法,如果子类中重新定义了一个构造方法也会覆盖掉父类中的构造方法,如果想使用新的构造方法为所有属性赋值也可以用同样的方式。

代码

class Student extends Person

{

var $school; //学生所在学校的属性

function __construct($name, $sex, $age, $school)

{

//使用父类中的方法为原有的属性赋值

parent::__construct($name, $sex, $age);

$this-school=$school;

}

//这个学生学习的方法

function study()

{

echo “我的名子叫:”.$this-name.” 我正在”.$this-school.” 学习”;

}

//这个人可以说话的方法, 说出自己的属性

function say()

{

parent::say();

//加上一点自己的功能

echo “我的年龄是:”.$this-age.”我在”.$this-school.”上学.”;

}

}

php tp5中父类已经引入系统类,子类还需要引入吗

1.继承:C++支持多继承,C#类只能继承一个基类中的实现但可以实现多个接口。 2.数组:声明 C# 数组和声明 C++ 数组的语法不同。在 C# 中,“[]”标记出现在数组类型的后面。 3.数据类型:在C++中bool类可以与整型转换,但C#中bool 类型和其他类型(特别是 int)之间没有转换。long 类型:在 C# 中,long 数据类型为 64 位,而在 C++ 中为 32 位。 4.struct 类型:在 C# 中,类和结构在语义上不同。struct 是值类型,而 class 是引用类型。 5.switch 语句:与 C++ 中的 switch 语句不同,C# 不支持从一个 case 标签贯穿到另一个 case 标签。 6.delegate 类型:委托与 C++ 中的函数指针基本相似,但前者具有类型安全,是安全的。 7.从派生类调用重写基类成员。 base 8.使用 new 修饰符显式隐藏继承成员。 9.重写方法需要父类方法中用virtual声名,子类方法用override 关键字。 10.预处理器指令用于条件编译。C# 中不使用头文件。 C# 预处理器指令 11.异常处理:C#中引入了 finally 语句,这是C++没有的。 12.C# 运算符:C# 支持其他运算符,如 is 和 typeof。它还引入了某些逻辑运算符的不同功能。 13. static 的使用,static方法只能由类名调用,改变static变量。 14.在构造基类上替代 C++ 初始化列表的方法。 15.Main 方法和 C++ 及Java中的 main 函数的声明方式不同,Main而不能用main 16.方法参数:C# 支持 ref 和 out 参数,这两个参数取代指针通过引用传递参数。 17.在 C# 中只能在unsafe不安全模式下才使用指针。 18.在 C# 中以不同的方式执行重载运算符。 19.字符串:C# 字符串不同于 C++ 字符串。 20.foreach:C#从VB中引入了foreach关键字使得以循环访问数组和集合。 21.C# 中没有全局方法和全局变量:方法和变量必须包含在类型声明(如 class 或 struct)中。

php子类能不能重写父类的private属性?

在父类中加个public方法,如private$aaa=’test’;publicfunctiongetAAA(){return$this-aaa;}在子类中调用parent::getAAA();就可以获得父类私有属性当然如果你想获取多个,可以改成动态变量名,getAAA($v){return$this-{$v};}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/192840.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-01 10:30
下一篇 2024-12-01 10:30

相关推荐

  • PHP和Python哪个好找工作?

    PHP和Python都是非常流行的编程语言,它们被广泛应用于不同领域的开发中。但是,在考虑择业方向的时候,很多人都会有一个问题:PHP和Python哪个好找工作?这篇文章将从多个方…

    编程 2025-04-29
  • 解决.net 6.0运行闪退的方法

    如果你正在使用.net 6.0开发应用程序,可能会遇到程序闪退的情况。这篇文章将从多个方面为你解决这个问题。 一、代码问题 代码问题是导致.net 6.0程序闪退的主要原因之一。首…

    编程 2025-04-29
  • ArcGIS更改标注位置为中心的方法

    本篇文章将从多个方面详细阐述如何在ArcGIS中更改标注位置为中心。让我们一步步来看。 一、禁止标注智能调整 在ArcMap中设置标注智能调整可以自动将标注位置调整到最佳显示位置。…

    编程 2025-04-29
  • Python创建分配内存的方法

    在python中,我们常常需要创建并分配内存来存储数据。不同的类型和数据结构可能需要不同的方法来分配内存。本文将从多个方面介绍Python创建分配内存的方法,包括列表、元组、字典、…

    编程 2025-04-29
  • Python中init方法的作用及使用方法

    Python中的init方法是一个类的构造函数,在创建对象时被调用。在本篇文章中,我们将从多个方面详细讨论init方法的作用,使用方法以及注意点。 一、定义init方法 在Pyth…

    编程 2025-04-29
  • 使用Vue实现前端AES加密并输出为十六进制的方法

    在前端开发中,数据传输的安全性问题十分重要,其中一种保护数据安全的方式是加密。本文将会介绍如何使用Vue框架实现前端AES加密并将加密结果输出为十六进制。 一、AES加密介绍 AE…

    编程 2025-04-29
  • Python中读入csv文件数据的方法用法介绍

    csv是一种常见的数据格式,通常用于存储小型数据集。Python作为一种广泛流行的编程语言,内置了许多操作csv文件的库。本文将从多个方面详细介绍Python读入csv文件的方法。…

    编程 2025-04-29
  • 用不同的方法求素数

    素数是指只能被1和自身整除的正整数,如2、3、5、7、11、13等。素数在密码学、计算机科学、数学、物理等领域都有着广泛的应用。本文将介绍几种常见的求素数的方法,包括暴力枚举法、埃…

    编程 2025-04-29
  • Python学习笔记:去除字符串最后一个字符的方法

    本文将从多个方面详细阐述如何通过Python去除字符串最后一个字符,包括使用切片、pop()、删除、替换等方法来实现。 一、字符串切片 在Python中,可以通过字符串切片的方式来…

    编程 2025-04-29
  • 用法介绍Python集合update方法

    Python集合(set)update()方法是Python的一种集合操作方法,用于将多个集合合并为一个集合。本篇文章将从以下几个方面进行详细阐述: 一、参数的含义和用法 Pyth…

    编程 2025-04-29

发表回复

登录后才能评论