В дополнение к ответам относительно использования PHP двух двоеточий в качестве "оператора разрешения области видимости" :
Кроме того, используется двойное двоеточие:
Чтобы преобразовать неквалифицированное, квалифицированное или псевдонимное имя класса в его полностью квалифицированную форму, и
Для вызова метода класса __callStatic с произвольным, ранее необъявленным именем метода.
Чтобы преобразовать имя класса в его полностью определенную форму, добавив ":: class"
Две двоеточия, за которыми следует ключевое слово «class», помещенное после имени класса, предоставляет полное имя этого класса в виде строки. Т.е. , "ClassName :: class" преобразуется в полное имя "ClassName". См. : (A) Руководство: классы и объекты: основы , (B) Руководство: классы и объекты: константы классов и (C) Руководство: Справочник по языку: Константы
Синтаксис был принят в PHP 5.5. См. : (A) RFC и (B) PHP 5.5 Новые функции
Синтаксис ":: class" полезен в пространстве имен для получения полностью квалифицированного имени класса из его неквалифицированной или квалифицированной формы или из псевдонима его имени .
Синтаксис ":: class", по-видимому, работает для разрешения имен интерфейсов, а также имен классов, хотя, похоже, это не документировано источниками, указанными выше.
В пределах класса синтаксис также работает с "self :: class", как упомянуто в RFC ":: class", связанном выше.
Несколько примеров:
<?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 :: произвольныйMethodName ()". Это вызывает метод класса __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.