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

ben*_*ben 31 php zend-framework

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

Foo::Bar
Run Code Online (Sandbox Code Playgroud)

它看起来像一条路.

Gum*_*mbo 52

::运营商范围解析操作.它用于从类外部访问类常量或静态属性和方法:

ClassName::CONSTANT_VALUE
ClassName::staticMethod()
Run Code Online (Sandbox Code Playgroud)

或者在类方法中使用self和引用相同或父类parent:

self::CONSTANT_VALUE
self::staticMethod()
parent::CONSTANT_VALUE
parent::staticMethod()
Run Code Online (Sandbox Code Playgroud)


Chr*_*ris 40

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

  • 你打败了我;)删除我的答案作为重复的帖子. (5认同)
  • 我想我会坚持称它为双冒号。 (2认同)

小智 6

范围解析运算符 (::) 是双冒号,是一个标记,允许访问类的静态常量和覆盖的属性或方法。

<?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
?>
Run Code Online (Sandbox Code Playgroud)


Sla*_*tow 5

补充有关 PHP 使用两个冒号作为其“范围解析运算符”的答案:

此外,还使用双冒号:

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

  2. 使用任意的、先前未声明的方法名称调用类的“__callStatic”方法。

通过附加“::class”将类名解析为其完全限定形式

两个冒号后跟“class”关键字,放置在类名称后面,以字符串形式提供该类的完全限定名称。 ,“ClassName::class”解析为“ClassName”的完全限定名称。 请参阅:(A)手册:类和对象:基础知识,(B) 手册:类和对象:类常量,以及 (C)手册:语言参考:常量

该语法在 PHP 5.5 中被采用。 请参阅:(A) RFC和 (B) PHP 5.5 新功能

“::class”语法在命名空间中很有用,可以从类的非限定或限定形式或从其名称的别名获取类的完全限定名称。

“::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
Run Code Online (Sandbox Code Playgroud)

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

两个冒号可用于“调用”类未声明的静态方法名称。例如,“类名::任意方法名()”。这样做会调用该类的“__callStatic”方法(如果该类已声明该方法)。它还将未声明方法的名称以及传递给未声明方法的任何参数传递给 __callStatic。然后 __callStatic 方法可以“动态”选择如何处理调用。PHP 将其称为“重载”,即__callStatic“魔术方法”

查看更多StackOverflow 讨论

例子:

<?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.
Run Code Online (Sandbox Code Playgroud)