PHP浅谈__construct()的继承与调用

前几天看到一个面试题:

<?php
class ParentClass {
    function __construct() {
        $this->hello();
    }

    public function hello() {
        echo __CLASS__.‘/‘.__FUNCTION__;
    }
}

class ChildClass extends ParentClass {

    public function hello(){
        echo __CLASS__.‘/‘.__FUNCTION__;
    }

}

new ChildClass();
?>

问最后输出的结果:

1、__construct()作为类的构造函数,在类被实例化时调用

2、若父类有显示调用__construct(),子类中没有调用,则子类使用父类的__construct()初始化,且调用受private等 制约,就是说若父类的__construct()被private修饰,且子类没有显式调用自己的__construct(),那将会报错,子类无权调用 父类的private __construct()

3、若子类有显示调用__construct(),则调用父类的__construct需要显示声明,即parent::__construct()

4、$this代表当前对象,self::代表当前类本身

5、php默认方法为公共,成员变量为private

由此我们可以得出:



new ChildClass();


时ChildClass会调用ParentClass的构造函数,此构造函数为当前对象的hello()方法,输出此对象所属类的类名和此方法名,此对象的所属类自然是ChildClass,所以结果为:



ChildClass/hello

流程:

new ChildClass()时首先检查自己是否有父类,是否有显式调用自己的构造函数,若自身有构造函数,则使用,若无但有父类,则调用父类的构造函数(构造函数也受public private等修饰,注意)。

这里不必理解为去父类中构造自身,可以理解成将父类的构造函数copy到自己的内存单元中,进行使用

自己的构造函数默认继承父类的



$this->hello();


则调用自己的hello();方法,输出即可。

若自身有构造函数,则父类的被重写,调用父类的构造函数需:



<?php
class ParentClass {
    function __construct() {
        $this->hello();
    }

    public function hello() {
        echo __CLASS__.‘/‘.__FUNCTION__;
    }
}

class ChildClass extends ParentClass {
        //若不写则使用父类的
        function __construct() {
                parent::__construct();
    }
    public function hello() {
        echo __CLASS__.‘/‘.__FUNCTION__;
    }

}

new ChildClass();
?>


若希望本类不再被继承,则可用final修饰



final class ClassName {//无法被entends继承}

				
时间: 2024-08-27 11:44:36

PHP浅谈__construct()的继承与调用的相关文章

浅谈Windows平台下C++调用静态链接库的方式

浅谈Windows平台下C++调用静态链接库的方式 1. 什么是静态链接库?为什么要用静态链接库? 维基百科上关于静态库的解释是这样的:在计算机科学里,静态库(英语:Static library, Statically-linked library),或称静态库,是一个外部函数与变量的集合体.静态库的文件内容,通常包含一堆程序员自定的变量与函数,其内容不像动态链接库那么复杂,在编译期间由编译器与连接器将它集成至应用程序内,并制作成目标文件以及可以独立运作的可执行文件. 由上面的解释可以很清楚的看

浅谈JS的继承

JS继承 继承是OO语言中最为人津津乐道的概念,许多OO语言都支持两种方式的继承:接口继承:实现继承. 接口继承:只继承方法签名. 实现继承:继承实际的方法. 由于ES里函数没有签名,所以在ES里面无法实现接口继承,ES只支持实现继承.                                                                                                                                    

浅谈JavaScript中继承的实现

  谈到js中的面向对象编程,都有一个共同点,选择原型属性还是构造函数,两者各有利弊,而就片面的从js的对象创建以及继承的实现两个方面来说,官方所推荐的是两个相结合,各尽其责,各取其长,在前面的例子中,我已就在JavaScript中对象创建的方法做了一些总结,下面就其继承来道说一二:   1:原型链继承: 每一个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象内部的指针(默认的原型,所有默认类型都继承了Object,而这个继承也是用过原型链实现) fu

浅谈js中继承的理解和实现

一.前言 java.C#等正统面向对象语言都会提供类似extend之类的处理类的继承的方法,而javascript并没有提供专门的方法用于继承,在javascript中使用继承需要一点技巧.js中实例的属性和行为是由构造函数和原型两部分组成的,js的继承也分为这两部分.下面给大家分享一下在js中如何实现继承,讲的不对的地方望大家指正! 二.继承构造函数中的属性和行为 我们定义两个类Animal和Bird类,来实现js中类的继承. //定义Animal类 function Animal(name)

浅谈面向对象和继承

1.面向对象和面向过程的区别 面向过程:注重代码的过程 面向对象:注重代码的结果 2.面向对象三大特性 抽象   封装  继承  多态(JS不存在多态) 3.什么是一个构造函数 new 一个关键字函数  创建一个对象,该对象的的属性this指向window 函数里面指向这个对象 构造函数和普通函数的区别 : 1.前者的this的指向是实例化后的对象 后者的指向是指向window 2.普通函数返回值需要加return 构造函数不需要因为返回的是自己本身 为什么构造函数没有return却能够有返回值

浅谈JavaScript的继承

我想我的JavaScript的基本语法基础掌握的差不多了,现在没时间,毕竟那么多考试等着我.等到寒假我就把犀牛书过一遍. 本来就有那么多考试,但是我还是忍不住写点JavaScript的代码.我认为我的基础差不多了,我就把那本<JavaScript设计模式>拿出来看,我之前是看不懂的. 然后我想我现在应该看得懂了吧.就特意找了继承这一章看一看. ——————————————————————我是厉害的分割线———————————————————————————————————————— 只能说勉强

[OpenSource]浅谈.Net和Java互相调用的三种方式

在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份额,不管谁对谁错,Java和.Net是目前应用开发的两个主要阵营,所以Java.和Net之间的整合是大型应用开发过程中经常会面临一个问题. 目前Java和.Net之间的整合主要有三种思路和做法(经过几天的查阅,目前我就看到了这三种方式,可能还有其他的方法): 1)基于通讯协议的整合 基于通讯协议的整合方式,最容易被人首先想到,简单的方式可以通过Web S

浅谈.Net和Java互相调用的三种方式

在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份 额,不管谁对谁错,Java和.Net是目前应用开发的两个主要阵营,所以Java.和Net之间的整合是大型应用开发过程中经常会面临一个问题. 目前Java和.Net之间的整合主要有三种思路和做法(经过几天的查阅,目前我就看到了这三种方式,可能还有其他的方法): 1)基于通讯协议的整合 基于通讯协议的整合方式,最容易被人首先想到,简单的方式可以通过Web

浅谈开放平台API接口调用频率控制系统设计

www.qdmm.com/BookReader/1391649,62631917.aspx www.qdmm.com/BookReader/1391649,62631988.aspx www.qdmm.com/BookReader/1391649,62632029.aspx www.qdmm.com/BookReader/1391649,62632094.aspx www.qdmm.com/BookReader/1391649,62632135.aspx www.qdmm.com/BookRea