Что означают две двоеточия в PHP? - PullRequest
31 голосов
/ 25 мая 2010

Я не знаю, что он делает, когда у нас такая ситуация:

Foo::Bar

Это похоже на путь.

Ответы [ 5 ]

52 голосов
/ 25 мая 2010

Оператор :: является оператором разрешения области действия . Он используется для доступа к константам класса или статическим свойствам и методам извне класса:

ClassName::CONSTANT_VALUE
ClassName::staticMethod()

Или в методе класса для ссылки на тот же или родительский класс, используя self и parent:

self::CONSTANT_VALUE
self::staticMethod()
parent::CONSTANT_VALUE
parent::staticMethod()
40 голосов
/ 25 мая 2010

Это (как правило) для доступа к статическому методу или свойству в классе. Это называется оператор разрешения области действия, или Paamayim Nekudotayim (что приводит к некоторым удивительно запутанным сообщениям об ошибках!). Смотри http://www.php.net/manual/en/language.oop5.paamayim-nekudotayim.php.

4 голосов
/ 05 апреля 2016

Оператор разрешения области (: :) двойное двоеточие - это токен, который обеспечивает доступ к статическим , константе и переопределенным свойствам или методам класса.

<?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
?>
0 голосов
/ 14 декабря 2018

В дополнение к ответам относительно использования 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", как упомянуто в 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.
0 голосов
/ 21 августа 2018

использование оператора разрешения области действия

Константа класса, свойство класса (статическое), функция класса (статическое) все могут иметь одно и то же имя и быть доступны с помощью двойного двоеточия

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...