本文目录一览:
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父类如何调用子类的静态方法或变量?
php父类中怎么调用子类的的静态属性了,Oh,my god,如果被面试官问道这种问题,你一定会说shit,fucky question。你会说我很少这么做,况且php对于静态的操作太随意了,php在父类调用子类的静态属性是一件麻烦的事情。我们知道子类中调用父类的静态属性,可以用self::的形式。但是父类调用子类如果用self::就只能调用到父类的静态属性。那么,怎么办了?php是不是无法做到了?答案当然是否定的,php中还可以使用在父类中用子类的类名来调用的方法。
不过,这当中仍然存在一个问题,就是如果我有多个类继承了同一个父类,而且父类的某个函数要用到各个子类的静态属性的话,就想当trouble了。这里有个php的朋友提供了一种思路,采用在子类中重载父类的方法使父类得到静态属性。父类中使用了get_class函数得到类名,get_class()是父类名,get_class($this)是子类名。好了得到这个再用eval函数做下执行语句就OK啦。例子:
//父类class A {
public function __con(){
//这里主要为让大家看清楚,所以打印出来类名,供大家学习
echo(get_class($this)).'/';
echo(get_class()).'/';
eval(\$ab = . get_class($this) . ::\$table;);echo $ab;}}//子类Bclass B extends A {
static $table = 'b table';
function __construct(){
$this-__con();}}//子类Cclass C extends A{
static $table = 'c table';
function cc(){
$this-__con();}}//调用
new B; //输出结果 B A b table
$c = new C;
上面就是php父类调用子类静态成员的方法,在子类重载父类的方法还是相当不错的 ,当时听朋友提起这个时,就异常激动。父类我们也叫做基类,或者底层类。一般都是最先设计,子类就是根据各个需要来设计,所以我们子类修改的可能性比较大,操作灵活性也比较大。
php继承一个父类,如何自动执行父类方法
你在父类写一个成员函数 然后子类继承 创建子类对象的时候 可以点出来父类的成员函数
比如
Student zs = new Student();
zs.SayHello() //点出来的是从父类的继承来的成员函数
输出结果为父类的-我是人类
public class Person
{
public void SayHello() //这只是父类的SayHello
{
echo"我是人类";
}
}
public class Student:Person //已经继承了Person父类
{
//我什么都没写
}
php子类怎么调用父类方法
?php
class A{
static public $m=1;
static public function m(){
echo static::$m,'';
}
static public function n(){
static::n();
}
public function l() {
echo '父类方法';
}
}
class B extends A{
static public $m=111;
static public function m(){
parent::m();
}
static public function n(){
echo parent::$m,'';
}
}
B::m();
B::n();
$b = new B();
$b-l();
PHP真的能算是面向对象的语言吗?
面向对象三大特性:封装,继承,多态
php可以封装对象,也可以继承,同样可以实现多态
多态是指指出重写和重载,php子类可以重写父类的方法,也可以通过方法的参数数量不同来重载方法,我觉得是面向对象语言