อะไรคือสิ่งที่::class
สัญกรณ์ใน PHP?
การค้นหาโดย Google อย่างรวดเร็วไม่ให้ผลตอบแทนใด ๆ เนื่องจากลักษณะของไวยากรณ์
ชั้นลำไส้ใหญ่
ข้อดีของการใช้สัญกรณ์นี้คืออะไร?
protected $commands = [
\App\Console\Commands\Inspire::class,
];
อะไรคือสิ่งที่::class
สัญกรณ์ใน PHP?
การค้นหาโดย Google อย่างรวดเร็วไม่ให้ผลตอบแทนใด ๆ เนื่องจากลักษณะของไวยากรณ์
ชั้นลำไส้ใหญ่
ข้อดีของการใช้สัญกรณ์นี้คืออะไร?
protected $commands = [
\App\Console\Commands\Inspire::class,
];
คำตอบ:
คุณลักษณะนี้ถูกนำไปใช้ใน PHP 5.5
เอกสารประกอบ: http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name
มีประโยชน์มากสำหรับ 2 เหตุผล
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
use \App\...
และuse App\...
ได้รับอนุญาต ฉันใช้สิ่งนี้เพื่อสร้างความแตกต่างระหว่างคลาสที่มีอยู่ในชื่อย่อยและคลาสที่อยู่นอกลำดับชั้นของเนมสเปซปัจจุบัน
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!
หากคุณสงสัยว่าอยู่ในหมวดหมู่::class
ใด (ไม่ว่าจะเป็นโครงสร้างภาษา ฯลฯ ) มันง่ายมาก มันคงที่ค่าคงที่PHP เรียกมันว่า "ค่าคงที่พิเศษ" เป็นพิเศษเพราะจัดทำโดย PHP
โปรดระวังการใช้สิ่งต่อไปนี้:
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) {...}
$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);
Inspire::class
เทียบเท่ากับ "App \ Console \ Commands \ Inspire" โดยไม่มีคำนำหน้าเครื่องหมายทับย้อนกลับ