Что такое :: class в PHP?

102

Каковы ::classобозначения в PHP?

Быстрый поиск в Google ничего не дает из-за характера синтаксиса.

толстая кишка класс толстой кишки

В чем преимущество использования этого обозначения?

protected $commands = [
    \App\Console\Commands\Inspire::class,
];
Яда
источник

Ответы:

87

Эта функция была реализована в PHP 5.5.

Документация: http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name

Это очень полезно по двум причинам.

  • Вам больше не нужно хранить имена классов в строках. Таким образом, многие IDE могут получить эти имена классов при рефакторинге кода.
  • Вы можете использовать useключевое слово для разрешения вашего класса, и вам не нужно писать полное имя класса.

Например :

use \App\Console\Commands\Inspire;

//...

protected $commands = [
    Inspire::class, // Equivalent to "App\Console\Commands\Inspire"
];

Обновление :

Эта функция также полезна для позднего статического связывания .

Вместо использования __CLASS__магической константы вы можете использовать эту static::classфункцию для получения имени производного класса внутри родительского класса. Например:

class A {

    public function getClassName(){
        return __CLASS__;
    }

    public function getRealClassName() {
        return static::class;
    }
}

class B extends A {}

$a = new A;
$b = new B;

echo $a->getClassName();      // A
echo $a->getRealClassName();  // A
echo $b->getClassName();      // A
echo $b->getRealClassName();  // B
Alphayax
источник
1
Небольшая поправка: в первом примере Inspire::classэквивалентно "App \ Console \ Commands \ Inspire" без префикса обратной косой черты.
Джейсон
1
@FabienHaddadi: обратите внимание, что два обозначения use \App\...и use App\...разрешены. Я использую это, чтобы различать класс, содержащийся в подпространстве имен, и класс, содержащийся вне текущей иерархии пространства имен.
alphayax
Предупреждение: вы можете ввести что угодно и при этом получить имя «класса». Я мог бы ввести SomeDumbCrapThatDoesntExist :: class, и он не выдаст мне ошибку или предупреждение, если IDE не поймает его. Легко сделать опечатку и пропустить ее.
Габриэль Алак,
19

class является специальным, предоставляемым php для получения полного имени класса.

См. Http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name .

<?php

class foo {
    const test = 'foobar!';
}

echo foo::test; // print foobar!
xdazz
источник
Есть ли причина, по которой Laravel решил переключиться на него?
Yada
7
Это не постоянное значение для класса Inspire. Это константа, предоставляемая php. Это быстрый способ получить полное имя класса. php.net/manual/en/…
jfadich
1
@Yada Я считаю, что Laravel использует его потому, что у вас на одно место меньше для опечатки. Вы можете использовать строку '\ App \ Console \ Commands \ Inspire' или Inspire :: class, чтобы получить то же самое, но ваша IDE будет улавливать синтаксические / орфографические ошибки в последнем, что упрощает отладку.
jfadich
1

Если вам интересно, к какой категории ::classотносится (будь то языковая конструкция и т. Д.), Это очень просто. Это константа . PHP называет это «специальной константой». Он особенный, потому что предоставляется PHP.

https://www.php.net/manual/en/language.oop5.constants.php

Лукас Бустаманте
источник
0

Помните, что нужно использовать следующее:

if ($whatever instanceof static::class) {...}

Это вызовет синтаксическую ошибку:

unexpected 'class' (T_CLASS), expecting variable (T_VARIABLE) or '$'

Но вместо этого вы можете сделать следующее:

if ($whatever instanceof static) {...}

или

$class = static::class;
if ($whatever instanceof $class) {...}
Харальд Витт
источник
этот хак для динамического именования с php 5. * работает как$className = 'SomeCLass'; $className = new $className(); $methodName = 'someMethod'; $className->$methodName($arg1, $arg2, $arg3); /* or if args can be random array*/ call_user_func_array([$className, $methodName], $arg);
Владимир Ч