PHPの::クラスとは


102

::classPHP の表記は何ですか?

構文の性質上、クイック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つの理由で非常に便利です。

  • クラス名を文字列に保存する必要はもうありません。したがって、コードをリファクタリングすると、多くのIDEがこれらのクラス名を取得できます
  • 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」と同等ですが、バックスラッシュプレフィックスはありません。
Jason

1
@FabienHaddadi:ノート2記法ことuse \App\...use App\...許可されています。これを使用して、サブネームスペースに含まれるクラスと現在のネームスペース階層の外部に含まれるクラスを区別します。
alphayax 2018年

警告の言葉、あなたは何かをタイプしてもまだ「クラス」名を得ることができます。SomeDumbCrapThatDoesntExist :: classと入力しても、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!

Laravelがそれに切り替えることにした理由はありますか?
矢田

7
これはInspireクラスの定数ではありません。これは、phpによって提供される定数です。これは、完全修飾クラス名を取得する簡単な方法です。php.net/manual/en/...
jfadich

1
@矢田Laravelを使用する理由は、タイプミスをする場所が1つ少なくなることだと思います。文字列 '\ App \ Console \ Commands \ Inspire'またはInspire :: classを使用して同じものを取得できますが、IDEは後者の構文/スペルエラーをキャッチし、デバッグが少し簡単になります。
jfadich 2015年


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.