继承? class T { static function f() { echo __CLASS__; } }class T1 extends T { }T1::f();
对于这个问题,即使方法不是静态的,结果也是一样。class a { public function print_class_name() { echo __CLASS__; } }class b extends a {}$b = new b(); $b->print_class_name();输出还是a所以应该和是否静态无关,不过我之前确实不知道,继承下来的方法并不能改变当初的环境。查了一下,这个并非是因为T1没有继承T的方法,而是__CLASS__取值的早绑定和晚绑定造成的。从表面上来看,它也确实是"继承"下来了这个方法,只不过对于当前环境不是像我想的那样。php手册中有指出在5.3之后,加入了一个关键字来解决这个问题。 http://php.net/manual/zh/language.oop5.late-static-bindings.php class a { public static function print_class_name() { echo __CLASS__; } public static function call_foo(){ static::print_class_name(); } }class b extends a {}b::call_foo(); 但我按照里面的代码试验,还是只能输出父类名称。不知是否与我的php版本有关,我是php5.4.10。 除非在子类中覆写父类的那个方法,才能调用到子类的方法。class a { public static function print_class_name() { echo __CLASS__; } }class b extends a { public static function print_class_name() { echo __CLASS__; } }b::print_class_name();这样输出就是b了。 然后我尝试在ruby中试验: #encoding:utf-8class A_class def foo puts self::class end endclass B_class < A_class end b = B_class.new b.foo 结果输出B_class,可见,ruby是晚绑定的。
上面说的不完全准确,刚又仔细看了一下。主要原因应该是由于手册中说的那样:self:: 的限制 使用self:: 或者 __CLASS__对当前类的静态引用,取决于定义当前方法所在的类:应该主要是由于这条约定导致的。 class A { public static function who() { echo __CLASS__; } public static function test() { self::who(); } }class B extends A { public static function who() { echo __CLASS__; } }B::test(); 手册中指的应该是如下情况,如果父类中的方法有使用self::相互调用的情况,那么子类继承下来时,self::并不会改变环境为当前子类,而还是会去调用父类的方法。那么按照手册中说的。将父类中所有self关键字替换为static::,就可以达到目的了。
比起非静态方法,它不需要实例化整个class。对性能消耗要小一些。与全局函数相比,它可以使用class的特性。继承,封装之类的特性。
class T {
static function f() {
echo __CLASS__;
}
}class T1 extends T {
}T1::f();
对于这个问题,即使方法不是静态的,结果也是一样。class a {
public function print_class_name() {
echo __CLASS__;
}
}class b extends a {}$b = new b();
$b->print_class_name();输出还是a所以应该和是否静态无关,不过我之前确实不知道,继承下来的方法并不能改变当初的环境。查了一下,这个并非是因为T1没有继承T的方法,而是__CLASS__取值的早绑定和晚绑定造成的。从表面上来看,它也确实是"继承"下来了这个方法,只不过对于当前环境不是像我想的那样。php手册中有指出在5.3之后,加入了一个关键字来解决这个问题。
http://php.net/manual/zh/language.oop5.late-static-bindings.php
class a {
public static function print_class_name() {
echo __CLASS__;
} public static function call_foo(){
static::print_class_name();
}
}class b extends a {}b::call_foo();
但我按照里面的代码试验,还是只能输出父类名称。不知是否与我的php版本有关,我是php5.4.10。
除非在子类中覆写父类的那个方法,才能调用到子类的方法。class a {
public static function print_class_name() {
echo __CLASS__;
}
}class b extends a {
public static function print_class_name() {
echo __CLASS__;
}
}b::print_class_name();这样输出就是b了。
然后我尝试在ruby中试验:
#encoding:utf-8class A_class
def foo
puts self::class
end
endclass B_class < A_class
end
b = B_class.new
b.foo
结果输出B_class,可见,ruby是晚绑定的。
使用self:: 或者 __CLASS__对当前类的静态引用,取决于定义当前方法所在的类:应该主要是由于这条约定导致的。
class A { public static function who() {
echo __CLASS__;
} public static function test() {
self::who();
}
}class B extends A { public static function who() {
echo __CLASS__;
}
}B::test();
手册中指的应该是如下情况,如果父类中的方法有使用self::相互调用的情况,那么子类继承下来时,self::并不会改变环境为当前子类,而还是会去调用父类的方法。那么按照手册中说的。将父类中所有self关键字替换为static::,就可以达到目的了。
而且cpp代码在编译过后,一切类、方法、变量都烟消云散,只剩下一堆内存地址。所以运行时无法得到类名。