PHP中::、->、self、parent::、$this操作符的区别 -
在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::,反之如果被引用的变量或者方法没有被声明成const或者static,那么就必须使用操作符->。
另外,如果从类的内部访问const或者static变量或者方法,那么就必须使用自引用的self,反之如果从类的内部访问不为const或者static变量或者方法,那么就必须使用自引用的$this。
静态变量
是只存在于函数作用域的变量, 不过, 在函数执行完成后,这种变量的 值不会丢失 ,也就是说, 在下一次调用这个函数时,变量仍然会记得原来的值. 要将某个变量定义为静态的, 只需要在变量前加上 static 关键字即可.
类中静态元素的使用
在类中, static 关键字有两种主要用法, 一是用来 定义静态成员 ,一是用来 定义静态方法 . 在类的内部, 可以使用 作用域限定符 (::) 来访问不同层次作用域的变量.
静态成员
静态成员是一种类变量, 可以把它看成时 属于整个类 而不是属于类的某个实例. 与一般的实例变量不同的是, 静态成员只保留一个变量值, 而这个变量值 对所有的实例都是有效 的, 也就是说, 所有的实例共享这个成员.
$this 只表示类的当前实例, 而 self:: 表示的是类本身 ,在类之外的代码中不能使用这个操作符,而且它不能识别自己在继承树层次结构中的位置.
也就是说, 在扩展类中使用 self 作用域时, self 可以调用基类中声明的方法, 但它调用的总是已经在扩展类中重写的方法. 与 $this 不同的是, 在使用静态变量时,必须在作用域限定符后面加上 $ 符号.
在扩展类中, 在基类的方法被重写的情况下,使用 parent 作用域调用定义在基类中的方法. 静态成员也可以只属于父类 . 如果在子类和父类中同时声明了某个成员,也可以使用 parant:: 在子类中访问父类中的变量. 在这种情况下, 父类的静态成员和子类的静态成员保存的是不同的值.
可以在 :: 操作符的左边写上类的名称来静态地访问某个成员, 这样 避免创建类的实例 . 不仅省略掉实例化类的代码, 而且还会 更高效 , 因为类的每个实例都会占用一小部分的系统资源.
在使用 :: 操作符访问成员变量时, 需要再次注意对 $ 符号的使用. 因为PHP当前不支持动态的静态变量的使用, 也就是说不支持可变的静态变量. 在使用$this->$var时, 被访问的成员是包含在$var中的变量的值. 而不用$符号访问某个变量实际上查找的是类的某个常量 , 而常量是不能通过$this来访问的 .
PHP6 中提出的static:: 作用域使我们不再需要使用self:: 和parent::. 当希望指向最终的实现功能的类时, 就可以使用static::, 这个限定符会在代码执行之前立即计算出继承层次机构上最后那个类的成员. 之一过程被称为延迟绑定, 它使我们可以在子类中重写某个静态变量, 并且也可以从某个在父类中声明的函数中反问这个最终成员.
静态方法
静态方法和非静态方法之间有一个重要的区别: 在调用静态方法时, 不再需要拥有类的实例 .
静态方法和非静态方法 使用原则 :
一是如果某个方法中不包含$this 变量, 就应该时静态方法; 如果不需要类的实例, 可能还应该使用静态类, 这样可以免去实例化类的工作. 另, 在静态方法中时不能使用$this 变量的, 因为静态方法不属于某个特定的实例.
PHP中使用作用域限定操作符时, 用变量作为类的名称时不允许的.
- parent:: 可用于调用父类中定义的成员方法。
- parent::的追溯不仅于直接父类。