总结下,使用静态成员是为了保证在脚本周期里不被重新初始化,因此避免对类进行实例化而是用类名直接调用或者访问(第一次调用或者访问的时候生成单例对象,再调用的时候直接返回这个单例对象)。
在MVC中常被用作以工厂模式生成表Model类单例对象,工厂类中设置一个static $list数组成员保存所有生成的表Model单例。如下Factory.class.php(Factory类会自动加载):
class Factory{ public static function M($class_name=''){ static $object_list=array(); //因为是static成员所以不会被清空,注意这里保存的是object数据类型 if (isset($object_list[$class_name])) { //如果已经存在,直接返回该对象 return $object_list[$class_name]; }else{ //对象数组中不存在,第一次调用,则实例化该类,并把对象保存到数组中 $object_list[$class_name]=new $class_name(); return $object_list[$class_name]; //返回刚刚生成的对象 } } }
这样在赋值时使用$xx=Factory::M('表名'); 即可获得单例对象了。所谓工厂模式听着高大上,其实就是个对象仓库类吧,对于表间结构不复杂的小型web开发,感觉工厂模式没什么太大用,不如require_once然后new来的直接。而且工厂模式说是为了保证单例,可是毕竟还多了一个Factory对象呢。
========
静态变量
是只存在于函数作用域的变量, 不过, 在函数执行完成后,这种变量的值不会丢失,也就是说, 在下一次调用这个函数时,变量仍然会记得原来的值. 要将某个变量定义为静态的, 只需要在变量前加上 static 关键字即可.
类中静态元素的使用
在类中, static 关键字有两种主要用法, 一是用来定义静态成员,一是用来定义静态方法. 在类的内部, 可以使用作用域限定符 (::) 来访问不同层次作用域的变量.
静态成员
静态成员是一种类变量, 可以把它看成时属于整个类而不是属于类的某个实例. 与一般的实例变量不同的是, 静态成员只保留一个变量值, 而这个变量值对所有的实例都是有效的, 也就是说, 所有的实例共享这个成员.
$this 只表示类的当前实例, 而 self:: 表示的是类本身,在类之外的代码中不能使用这个操作符,而且它不能识别自己在继承树层次结构中的位置.
也就是说, 在扩展类中使用self 作用域时, self 可以调用基类中声明的方法, 但它调用的总是已经在扩展类中重写的方法. 与$this 不同的是, 在使用静态变量时,必须在作用域限定符后面加上$符号.
在扩展类中, 在基类的方法被重写的情况下,使用 parent 作用域调用定义在基类中的方法.静态成员也可以只属于父类. 如果在子类和父类中同时声明了某个成员,也可以使用parant:: 在子类中访问父类中的变量. 在这种情况下, 父类的静态成员和子类的静态成员保存的是不同的值.
可以在 :: 操作符的左边写上类的名称来静态地访问某个成员, 这样避免创建类的实例. 不仅省略掉实例化类的代码, 而且还会更高效, 因为类的每个实例都会占用一小部分的系统资源.
在使用 :: 操作符访问成员变量时, 需要再次注意对$符号的使用. 因为PHP当前不支持动态的静态变量的使用, 也就是说不支持可变的静态变量. 在使用$this->$var时, 被访问的成员是包含在$var中的变量的值. 而不用$符号访问某个变量实际上查找的是类的某个常量, 而常量是不能通过$this来访问的.
PHP6 中提出的static:: 作用域使我们不再需要使用self:: 和parent::. 当希望指向最终的实现功能的类时, 就可以使用static::, 这个限定符会在代码执行之前立即计算出继承层次机构上最后那个类的成员. 之一过程被称为延迟绑定, 它使我们可以在子类中重写某个静态变量, 并且也可以从某个在父类中声明的函数中反问这个最终成员.
静态方法
静态方法和非静态方法之间有一个重要的区别: 在调用静态方法时, 不再需要拥有类的实例.
静态方法和非静态方法使用原则:
一是如果某个方法中不包含$this 变量, 就应该时静态方法; 如果不需要类的实例, 可能还应该使用静态类, 这样可以免去实例化类的工作. 另, 在静态方法中时不能使用$this 变量的, 因为静态方法不属于某个特定的实例.
PHP中使用作用域限定操作符时, 用变量作为类的名称时不允许的.
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。