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,
];

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

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!

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) {...}

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.