如题:
php中的static除了能不实例化访问还有什么用?
目前感觉php中的static方法和属性,作用貌似只有不实例化访问;而且大家一直说的static只占用一份内存有多大作用?因为php多是多进程方式运行的,而且据说进程间是不共享资源的,也就是说多个用户同时访问时,static方法和类仍然有多份,无法实现共享,除非在一次请求中用到多次某个方法和属性,这是static才发挥了只占用一份内存的作用。
还有,php的单例模式有什么用?
如果多进程间不共享资源,那php的单例模式其实也没什么用了,比如想用单例模式来控制对数据库的访问,如果并发10个,那么也就是开了10个进程,10个进程又分别实例化了10个单例对象,那单例岂不是就失效了吗?
最近想深入钻研下php,也不知道该如何开始,很多书都是php的简单入门,越学越觉得自己懂得少了,请大牛或版主帮忙解释下以上的问题吧,多谢。
php中的static除了能不实例化访问还有什么用?
目前感觉php中的static方法和属性,作用貌似只有不实例化访问;而且大家一直说的static只占用一份内存有多大作用?因为php多是多进程方式运行的,而且据说进程间是不共享资源的,也就是说多个用户同时访问时,static方法和类仍然有多份,无法实现共享,除非在一次请求中用到多次某个方法和属性,这是static才发挥了只占用一份内存的作用。
还有,php的单例模式有什么用?
如果多进程间不共享资源,那php的单例模式其实也没什么用了,比如想用单例模式来控制对数据库的访问,如果并发10个,那么也就是开了10个进程,10个进程又分别实例化了10个单例对象,那单例岂不是就失效了吗?
最近想深入钻研下php,也不知道该如何开始,很多书都是php的简单入门,越学越觉得自己懂得少了,请大牛或版主帮忙解释下以上的问题吧,多谢。
以下是我今天写的例子,希望对你有启发。
/** * author Winter * 2016-11-22 * PHP的单例模式 * 模拟Java Bean * Class Php_bean */ class Php_bean{ private static $_instance = null; private function __construct(){} private $hit = 0;//命中次数 private $array = array();//缓存 private $itratorCount = 0;//迭代次数 public function add_itratorCount(){ $this->itratorCount ++; } public function get_itratorCount(){ return $this->itratorCount; } public function set_cache($row,$col,$value){ $this->array[$row."_".$col] = $value; } public function get_cache($row,$col){ if(isset($this->array[$row."_".$col])){ return $this->array[$row."_".$col]; }else{ return false; } } public function add_hit(){ $this->hit ++; } public function get_hit(){ return $this->hit; } public static function instance(){ if(self::$_instance instanceof self) return self::$_instance; self::$_instance = new self; return self::$_instance; } } /**
* author Winter * 2016-11-22 * @param $row 行 * @param $col 列 * @return int */ function get_value($row,$col){ $php_bean = Php_bean::instance(); $php_bean->add_itratorCount(); if($col > $row) return 0; if($row <=0) return 0; if($col == $row) return 1; if($row == 1) return 1; if($col == 1) return 1; $pre = $php_bean->get_cache($row-1,$col-1); $next = $php_bean->get_cache($row-1,$col-0); if($pre === false){ $pre = get_value($row-1,$col-1); $php_bean->set_cache($row-1,$col-1,$pre); }else{ $php_bean->add_hit(); } if($next === false){ $next = get_value($row-1,$col-0); $php_bean->set_cache($row-1,$col-0,$next); }else{ $php_bean->add_hit(); } $value = $pre + $next; return $value; } $v = get_value(66,6); var_dump($v); $php_bean_obj = Php_bean::instance(); echo "hit:".$php_bean_obj->get_hit()."<br/>"; echo "itratorCount:".$php_bean_obj->get_itratorCount()."<br/>";
只被初始化一次,当程序执行离开此作用域时,其值不会消失,会使用上次执行的结果。
声明类成员或方法为 static ,就可以不实例化类而直接访问,不能通过一个对象来访问其中的静态成员(静态方法除外)。静态成员属于类,不属于任何对象实例,但类的对象实例都能共享。
这是纯面向对象编程带来的垃圾产物,应尽量避免使用真正的 static 变量,在编程中还是很有意义的
比如一个开关函数function pingpong() {
static $v = false;
return $v = !$v;
}
就可使控制流变得很简洁
只被初始化一次,当程序执行离开此作用域时,其值不会消失,会使用上次执行的结果。
声明类成员或方法为 static ,就可以不实例化类而直接访问,不能通过一个对象来访问其中的静态成员(静态方法除外)。静态成员属于类,不属于任何对象实例,但类的对象实例都能共享。