<?php
class cls{
public static function print_str(){
echo 'OK';
}
}
cls::print_str();?>
通过 static定义的类方法,资料上说是静态方法;不需要实例类就可以直接使用。那在什么情况下要用 static 来定义类方法呢, 是以方便调用为原则吗 ?
如果类里面只有一个方法,那将它定义为静态或非静态;在使用效率上有无区别的呢。 应该是比较简单的问题,只是基础没打好就要请教阿。先谢谢啦。class静态
解决方案 »
- 求救
- cakephp 跳转的方式有几种,有什么区别?
- 排序的问题,请教高手。
- 数组使用中遇到的问题
- 请教php版本和全局变量的问题
- 请各位兄弟帮我看看这个简单的问题!
- 刚刚配置完 apache+php ,遇到问题: ERROR: environment variable TEST_PHP_EXECUTABLE must be set to specify PHP executable!
- 日期格式的0000-00-00这样的变量是否为空?
- php中如何全部显示出添加到数据库中的文字,好像只能显示1000字左右,高分求教?
- 求正则匹配第一行指定字符串
- 急!关于PHP调取不到数据
- php 发布后只能浏览根目录子目录全都找不到
比起非静态方法,它不需要实例化整个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代码在编译过后,一切类、方法、变量都烟消云散,只剩下一堆内存地址。所以运行时无法得到类名。