PHP中如何获得当前类的名称,而实例化后获取子类的名称
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP中如何获得当前类的名称,而实例化后获取子类的名称相关的知识,希望对你有一定的参考价值。
class all function all() return __CLASS__; class my extends all print my::all(); 这样获得的是父类的名称,我想获得 my ,请问用什么函数啊?
通过 get_declared_classes 获取所有的类,然后循环这个array,再通过 instance_of 检测是否是你指定类的子类,然后push到一个数组中. 参考技术A php 4.3以后新增了一个魔术常量__CLASS__,用来获得当前class名称。但是在下面的代码中,却不work。class A
function showclass()
echo __CLASS__;
class B extends A
A::showclass();
B::showclass(); 这段代码会打出两个A,而不是预想中的AB。下面这段代码,利用debug_backtrace来获得当前class名,可惜只能在php4上面work,到了php5以上,测试结果全部都是AA-___-class A
function showclass()
$backtrace = debug_backtrace();
echo $backtrace[0]['class'];
class B extends A 补充一个可以在php4/php5下work的代码class A
function showclass()
$backtrace = debug_backtrace();
echo ((int)PHP_VERSION> 4) ?
get_class($backtrace[0]['object']) : $backtrace[0]['class'];
class B extends A 参考技术B 这是php静态数据过早绑定的问题(即子类的all方法是从父类中继承过来的,__CLASS__常量过早的绑定成了父类名),解决这个问题:方法一:class all function all() return __CLASS__; class my extends all function all() return __CLASS__; //子类定义同名的方法(这其实就是覆盖了父类的方法,让__CLASS__绑定为自己的类名)echo my::all();
方法二:class all function all() return get_class($this); class my extends all$my = new my();//非静态调用是不存在过早绑定的情况的。echo $my->all();
这个可以看看php5.3.0版本之后的静态迟绑定相关信息(static关键字)
Python_子类调用父类的方法
1.方式一
子类调用父类的方法,包含2中形式的调用。一种形式是在类内部通过继承的方式调用父类的方法,另外一种形式是子类实例化后之后通过继承的方式来调用父类的方法。如下图所示:
注意一点,在子类内部通过继承的方式调用父类的属性时,必须要带上self位置参数(self只在实例化过程中和在实例调用属性时才能省略(self本来的含义就是指向实例自己));而实例在通过继承调用父类的属性或方法时,则不用传self参数,因为实例已经实例化了呀!!!
该部分的代码块如下:注意一点,在子类内部通过继承的方式调用父类的属性时,必须要带上self位置参数(self只在实例化过程中和在实例调用属性时才能省略(self本来的含义就是指向实例自己));而实例在通过继承调用父类的属性或方法时,则不用传self参数,因为实例已经实例化了呀!!!
该部分的代码块如下:
class Person():
"人的类"
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def eat(self):
print("%s开始吃饭了"%self.name)
class Student(Person):
"学生类"
def __init__(self,name,age,sex,classnaem):
#子类调用父类的构造函数进行初始化
Person.__init__(self,name,age,sex) #通过子类把参数传给父类(self不能少,self只有在实例化和实例调用类时才能省略,此处不是)
self.classnaem = classnaem
def course(self):
print("%s在%s上课"%(self.name,self.classnaem))
def done(self):
print("这个学生在干嘛?")
#子类调用父类方法
Person.eat(self) #子类在调用父类方法必须要传self
#实例化一个子类
student = Student("周明",23,‘男‘,"11届土木3班")
#调用子类本身的方法
student.course()
#通过子类调用父类的方法--->实例化之后来调用父类的方法
student.eat()
#调用子类的方法,在子类方法中调用了子类的方法,与student.eat有区别
student.done()
此时如果父类的名称更改了,那么在子类中所有用到父类名的地方均要进行修改了。所有此种方法不便于后期维护,为此我们选择方式二。
2.方式二
使用super来代替父类名,以方便代码的后期维护,见下图:
使用super的好处,一是可以代替父类名,这样后期父类名更改了,我们只需要更改子类名称后面的父类名即可,子类中其他的父类名可以不用更改;二是使用了super后,调用父类方法时可以不传参数self。
该部分的代码块为:
class Person():
"人的类"
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def eat(self):
print("%s开始吃饭了"%self.name)
class Student(Person):
"学生类"
def __init__(self,name,age,sex,classnaem):
#子类调用父类的构造函数进行初始化
# Person.__init__(self,name,age,sex) #通过子类把参数传给父类(self不能少,self只有在实例化和实例调用类时才能省略,此处不是)
#使用super来替换父类名
super().__init__(name,age,sex) #通过子类把参数传给父类,用super可以省略self
self.classnaem = classnaem
def course(self):
print("%s在%s上课"%(self.name,self.classnaem))
def done(self):
print("这个学生在干嘛?")
#子类调用父类方法
super().eat() #子类在调用父类方法,使用super可以省略self
#实例化一个子类
student = Student("周明",23,‘男‘,"11届土木3班")
#调用子类本身的方法
student.course()
#通过子类调用父类的方法--->实例化之后来调用父类的方法
student.eat()
#调用子类的方法,在子类方法中调用了子类的方法,与student.eat有区别
student.done()
以上是关于PHP中如何获得当前类的名称,而实例化后获取子类的名称的主要内容,如果未能解决你的问题,请参考以下文章
在 Freemarker 模板中,如何获取数据模型类的名称?