一、范围解析操作符 (::)
·1、范围解析操作符更简单地说是一对冒号,可以用于访问静态成员,类常量,还可以用于覆盖类中的属性和方法。
2、当在类定义之外引用到这些项目时,要使用类名。
3、可以通过变量来引用类,该变量的值不能是关键字(如 self,parent 和 static)。
4、self,parent 和 static 这三个特殊的关键字是用于在类定义的内部对其属性或方法进行访问的。
5、在类的外部使用 :: 操作符
class MyClass {
const CONST_VALUE = 'A constant value';
}
$classname = 'MyClass';
echo $classname::CONST_VALUE; // 自 PHP 5.3.0 起
echo MyClass::CONST_VALUE;
6、在类定义内部使用 ::
当一个子类覆盖其父类中的方法时,PHP 不会调用父类中已被覆盖的方法。是否调用父类的方法取决于子类。这种机制也作用于构造函数和析构函数,重载以及魔术方法。
class OtherClass extends MyClass
{
public static $my_static = 'static var';
public static function doubleColon() {
echo parent::CONST_VALUE . "\n";
echo self::$my_static . "\n";
}
}
$classname = 'OtherClass';
echo $classname::doubleColon(); // 自 PHP 5.3.0 起
OtherClass::doubleColon();
7、调用父类的方法
class MyClass
{
protected function myFunc() {
echo "MyClass::myFunc()\n";
}
}
class OtherClass extends MyClass
{
// 覆盖了父类的定义
public function myFunc()
{
// 但还是可以调用父类中被覆盖的方法
parent::myFunc();
echo "OtherClass::myFunc()\n";
}
}
$class = new OtherClass();
$class->myFunc();
二、Static(静态)关键字
1、普通成员作为对象属性存在。而static成员作为整个类的属性存在,这个static成员总是唯一存在的,在多个对象之间共享的。
2、声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
3、如果在类的外部访问类中的静态成员,可以使用对象引用和使用类名访问,但通常选择使用类名来访问。
如果在类内部的成员方法中访问其它的静态成员,通常使用self的形式去访问,最好不要直接使用类名称。
例如:Person类中有个属性country:$this->country
如果是静态属性country:self::$country;
self::country则表示访问常量
4、在静态方法中只能访问静态成员。因为非静态的成员必须通过对象的引用才能访问,通常是使用$this完成的。
但是可以使用类名或self在非静态方法中访问静态成员。
5、如果没有指定访问控制,属性和方法默认为公有。
6、由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。
静态属性不可以由对象通过 -> 操作符来访问。
7、静态属性只能被初始化为文字或常量,不能使用表达式。所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值,也不能指向一个对象。
class Foo
{
public static $my_static = 'foo';
public function staticValue() {
return self::$my_static;
}
}
class Bar extends Foo
{
public function fooStatic() {
return parent::$my_static;
}
}
print Foo::$my_static . "\n";
$foo = new Foo();
print $foo->staticValue() . "\n";
print $foo->my_static . "\n"; // Undefined "Property" my_static
print $foo::$my_static . "\n";
$classname = 'Foo';
print $classname::$my_static . "\n"; // As of PHP 5.3.0
print Bar::$my_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";