<?php
class A {
const CONST_NAME = 'A';
public static $static_name = 'A';
public static $static_name_no_rewrite = 'A'; private static $_instance; public static function static_func() {
echo 'A';
} public static function static_func_no_rewrite() {
echo 'A';
} public static function static_extends_self() {
echo self::$static_name;
} public static function static_extends_no_rewrite_self() {
echo self::$static_name;
} public static function static_extends_no_vars() {
return self::$static_no_vars;
} public static function get_instance() {
if (empty(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
} class B extends A {
const CONST_NAME = 'B';
public static $static_name = 'B';
public static $static_no_vars = 'B'; //重写
public static function static_func() {
echo 'B';
} public static function static_extends_self() {
echo self::$static_name;
}
}
//是否继承后是有了一个父类的引用 //1.查看父类和子类的初始情况
$str = '1.查看父类和子类的初始情况';
echo '<hr />';
echo $str, '<br />';
echo 'A::CONST_NAME->', A::CONST_NAME, '<br />';
echo 'B::CONST_NAME->', B::CONST_NAME, '<br />';
echo 'A::$static_name->', A::$static_name, '<br />';
echo 'B::$static_name->', B::$static_name, '<br />';
echo 'B::$static_name_no_rewrite->', B::$static_name_no_rewrite, '<br />';
echo 'B::$static_name_no_rewrite->', B::$static_name_no_rewrite, '<br />';
echo '结论:静态属性或类常量可以被继承<br />';
echo '<hr />'; //2.测试重定义的类属性 修改子类(父类)的值父类(子类)的值是否会改变
$str = '2.测试重定义的类属性 修改子类(父类)的值父类(子类)的值是否会改变';
echo $str, '<br />';
A::$static_name = 'M_A';
echo "修改->A::\$static_name = 'M_A'<br />";
echo 'A::$static_name->', A::$static_name, '<br />';
echo 'B::$static_name->', B::$static_name, '<br />';
B::$static_name = 'M_B';
echo "修改->B::\$static_name = 'M_B'<br />";
echo 'A::$static_name->', A::$static_name, '<br />';
echo 'B::$static_name->', B::$static_name, '<br />';
echo '结论:继承关系的两个类,如果子类重定义了父类的静态属性,则修改父类(子类)的静态属性或常量不会影响到子类(父类)的对应静态属性<br />';
echo '<hr />'; //3.测试没有重定义的类属性 修改子类(父类)的值父类(子类)的值是否会改变
$str = '3.测试没有重定义的类属性 修改子类(父类)的值父类(子类)的值是否会改变';
echo $str, '<br />';
echo 'A::$static_name_no_rewrite->', A::$static_name_no_rewrite, '<br />';
echo 'B::$static_name_no_rewrite->', B::$static_name_no_rewrite, '<br />';
A::$static_name_no_rewrite = 'M_A';
echo "修改->A::\$static_name_no_rewrite = 'M_A'<br />";
echo 'A::$static_name_no_rewrite->', A::$static_name_no_rewrite, '<br />';
echo 'B::$static_name_no_rewrite->', B::$static_name_no_rewrite, '<br />';
B::$static_name_no_rewrite = 'M_B';
echo "修改->B::\$static_name_no_rewrite = 'M_B'<br />";
echo 'A::$static_name_no_rewrite->', A::$static_name_no_rewrite, '<br />';
echo 'B::$static_name_no_rewrite->', B::$static_name_no_rewrite, '<br />';
echo '结论:如果子类没有重定义父类的某个静态属性,则修改父类(子类)则子类(父类)的对应静态属性也随之改变<br />';
echo '更深结论:子类继承父类会有一个父类的引用指向父类那块内存,如果子类没有重定义一个属性(放到本类内存下)就会调用父类的属性<br />';
echo '<hr />'; //4.静态方法是否能继承
$str = '4.静态方法是否能继承';
echo $str, '<br />';
echo 'A::static_func_no_rewrite()->', A::static_func_no_rewrite(), '<br />';
echo 'B::static_func_no_rewrite()->', B::static_func_no_rewrite(), '<br />';
echo '结论:静态方法可以继承!';
echo '<hr />'; //5.静态方法是否能被重写
$str = '5.静态方法是否能被重写';
echo $str, '<br />';
echo 'A::static_func()->', A::static_func(), '<br />';
echo 'B::static_func()->', B::static_func(), '<br />';
echo '结论:静态方法可以被重写!';
echo '<hr />'; //6.父类静态方法中有self, 子类继承此方法没有重写后调用的self是谁?
$str = '6.父类静态方法中有self, 子类继承此方法没有重写后调用的self是谁?';
echo $str, '<br />';
echo 'A::static_extends_no_rewrite_self()->', A::static_extends_no_rewrite_self(), '<br />';
echo 'B::static_extends_no_rewrite_self()->', B::static_extends_no_rewrite_self(), '<br />';
echo '结论:与3相同, 如若没有重写, 则只是子类对父类的一个引用, 如果子类中没有, 就去父类中寻找, 而且找到的也是依赖于父类!';
echo '更深结论:在PHP单例的继承中, 父类::get_instance()方法中返回new self(), 如果子类没有重写, 则返回父类的实例!';
echo '<hr />'; //7.父类静态方法中有self, 子类继承此方法重写后调用的self是谁?
$str = '7.父类静态方法中有self, 子类继承此方法重写后调用的self是谁?';
echo $str, '<br />';
echo 'A::static_extends_self()->', A::static_extends_self(), '<br />';
echo 'B::static_extends_self()->', B::static_extends_self(), '<br />';
echo '结论:子类覆盖父类的方法后, 如果其中有self属性, 则此时会覆盖父类的self, 即此时的self为对象本身';
echo '<hr />'; //8.父类静态方法调用本身没有子类却有的静态属性(来验证上述6推测, 如果是引用, 则会为空)
$str = '8.子类调用父类静态方法调用父类没有子类却有的self的静态属性(来验证上述6推测, 如果是引用, 则会为空)';
echo $str, '<br />';
//echo 'B::static_extends_no_vars()->', B::static_extends_no_vars(), '<br />';
echo 'B::static_extends_no_vars()->报错<br />';
echo '结论:程序报错, 显示A没有此属性, 说明是子类对父类的一个引用!子类如果没有重写父类的属性或静态方法, 则调用父类的!包括self!';
echo '<hr />'; //9.测试下6中的推断, 即单例模式中self
$str = '9.测试下6中的推断, 即单例模式中self';
echo $str, '<br />';
echo 'get_class(B::get_instance())->', get_class(B::get_instance()), '<br />';
echo '结论:说明6中的更深推断是正确的!';
echo '<hr />'; //10.测试实例调用静态属性或常量
$str = '测试实例调用静态属性或常量';
echo $str, '<br />';
$a = new A();
//echo '$a = new A();echo $a->CONST_NAME->', $a->CONST_NAME, '<br />';
echo '$a = new A();echo $a->CONST_NAME->报错<br />';
//echo 'echo $a->$static_name->', $a->$static_name, '<br />';
echo 'echo $a->$static_name->报错<br />';
echo '结论:实例不能调用类的静态属性或常量!调用静态属性会转变为变量的变量, 调用常量会调用实例的对应属性!';
echo '<hr />'; //11.测试实例调用静态方法
$str = '测试实例调用静态属性或常量';
echo $str, '<br />';
echo '$a->static_func()->', $a->static_func(), '<br />';
echo '$a->static_extends_self()->', $a->static_extends_self(), '<br />';
echo '结论:实例可以调用静态方法, 甚至静态方法中包含self!';
echo '<hr />';

PHP-静态方法(static)继承等分析的更多相关文章

  1. 第32节:Java中-构造函数,静态方法,继承,封装,多态,包

    构造函数实例 class Cat{ // 设置私有的属性 name private String name; // 设置name的方法 public void setName(String Name) ...

  2. .net类中静态方法的继承

    父类中的静态方法,继承的子类能不能调用?一直在这里有疑惑,即使在下面的测试之后,也只是得到了结论,不明原理. class ClsParent { public static void ShowSth( ...

  3. static 继承

    静态方法大家应该都比较熟悉,在这里主要谈一下静态方法在继承时的一些注意事项. 1.父类方法如果是静态方法,子类不能覆盖为非静态方法: 2.父类方法如果是非静态方法,子类不能覆盖为静态方法: 3.父类静 ...

  4. koa 基础(十八)es6中的类、静态方法、继承

    1.app.js /** * es6中的类.静态方法.继承 */ // 定义Person类 class Person { constructor(name, age) { /*类的构造函数,实例化的时 ...

  5. 关于static继承的问题

    c++primer 15.2.7节关于static继承的意思是,父类和子类共享static函数或者static成员变量,并且子类要访问还要受它们的权限限制,下面是看到的另一个例子 class Base ...

  6. java中静态变量与静态方法的继承(转)

    总结: 1.静态变量与静态方法说继承并不确切,静态方法与变量是属于类的方法与变量.而子类也属于超类,比如说Manage extends Employee,则Manage也是一个Employee,所以子 ...

  7. Python中的单继承与多继承实例分析

    Python中的单继承与多继承实例分析 本文实例讲述了Python中的单继承与多继承.分享给大家供大家参考,具体如下: 单继承 一.介绍 Python 同样支持类的继承,如果一种语言不支持继承,类就没 ...

  8. koa 基础(十七)原生 JS 中的类、静态方法、继承

    1.app.js /** * 原生 JS 中的类.静态方法.继承 * es5中的类和静态方法 */ function Person(name, age) { // 构造函数里面的方法和属性 this. ...

  9. java中静态属性和和静态方法的继承问题 以及多态的实质

    首先结论是:java中静态属性和和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏. 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成的,不需继承机制就可以调用如果子类里 ...

随机推荐

  1. CentOS 6.9/7通过yum安装指定版本的Nginx

    说明:通过yum好处其实很多,环境变量不用配置,配置文件放在大家都熟悉的地方,通过rpm -ql nginx可以知道全部文件的地方等等. Nginx(1.12.2) 一.安装和配置 1.安装 # rp ...

  2. uboot启动内核的实现

    前面我们分析了uboot 的整个流程,我们知道uboot启动以后所有功能都是通过命令来实现的,启动kernel就是执行了bootcmd里面的命令.命令执行过程在uboot中是非常重要的现在我们就来看u ...

  3. 升/降压转换器 (Buck-boost)

    升/降压转换器 (Buck-boost) 当输入电压是变动的,有时比输出电压高.有时却比较低时(例如放电中的电池),升/降压转换器 (Buck-boost) 是最佳的电源解决方案. 升/降压转换器 ( ...

  4. ARM 调用约定 calling convention

    int bar( int a, int b, int c, int d, int e, int f, int g ) { ]; array2[ ] = a + b; array2[ ] = b + c ...

  5. SQL SERVER 锁2

    http://blog.csdn.net/huwei2003/article/details/4047191 http://www.cnblogs.com/huangxincheng/category ...

  6. 小道消息:CSDN社区产品重大更新

    Hi,小伙伴们: 悄悄给大家透露个消息:CSDN社区将要有重大更新. 都有哪些呢?各自是:新极客头条.Ink.博乐 是不是后面两个比較眼生?不要着急,那但是我们的重中之重.我来给大家一一道来-- 先来 ...

  7. Android调用系统相机、自定义相机、处理大图片

    Android调用系统相机和自定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理 ...

  8. 【spring boot】spring boot中使用@RestController不起作用,不返回json,依旧去找访问接口的请求地址对应的页面

    问题描述: spring boot中使用@RestController不起作用,不返回json,依旧去找访问接口的请求地址对应的页面 表现结果: 1>使用postman测试接口,表现为返回是40 ...

  9. U3D内存优化

    原创文章如需转载请注明:转载自风宇冲Unity3D教程学院                                                U3D内存优化   读了Hog关于内存管理文章 ...

  10. 第十二章 Openwrt无法识别2.0 USB 盘

    今天新的U盘不能识别,还以为是U盘本身的问题,原来是缺少 kmod-usb-storage kmod-usb-storage-extras 这两个软件包. 软件包安装后重启便可识别.