有点困惑 在类里面什么情况下要用 static 呢

anydy2008 2013-01-29 10:06:50

<?php

class cls{

public static function print_str(){

echo 'OK';

}


}
cls::print_str();

?>




通过 static定义的类方法,资料上说是静态方法;不需要实例类就可以直接使用。

那在什么情况下要用 static 来定义类方法呢, 是以方便调用为原则吗 ?


如果类里面只有一个方法,那将它定义为静态或非静态;在使用效率上有无区别的呢。

应该是比较简单的问题,只是基础没打好就要请教阿。先谢谢啦。
...全文
473 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
an9ryfr09 2013-01-30
  • 打赏
  • 举报
回复
在cpp中,即使在类内部,也只能使用类名::方法名来调用自身类的方法。没有self这种关键字。所以避免了这种歧义。 而且cpp代码在编译过后,一切类、方法、变量都烟消云散,只剩下一堆内存地址。所以运行时无法得到类名。
happypiggy2010 2013-01-30
  • 打赏
  • 举报
回复
常用的公用函数或变量。
an9ryfr09 2013-01-29
  • 打赏
  • 举报
回复
上面说的不完全准确,刚又仔细看了一下。主要原因应该是由于手册中说的那样: 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::,就可以达到目的了。
an9ryfr09 2013-01-29
  • 打赏
  • 举报
回复
引用 4 楼 xuzuning 的回复:
继承? PHP code?12345678910class 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-8

class A_class
    def foo
        puts self::class
    end
end

class B_class < A_class
end


b = B_class.new
b.foo
结果输出B_class,可见,ruby是晚绑定的。
haoheran 2013-01-29
  • 打赏
  • 举报
回复
基本上没用过
xuzuning 2013-01-29
  • 打赏
  • 举报
回复
静态方法是作用域受限的函数,也就是说使用时要冠以宿主名 如果仅当做函数使用,我看不出有什么优势 如果是用于单例模式对象连接,那么还是比较方便的 不需要把对象传来传去
xuzuning 2013-01-29
  • 打赏
  • 举报
回复
继承?
class T {
  static function f() {
    echo __CLASS__;
  }
}

class T1 extends T {
}

T1::f();
an9ryfr09 2013-01-29
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
静态方法是作用域受限的函数,也就是说使用时要冠以宿主名 如果仅当做函数使用,我看不出有什么优势 如果是用于单例模式对象连接,那么还是比较方便的 不需要把对象传来传去
比起非静态方法,它不需要实例化整个class。对性能消耗要小一些。与全局函数相比,它可以使用class的特性。继承,封装之类的特性。

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧