Я не знаю, что он делает, когда у нас есть такая ситуация:
Foo::Bar
Он выглядит как путь.
Я не знаю, что он делает, когда у нас есть такая ситуация:
Foo::Bar
Он выглядит как путь.
Это (как правило) для доступа к статическому методу или свойству в классе. Он назывался оператором разрешения области или Paamayim Nekudotayim (что приводит к некоторым удивительно запутывающим сообщениям об ошибках!). См. http://www.php.net/manual/en/language.oop5.paamayim-nekudotayim.php.
Оператором ::
является оператор разрешения области. Он используется для доступа к константам классов или статическим свойствам и методам либо вне класса:
ClassName::CONSTANT_VALUE
ClassName::staticMethod()
Или внутри метода класса ссылаться на тот же или родительский класс, используя self
и parent
:
self::CONSTANT_VALUE
self::staticMethod()
parent::CONSTANT_VALUE
parent::staticMethod()
Оператор разрешения области действия (::) двойной двоеточие - это токен, который позволяет получить доступ к статической, константе и переопределенным свойствам или методам класса.
<?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
?>
использование оператора разрешения области
Константа класса, свойство класса (статическое), функция класса (статическая) могут иметь одно и то же имя и быть доступными через двойное двоеточие.
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;
В дополнение к ответам относительно использования PHP двух двоеточий в качестве "оператора разрешения области видимости":
Кроме того, используется двойное двоеточие:
Чтобы преобразовать неквалифицированное, квалифицированное или псевдонимное имя класса в его полностью квалифицированную форму, и
Для вызова метода класса __callStatic.
Две двоеточия, за которыми следует ключевое слово "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", если он его объявил. Затем метод __callStatic может "динамически" выбирать, как обрабатывать вызов. В PHP это называется "перегрузкой" с помощью "магического метода" __callStatic.
Смотрите дополнительное fooobar.com/info/957605/...
Пример:
<?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.