php中双冒号的用法
不实例化类 而调用 类中的方法和属性
一直以为php双冒号只是在类调用静态属性和静态方法的时候上用到。
但是我错了,今天我在看ecmall的一段代码时发现
ECMall::startup( ... );
class ECMall
{
/* 启动 */
function startup($config = array())
{
...
}
}
我才知道原来双冒号的用法不仅仅是在调用静态的时候用到。
下面测试了一下 (php - 5.3.27)
class a
{
public function aa(){
echo 'aa方法';
}
public static function bb(){
echo 'bb静态方法';
}
}
a::aa();
a::bb();
$a = new a;
$a->aa();
3个输出都正常 没有报错
class a
{
static $c=1;
$d = 2;
}
echo a::$c; //ok
echo a::$d; //这个会语法错误
再看下面这个
class a
{
public $c = 1;
function bb(){
echo $this->c;
}
}
a::bb();
Fatal error: Using $this when not in object context in...
再接着,
class a
{
public $c = 1;
function bb(){
echo self::c;
}
}
a::bb();
这个还是一样会报错,因为slef只能访问当前类的静态方法和静态属性。
接着,
class a
{
$c = 1;
}
echo a::$c;
Parse error
: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in...
这个一样报错
上面的都是public的 我们现在看看 prtected 和 private的
class a
{
protected function aa(){
echo 'aa';
}
private function bb(){
echo 'bb';
}
}
a::aa(); //Fatal error: Call to protected method a::aa() from context ''
a::bb(); //Fatal error: Call to private method a::bb() from context ''
总结一下
双冒号在调用类的方法和属性时,可以调用 静态方法,静态属性 和 普通的方法,还有 这些都是要public的才行。