范围解析操作符(::)
范围解析操作符,可以简单地说是一对冒号,可以用于访问静态成员、方法和常量,还可以用于覆盖类中的成员和方法。
当在类的外部访问这些静态成员、方法和常量时,必须使用类的名字。
<?php
class A
{
const CONST_A = 'A constant value';
public static function sayHello()
{
echo 'Hello';
}
}
class B extends A
{
public static $b = 'static var b';
/**
* 覆盖父类方法
*
*/
public static function sayHello()
{
echo parent::sayHello().' World'.PHP_EOL;
}
public static function actionB()
{
self::sayHello();
echo parent::CONST_A.PHP_EOL;
echo self::$b;
}
}
B::actionB();
结果输出
Hello World
A constant value
static var b
从结果可知
- 使用
parent
,self
可以调用父类和自身的方法属性 ::
可以调用静态方法,静态属性和常量
类与对象(二)
Static 关键字
声明类成员或方法为 static,就可以不实例化类而直接访问。不能通过一个对象来访问其中的静态成员(静态方法除外)。
由于静态方法不需要通过对象即可调用,所以伪变量 $this
在静态方法中不可用。静态属性不可以由对象通过 ->
操作符来访问。
注意:在 PHP7 中通过(::)调用非静态方法会产生一个 E_DEPRECATED 级别的警告,不赞成这样使用,在以后可能会取消对这种用法的支持。
<?php
class Test
{
public $hi = 'Hi';
public static $hello = 'Hello';
public function sayHi()
{
echo $this->hi;
}
public static function sayHello()
{
echo self::$hello;
}
public function sayWorld()
{
echo " World".PHP_EOL;
}
}
$obj = new Test();
$obj->sayHi();
$obj->sayWorld();
Test::sayHello();
Test::sayWorld();
输出结果
Hi World
Hello World
从结果可以看出
- 通过
::
可以执行静态和非静态方法,但是不赞成通过这种方式调用非静态方法,此方式有可能被官方移除,因此上面sayWorld()
,应该通过(new Test())->sayWorld()
这种方式调用 - 静态属性和方法可以通过
self
关键字调用
就像其它所有的PHP静态变量一样,静态属性只能被初始化为一个字符值或一个常量,不能使用表达式。 所以你可以把静态属性初始化为整型或数组,但不能指向另一个变量或函数返回值,也不能指向一个对象。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)