静态成员,可以看作是属于整个类而不是类的某个实例,只保留一个变量值,而这个变量值对所有实例都有效,也就是说,所有实例共享这个变量
$this只表示当前实例,self::表示类本身,在类之外的代码中不能使用self::,且self::不能标识自己在继承树层次结构中的位置。也就是说,在扩展类中使用self::作用域时,self::可以调用基类中声明的方法,但它调用的总是已经在扩展类中重写的方法。与$this不同的是,在使用静态变量时,必须在作用域限定符后面加上$符号。
在扩展类中,在基类方法被重写的情况下,使用parent作用域调用定义在基类中的方法。静态成员可以只属于父类。如果在子类和父类中同事声明了某个成员,可以使用parent:;在子类中访问父类中的变量。在某些情况下,父类的静态成员和子类的静态成员保存不同的值。
可以在::操作符左边写上类的名称来静态的访问某个成员,这样避免创建类的实例。不仅省略实例化类的代码,而且还会更搞笑,因为类的每个实例都会调用一小部分的系统资源。
在使用::操作符访问成员变量的时候,需要注意对$符号的使用。因为PHP当前不支持动态的静态变量使用,也就是说不支持可变的静态变量。在使用$this->$var时,被访问的成员是包含在$var中的变量的值,而不用$符号访问某个变量实际上查找类的某个常量,而常量是不能通过$this来访问的。
PHP6提出的static::作用域使我们不再需要使用self::和parent::。当希望指向最终的实现功能的类时,可以使用static::,这个限定符会在代码执行之前计算出继承层次结构上最后那个类的成员,这一过程被称为延迟绑定,它使我们可以在子类中重写某个静态变量,并且也可以从某个在父类中声明的函数中范文这个最终还曾元。
静态方法与非静态方法间的一个重要区别:在调用静态方法时,不再需要拥有类的实例。
静态方法与非静态方法的使用原则:如果某个方法中不包含$this变量,就应该使用静态方法;如果不需要类的实例,可能还应该使用静态类来避免去实例化类的工作,静态方法中不能使用$this变量,因为静态方法不属于某个特定的实例。
instanceof可以确定一个对象时类的实例、类的子类、还是实现了某个接口,并进行相应的操作
类辅助函数
boolean class_exists(string class_name)
string get_class(object object) //确定对象的上下文
array get_class_methods(mixed class_name)
array get_class_vars(string class_name) //定义的字段
array get_declared_classes(void) //当前执行脚本中定义的所有类名
array get_object_vars(object object)
string get_parent_class(mixed object)
boolean interface_exists(string interface_name[, boolean autoload])
boolean is_subclass_of(object object, string class_name)
boolean method_exists(object object, string method_name)
__autoload函数,当引用未在脚本中定义的类时会自动调用个函数
newObject = clone oldObject;
__clone()方法用来调整对象的克隆行为,在代码克隆操作期间执行。
不支持方法重载、操作符重载、多重继承