Що таке :: клас у 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

Це дуже корисно з 2 причин.

  • Вам більше не потрібно зберігати назви класів у рядках. Отже, багато ідентифікаторів можуть отримати ці імена класів, коли ви перетворюєте код
  • Ви можете використовувати 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

1
Невелика корекція: у першому прикладі Inspire::classеквівалентно "App \ Console \ Commands \ Inspire", без префіксу зворотньої косої риски.
Джейсон

1
@FabienHaddadi: зауважте, що два позначення use \App\...та use App\...дозволені. Я використовую це, щоб зробити різницю між класом, що міститься в просторі імен, і класом, що міститься за межами поточної ієрархії простору імен.
альфаякс

Слово попередження, ви можете набрати що завгодно, і все одно отримаєте назву "клас". Я міг би набрати SomeDumbCrapThatDoesntExist :: клас, і він не видасть мені помилки чи попередження, якщо 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!

Чи є причина, чому Ларавель вирішив перейти на це?
Яда

7
Це не константа для класу Inspire. Це константа, що надається php. Це швидкий спосіб отримати повноцінне ім’я класу. php.net/manual/en/…
jfadich

1
@Yada Я вважаю, що аргументація Laravel за його використанням полягає в тому, що це дає вам менше місця для друку. Ви можете використовувати рядок "\ App \ Console \ Commands \ Inspire" або Inspire ::, щоб отримати одне і те ж, але ваш IDE виявить синтаксис / орфографічні помилки для останнього, що полегшує налагодження.
jfadich


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);
Vladimir Ch
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.