Scope Resolution Operator (::) 今天 看joomla源码的时候,才意识到。原来这个操作符还可以访问类的非静态方法啊。真的让我吃惊不好。一直以为作用域解析运算符只能访问类的static方法和static成员变量。 如果各位不相信,下面有个简单的小测试代码可以证明这个。 复制代码 代码如下: class A{ private $_name = "A"; function __construct(){ echo "A construct <br />"; } function test(){ echo "A test() <br />"; } } class B extends A{ private $_name = "B"; function __construct(){ parent::__construct(); echo "B construct <br />"; } function test(){ echo "B test()"; } } A::test(); echo "######### <br />"; B::test();
这段代码输入的结果为: 复制代码 代码如下: A test() ######### B test()
虽然A类中的test()和B类中的test都不是 static方法,但是一样可以用 “类名::方法名称(参数列表)” 的样式进行正确调用。他的效果和 new 一个类的实例,然后用这个实例调用 test方法是一个样的。 但是,如果我需要在test方法中打印name属性,直接用::来调用 会是怎么个情况那.我们首先来修改下 上面的代码。 复制代码 代码如下: class A{ private $_name = "A"; function __construct(){ echo "A construct <br />"; } function test(){ echo "A test() <br />", $this->$_name,"<br />"; } } class B extends A{ private $_name = "B"; function __construct(){ parent::__construct(); echo "B construct <br />"; } function test(){ echo "B test()", $this->_name,"<br />"; } } A::test(); echo "######### <br />"; B::test();
上面的代码运行的结果 如下: 复制代码 代码如下: Fatal error: Using $this when not in object context in D:www estscoperefe.php on line 9 [html] 那有的朋友就说了。你压根就没有实例化类A,当然不能直接用$this->_name的方式来访问成员变量$_name了,那么,是不是修改成self::$_name就行了哪? 说干就干,下面把上面的代码修改下 [code] class A{ private $_name = "A"; function __construct(){ echo "A construct <br />"; } function test(){ echo "A test() <br />", self::$_name,"<br />"; } } class B extends A{ private $_name = "B"; function __construct(){ parent::__construct(); echo "B construct <br />"; } function test(){ echo "B test()", $this->_name,"<br />"; } } A::test(); echo "######### <br />"; B::test();
再运行上面的代码,结果如下: 复制代码 代码如下: A test() Fatal error: Access to undeclared static property: A::$_name in D:www estscoperefe.php on line 9