Apa itu :: class di PHP?

102

Apa ::classnotasi di PHP?

Pencarian Google cepat tidak menghasilkan apa-apa karena sifat sintaksnya.

kelas usus besar

Apa keuntungan menggunakan notasi ini?

protected $commands = [
    \App\Console\Commands\Inspire::class,
];
Yada
sumber

Jawaban:

87

Fitur ini diimplementasikan di PHP 5.5.

Dokumentasi: http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name

Ini sangat berguna karena 2 alasan.

  • Anda tidak perlu lagi menyimpan nama kelas Anda dalam string. Jadi, banyak IDE dapat mengambil nama kelas ini saat Anda memfaktor ulang kode Anda
  • Anda dapat menggunakan usekata kunci untuk menyelesaikan kelas Anda dan Anda tidak perlu menulis nama kelas secara lengkap.

Sebagai contoh :

use \App\Console\Commands\Inspire;

//...

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

Update :

Fitur ini juga berguna untuk Late Static Binding .

Alih-alih menggunakan __CLASS__konstanta ajaib, Anda bisa menggunakan static::classfitur tersebut untuk mendapatkan nama kelas turunan di dalam kelas induk. Sebagai contoh:

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.dll
sumber
1
Sedikit koreksi: pada contoh pertama, Inspire::classsama dengan "App \ Console \ Commands \ Inspire", tanpa awalan garis miring ke belakang.
Jason
1
@FabienHaddadi: perhatikan bahwa dua notasi use \App\...dan use App\...diperbolehkan. Saya menggunakannya untuk membuat perbedaan antara kelas yang terdapat dalam subnamespace dan kelas yang berada di luar hierarki namespace saat ini.
alphayax
Sebuah kata peringatan, Anda dapat mengetik apa saja dan tetap mendapatkan nama "kelas". Saya bisa mengetik SomeDumbCrapThatDoesntExist :: class dan tidak akan memberi saya kesalahan atau peringatan jika IDE tidak menangkapnya. Mudah salah ketik dan ketinggalan.
Gabriel Alack
19

class adalah spesial, yang disediakan oleh php untuk mendapatkan nama kelas yang memenuhi syarat.

Lihat 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
sumber
Apakah ada alasan mengapa Laravel memutuskan untuk beralih ke sana?
Yada
7
Ini bukan konstanta di kelas Inspire. Ini adalah konstanta yang disediakan oleh php. Ini adalah cara cepat untuk mendapatkan nama kelas yang sepenuhnya memenuhi syarat. php.net/manual/en/…
jfadich
1
@Yada Saya yakin alasan di balik penggunaan Laravel adalah karena Laravel mengurangi satu tempat untuk membuat kesalahan ketik. Anda dapat menggunakan string '\ App \ Console \ Commands \ Inspire' atau Inspire :: class untuk mendapatkan hal yang sama, tetapi IDE Anda akan menangkap kesalahan sintaks / ejaan yang terakhir membuatnya sedikit lebih mudah untuk di-debug.
jfadich
0

Harap perhatikan untuk menggunakan yang berikut ini:

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

Ini akan memunculkan kesalahan sintaks:

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

Namun Anda dapat melakukan hal berikut:

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

atau

$class = static::class;
if ($whatever instanceof $class) {...}
Harald Witt
sumber
hack ini untuk penamaan dinamis, dari php 5. * berfungsi seperti$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