我有以下两个班级. BMW级延伸级轿车.

class Car{

public $doors;

public $wheels;

public $color;

public $size;

public function print_this(){

print_r($this);

}

}

class BMW extends Car{

public $company;

public $modal;

public function __construct(){

print_r(parent::print_this());

}

}

$bmw = new BMW();

$bmw->print_this();

在上面的代码中,当我使用parent :: print_this()和内部print_this()方法从构造函数访问父类方法时,我有print_r($this),它打印所有属性(父类和子类属性)

现在我想要print_r(parent :: print_this());应该只输出子类中的父类属性?谁可以帮我这个事?

最佳答案 您可以使用

reflection实现此目的:

class Car{

public $doors;

public $wheels;

public $color;

public $size;

public function print_this(){

$class = new ReflectionClass(self::class); //::class works since PHP 5.5+

// gives only this classe's properties, even when called from a child:

print_r($class->getProperties());

}

}

您甚至可以从子类反映到父类:

class BMW extends Car{

public $company;

public $modal;

public function __construct(){

$class = new ReflectionClass(self::class);

$parent = $class->getParentClass();

print_r($parent->getProperties());

}

}

编辑:

what actually I want that whenever I access print_this() method using object of class BMW it should print BMW class properties only and when I access print_this() from BMW class using parent it should print only parent class properties.

有两种方法可以使相同的方法表现不同:在子类中重写它或者将其重载/传递给它.因为重写它会意味着很多代码重复(你必须在每个子类中基本相同)我建议你在父Car类上构建print_this()方法,如下所示:

public function print_this($reflectSelf = false) {

// make use of the late static binding goodness

$reflectionClass = $reflectSelf ? self::class : get_called_class();

$class = new ReflectionClass($reflectionClass);

// filter only the calling class properties

$properties = array_filter(

$class->getProperties(),

function($property) use($class) {

return $property->getDeclaringClass()->getName() == $class->getName();

});

print_r($properties);

}

现在,如果您明确要从子类打印父类属性,只需将标志传递给print_this()函数:

class BMW extends Car{

public $company;

public $modal;

public function __construct(){

parent::print_this(); // get only this classe's properties

parent::print_this(true); // get only the parent classe's properties

}

}

php访问父类的所有属性,php – 在父类中使用$this仅在子类中显示父类属性相关推荐

  1. java子类访问父类私有成员_Java中子类可以继承父类的私有成员,但是不能(直接)访问!!!...

    今天学习Java三大特征之一:继承的时候,产生了一些疑问,最后通过网上查找和各位网友的帮助,终于拔开云雾见日出.下面进入正题: 首先:子类对象拥有父类中的所有属性和方法:在这里,很多人会问构造器可以继 ...

  2. 子类super调用父类函数,该函数中调用的函数是父类还子类呢

    如图所示: 子类对象通过super()函数调用父类的run函数,然后直接调用了子类的demo函数,而没有调用父类的函数:猜想通过super调用父类,但self仍然代表是子类本身: 再看一例: 从这里说 ...

  3. 在子类中调用父类的方法super

    1.没有super之前,在子类里面需要父类里面的逻辑,但是我们是通过派生(自己定义了一个init,增加了一条line) class vehichle:#定义一个交通工具的类Country=" ...

  4. 继承实现的原理、子类中调用父类的方法、封装

    一.继承实现的原来 1.继承顺序 Python的类可以继承多个类.继承多个类的时候,其属性的寻找的方法有两种,分别是深度优先和广度优先. 如下的结构,新式类和经典类的属性查找顺序都一致.顺序为D--- ...

  5. 在java继承机制中 父类中的私有_Java中子类能继承父类的私有属性吗?

    前段时间去听老师讲课的时候,老师告诉我子类是可以继承父类所有的属性和方法的.当时我是极其疑惑的,因为之前学校考试时这个考点我记得很清楚:子类只能继承父类的非私有属性和方法.老师给我的解释是这样的--先 ...

  6. Day19:继承实现的原理、子类中调用父类的方法、封装

    一.继承实现的原来 1.继承顺序 Python的类可以继承多个类.继承多个类的时候,其属性的寻找的方法有两种,分别是深度优先和广度优先. 如下的结构,新式类和经典类的属性查找顺序都一致.顺序为D--- ...

  7. 多态---父指针指向子类对象(父类引用指向子类对象)

    我们都知道,面向对象程序设计中的类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今天就来看一下OC中类的三大特性: 一.封装 封装就是对类中的一些字段,方法进行保护,不被外界 ...

  8. 【Kotlin】Kotlin 类的继承 三 ( super 关键字使用 | super@ 外部调用父类方法 | 子类选择性调用 父类 / 接口 方法 super )

    文章目录 I . 子类调用父类总结 II . 子类调用父类方法 ( super ) III . 子类内部类调用父类方法 ( super@ ) IV . 子类选择调用不同的 父类 / 接口方法 ( su ...

  9. 子类重写父类变量_为什么在子类中不重写超类的实例变量

    子类重写父类变量 当我们在父类和子类中创建一个具有相同名称的变量,并尝试使用持有子类对象的父类引用访问它时,我们会得到什么? 为了理解这一点,让我们考虑下面的示例,在该示例中,我们在Parent和Ch ...

最新文章

  1. 一个基于特征向量的近似网页去重算法——term用SVM人工提取训练,基于term的特征向量,倒排索引查询相似文档,同时利用cos计算相似度...
  2. IDEA 上位?不!Eclipse Theia 1.0 发布!
  3. python爬虫基础知识点_入门Python爬虫知识点梳理
  4. mysql全量备份、增量备份实现方法
  5. web系统软件测试功能点,小程序、app、web测试的区别
  6. 以行为单位对字符串变量下标为奇数位置上的字符按其ASCii值从小到大的顺序进行排序,排序后的结果仍按行重新存入字符串数组xx中
  7. imagestring不支持中文,改用imagettftext
  8. 在DataWorks中实现指定UDF只能被指定账户访问
  9. 税友软件公司java面试_税友集团java面试题
  10. java同步调用rabbitmq,使用RabbitMQ可以放慢同步发布/消耗速度
  11. Senparc.Weixin.MP SDK 微信公众平台开发教程(十):多客服接口说明
  12. 免疫算法(Immune Algorithm,IA)实例详解
  13. 人体姿态识别方案详解
  14. java定时每小时_java 定时任务,每日运行和每小时运行。
  15. redis—redis概述
  16. Linux通过系统函数设置系统时间
  17. 没有sln文件怎么打开
  18. CSS Tailwind
  19. windows编程之计时器
  20. Solidworks 无法显示略缩图解决办法

热门文章

  1. 【报告分享】2020产业互联网发展报告:新范式.pdf(附下载链接)
  2. 【白皮书分享】工业互联网平台新模式新业态白皮书.pdf
  3. 【白皮书分享】5G智慧城市安全需求与架构白皮书.pdf(附下载链接)
  4. 【推荐实践】推荐系统中模型训练及使用流程的标准化
  5. 【报告分享】2019年用户生命周期运营白皮书(京东尼尔森出品).pdf(附下载链接)
  6. boost/container/small_vector.hpp: No such file or directory on Ubuntu 14.04
  7. 万物皆可Graph | 当信息检索遇上图神经网络
  8. TensorFlow图像数据预处理
  9. java栈和队列_栈和队列的面试题Java
  10. python实现屏幕录制_GitHub - Sijiu/record-camera-and-screen: 录制摄像头和录制屏幕,两者之间可以轻易切换...