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.