PHP'de :: class nedir?


102

::classPHP'deki gösterim nedir ?

Hızlı bir Google araması, söz diziminin doğası nedeniyle hiçbir şey döndürmez.

kolon kolon sınıfı

Bu gösterimi kullanmanın avantajı nedir?

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

Yanıtlar:


87

Bu özellik PHP 5.5'te uygulanmıştır.

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

2 nedenden dolayı çok kullanışlıdır.

  • Artık sınıf adlarınızı dizelerde saklamanıza gerek yok. Dolayısıyla, kodunuzu yeniden düzenlediğinizde birçok IDE bu sınıf adlarını alabilir
  • useSınıfınızı çözmek için anahtar kelimeyi kullanabilirsiniz ve tam sınıf adını yazmanız gerekmez.

Örneğin :

use \App\Console\Commands\Inspire;

//...

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

Güncelleme :

Bu özellik, Geç Statik Bağlama için de kullanışlıdır .

__CLASS__Sihirli sabiti kullanmak yerine static::class, ana sınıfın içindeki türetilmiş sınıfın adını almak için özelliği kullanabilirsiniz . Örneğin:

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
Küçük bir düzeltme: İlk örnekte, Inspire::classters eğik çizgi öneki olmadan "App \ Console \ Commands \ Inspire" ile eşdeğerdir.
Jason

1
@FabienHaddadi: iki gösterime use \App\...ve use App\...izin verildiğine dikkat edin . Bunu, bir alt ad alanında bulunan bir sınıf ile mevcut ad alanı hiyerarşisinin dışında bulunan bir sınıf arasında fark yaratmak için kullanıyorum.
alphayax

Bir uyarı kelimesi, her şeyi yazabilir ve yine de bir "sınıf" adı alabilirsiniz. SomeDumbCrapThatDoesntExist :: class yazabilirim ve IDE onu yakalamazsa bana bir hata veya uyarı vermez. Yazım hatası yapmak ve onu kaçırmak kolaydır.
Gabriel Alack

19

class tam nitelikli sınıf adını almak için php tarafından sağlanan özeldir.

Bkz 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!

Laravel'in buna geçmeye karar vermesinin bir nedeni var mı?
Yada

7
Inspire sınıfında sabit değildir. Php tarafından sağlanan bir sabittir. Tam nitelikli sınıf adını almanın hızlı bir yoludur. php.net/manual/en/…
jfadich

1
@Yada Laravel'in bunu kullanmasının ardındaki mantığın, size bir yazım hatası yapmak için daha az yer vermesi olduğuna inanıyorum. Aynı şeyi elde etmek için '\ App \ Console \ Commands \ Inspire' veya Inspire :: class dizesini kullanabilirsiniz, ancak IDE'niz ikincisindeki sözdizimi / yazım hatalarını yakalayarak hata ayıklamayı biraz kolaylaştırır.
jfadich


0

Lütfen aşağıdakileri kullanmaya dikkat edin:

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

Bu bir sözdizimi hatası verir:

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

Ancak bunun yerine aşağıdakileri yapabilirsiniz:

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

veya

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

php 5'ten dinamik adlandırma için yapılan bu hack * şu şekilde çalışır$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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.