[乐意黎转载]PHP里->和双冒号的区别

PHP双冒号::的用法
双冒号操作符即作用域限定操作符Scope Resolution Operator可以访问静态、const和类中重写的属性与方法。

class Test {
public static $var1 = “static variable 1";
public $var2 = "object property 2";

public function a() { echo "method a"; }
public static function b() { echo "static method b"; }
}

类里的静态属性和function调用时是不需要先declare的,直接用双冒号
echo Test::var1;
Test::b();
非静态的必须要在类被declare的情况下才能被引用,是用 ->
$o_test = new Test;
echo $o_test->var2;

$o_test->a();

两个冒号表示调用类的静态方法,->表示调用普通方法。

双冒号操作符即作用域限定操作符Scope Resolution Operator可以访问静态、const和类中重写的属性与方法。

在类定义外使用的话,使用类名调用。在PHP 5.3.0,可以使用变量代替类名。

Program List:用变量在类定义外部访问

01<?php
02class Fruit {
03    const CONST_VALUE = 'Fruit Color';
04}
05 
06$classname 'Fruit';
07echo $classname::CONST_VALUE; // As of PHP 5.3.0
08 
09echo Fruit::CONST_VALUE;
10?>

Program List:在类定义外部使用::

01<?php
02class Fruit {
03    const CONST_VALUE = 'Fruit Color';
04}
05 
06class Apple extends Fruit
07{
08    public static $color 'Red';
09 
10    public static function doubleColon() {
11        echo parent::CONST_VALUE . "\n";
12        echo self::$color "\n";
13    }
14}
15 
16Apple::doubleColon();
17?>

程序运行结果:

1Fruit Color Red

Program List:调用parent方法

01<?php
02class Fruit
03{
04    protected function showColor() {
05        echo "Fruit::showColor()\n";
06    }
07}
08 
09class Apple extends Fruit
10{
11    // Override parent's definition
12    public function showColor()
13    {
14        // But still call the parent function
15        parent::showColor();
16        echo "Apple::showColor()\n";
17    }
18}
19 
20$apple new Apple();
21$apple->showColor();
22?>

程序运行结果:

1Fruit::showColor()
2Apple::showColor()

Program List:使用作用域限定符

01<?php
02    class Apple
03    {
04        public function showColor()
05        {
06            return $this->color;
07        }
08    }
09 
10    class Banana
11    {
12        public $color;
13 
14        public function __construct()
15        {
16            $this->color = "Banana is yellow";
17        }
18 
19        public function GetColor()
20        {
21            return Apple::showColor();
22        }
23    }
24 
25    $banana new Banana;
26    echo $banana->GetColor();
27?>

程序运行结果:

1Banana is yellow

Program List:调用基类的方法

01<?php
02 
03class Fruit
04{
05    static function color()
06    {
07        return "color";
08    }
09 
10    static function showColor()
11    {
12        echo "show " . self::color();
13    }
14}
15 
16class Apple extends Fruit
17{
18    static function color()
19    {
20        return "red";
21    }
22}
23 
24Apple::showColor();
25// output is "show color"!
26 
27?>

程序运行结果:

1show color

PHP代码中常见"::"的操作符,这个是作用域限定操作符,它用来置顶类中不通作用域的级别,左边是作用域,右边是访问作用域的成员。

作用域限定操作符(也可称作:范围解析操作符)或者更简单地说是一对冒号,
可以用于访问静态成员、方法和常量,还可以用于覆盖类中的成员和方法。

在PHP中定义作用域的有self和parent,在PHP6中提供了static作用域。

self:表示当前类的作用域,不能在类之外的代码使用self,在扩展类中使用self时,它调用的不是父类的方法,而是扩展类的重载方法。

parent:表示当前类父类的作用域。

<?php
class forasp{
static $url="http://www.4u4v.cn";
static $webname = "网站制作学习之php双冒号";
public function writeurl(){
echo self::$url; //调用自己的内容
}
public function writewebname(){
echo "测试子类调用父类内容";
}
}
class cn extends forasp{
function father(){
parent::wirtewebname();
}
}
$a = new forasp();//实例化父类
$a->writeurl();//调用自身内容
$b = new cn();
$b->writewebname();//调用父类内容
?>

调用静态方法的时,可以使用::调用类中的静态方法或者属性。

用法:

双冒号操作符即作用域限定操作符Scope Resolution Operator可以访问静态、const和类中重写的属性与方法。

那么,与箭头->操作符 在应用上的区别在哪里?

当在类的外部访问这些静态成员、方法和常量时,必须使用类的名字。
双冒号范围解析操作符一般是用在静态方法、静态变量的调用,此时类不需要实例化。
而用箭头操作符->时,必须要将类进行实例化(或者在类的内部调用也可以)。



发布了430 篇原创文章 · 获赞 415 · 访问量 925万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览