Scope Resolution Operator (::)
今天 看joomla源码的时候,才意识到。原来这个操作符还可以访问类的非静态方法啊。真的让我吃惊不好。一直以为作用域解析运算符只能访问类的static方法和static成员变量。
如果各位不相信,下面有个简单的小测试代码可以证明这个。
复制代码 代码如下:
class A{
private $_name = 'A';
function __construct(){
echo 'A construct
';
}
function test(){
echo 'A test()
';
}
}
class B extends A{
private $_name = 'B';
function __construct(){
parent::__construct();
echo 'B construct
';
}
function test(){
echo 'B test()';
}
}
A::test();
echo '#########
';
B::test();
复制代码 代码如下:
A test()
#########
B test()
复制代码 代码如下:
class A{
private $_name = 'A';
function __construct(){
echo 'A construct
';
}
function test(){
echo 'A test()
', $this->$_name,'
';
}
}
class B extends A{
private $_name = 'B';
function __construct(){
parent::__construct();
echo 'B construct
';
}
function test(){
echo 'B test()', $this->_name,'
';
}
}
A::test();
echo '#########
';
B::test();
复制代码 代码如下:
Fatal error: Using $this when not in object context in D:\www\test\scoperefe.php on line 9
[html]
那有的朋友就说了。你压根就没有实例化类A,当然不能直接用$this->_name的方式来访问成员变量$_name了,那么,是不是修改成self::$_name就行了哪?
说干就干,下面把上面的代码修改下
[code]
class A{
private $_name = 'A';
function __construct(){
echo 'A construct
';
}
function test(){
echo 'A test()
', self::$_name,'
';
}
}
class B extends A{
private $_name = 'B';
function __construct(){
parent::__construct();
echo 'B construct
';
}
function test(){
echo 'B test()', $this->_name,'
';
}
}
A::test();
echo '#########
';
B::test();
复制代码 代码如下:
A test() Fatal error: Access to undeclared static property: A::$_name in D:\www\test\scoperefe.php on line 9