PHP中两个冒号意味着什么?

时间:2010-05-25 09:50:25

标签: php zend-framework

当我们遇到这种情况时,我不知道它在做什么:

Foo::Bar

它看起来像一条路。

5 个答案:

答案 0 :(得分:52)

:: operator is the scope resolution operator。它用于从类外部访问类常量或静态属性和方法:

ClassName::CONSTANT_VALUE
ClassName::staticMethod()

或者在类方法中使用selfparent引用相同或父类:

self::CONSTANT_VALUE
self::staticMethod()
parent::CONSTANT_VALUE
parent::staticMethod()

答案 1 :(得分:39)

用于访问类中的静态方法或属性(通常)。它被称为范围解析运算符,或Paamayim Nekudotayim(这导致一些令人惊讶的混乱错误消息!)。请参阅http://www.php.net/manual/en/language.oop5.paamayim-nekudotayim.php

答案 2 :(得分:4)

范围解析运算符(::)是双冒号,是一个允许访问静态常量以及类的重写属性或方法的标记。 / p>

<?php
class A {

public static $B = '1'; # Static class variable.

const B = '2'; # Class constant.

public static function B() { # Static class function.
    return '3';
}

}

echo A::$B . A::B . A::B(); # Outputs: 123
?>

答案 3 :(得分:0)

使用范围解析运算符

  

类常量,类属性(静态),类函数(静态)   都可以共享相同的名称,并可以使用双冒号

进行访问
class B{
    public static $par = "par";
}
class A extends B{
    const B = "constant";
    public static $sel = "self";

    public static $b = "static property";
    public static function b(){
        echo "static function";
    }
    public static function c(){
        return parent::$par;
    }
    public static function d(){
        return self::$sel;
    }
     public static function e(){
        return self::$par;
    }
}

echo A::B.PHP_EOL;
echo A::$b.PHP_EOL;
echo A::b().PHP_EOL;
echo A::c().PHP_EOL;
echo A::d().PHP_EOL;

答案 4 :(得分:0)

要补充有关PHP使用两个冒号作为"scope resolution operator"的答案:

此外,使用双冒号:

  1. 将不合格,合格或别名的类名解析为其完全合格的形式,并且

  2. 使用一个以前未声明的任意方法名称来调用类的“ __callStatic”方法。

通过添加“ :: class”来将类名称解析为其完全限定的格式

在类名之后放置两个冒号,后跟“ class”关键字,以字符串形式提供该类的完全限定名。 ,“ ClassName :: class”解析为“ ClassName”的完全限定名称。 请参见:(A)Manual: Classes and Objects: Basics,(B)Manual: Classes and Objects: Class Constants和(C)Manual: Language Reference: Constants

PHP 5.5中采用了该语法。 请参见:(A)RFC和(B)PHP 5.5 New Features

“ :: class”语法在命名空间中非常有用,可以从其unqualified or qualified form或名称的alias中获取类的完全限定名称。

“ :: class”语法似乎可以解析接口名称以及类名称,尽管上面链接的源文件似乎并未对此进行记录。

在一个类中,该语法也可用于“ self :: class”,如上面链接的“ :: class” RFC所述。

一些例子:

<?php

namespace MyNamespace;

use MyNamespace\YourInterface as HerInterface;    
use MyNamespace\YourClass as HerClass;
use MyNamespace\TheirClass as OurClass;

interface MyInterface { }

interface YourInterface { }

class MyClass { }

class YourClass { }

class TheirClass
{
    public function fullName()
    {
        echo self::class;
    }
}

$ourClassInstance = new OurClass;

echo MyClass::class, PHP_EOL;
// outputs: MyNamespace\MyClass

echo HerClass::class, PHP_EOL;
// outputs: MyNamespace\YourClass

echo MyInterface::class, PHP_EOL;
// outputs: MyNamespace\MyInterface

echo HerInterface::class, PHP_EOL;
// outputs: MyNamespace\YourInterface

echo $ourClassInstance->fullName(), PHP_EOL;
// outputs: MyNamespace\TheirClass

使用未声明的方法名称调用“ __callStatic”

两个冒号可用于“调用”一个类尚未声明的静态方法名称。例如,“ ClassName :: arbitraryMethodName()”。如果该类已声明一个方法,则将调用该类的“ __callStatic”方法。它还将未声明方法的名称以及传递给未声明方法的所有参数传递给__callStatic。然后,__callStatic方法可以“动态”选择如何处理该调用。 PHP用"overloading"将此称为__callStatic "magic method"

查看其他StackOverflow discussion

示例:

<?php

namespace OurCompany\Orders;

class Intake
{
    public static function __callStatic($name, $arguments)
    {
        $item = substr($name, 5); // trims "order" prefix

        $specialistClass = "\OurCompany\Specialists\\" . $item;

        if (class_exists($specialistClass)) {
            $specialist = new $specialistClass;
            return $specialist->handleOrder($arguments);
        }

        return "I'm sorry, we can't help you with " .
            lcfirst($item) . ".";
    }
}

namespace OurCompany\Specialists;

class Car
{
    public function handleOrder($arguments)
    {
        return "May I help you with a $arguments[0] car?";
    }
}

class Truck
{
    public function handleOrder($arguments)
    {
        return "May I help you with a $arguments[0] truck?";
    }
}

use OurCompany\Orders\Intake;

echo Intake::orderCar("red"), PHP_EOL;
// outputs: May I help you with a red car?

echo Intake::orderTruck("pickup"), PHP_EOL;
// outputs: May I help you with a pickup truck?

echo Intake::orderShoes("suede"), PHP_EOL;
// outputs: I'm sorry, we can't help you with shoes.