:: class ใน PHP คืออะไร?


102

อะไรคือสิ่งที่::classสัญกรณ์ใน PHP?

การค้นหาโดย 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 จำนวนมากสามารถดึงชื่อคลาสเหล่านี้เมื่อคุณ refactor รหัสของคุณ
  • คุณสามารถใช้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: โปรดทราบว่าสองสัญกรณ์use \App\...และuse App\...ได้รับอนุญาต ฉันใช้สิ่งนี้เพื่อสร้างความแตกต่างระหว่างคลาสที่มีอยู่ในชื่อย่อยและคลาสที่อยู่นอกลำดับชั้นของเนมสเปซปัจจุบัน
alphayax

คำเตือนคุณสามารถพิมพ์อะไรก็ได้และยังคงได้รับชื่อ "คลาส" ฉันสามารถพิมพ์ SomeDumbCrapThatDoesntExist :: class และจะไม่ให้ข้อผิดพลาดหรือคำเตือนหาก IDE ไม่จับได้ พิมพ์ผิดและพลาดได้ง่าย
Gabriel Alack

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/th/…
jfadich

1
@ ญาดาฉันเชื่อว่าเหตุผลเบื้องหลังการใช้ Laravel คือมันช่วยให้คุณพิมพ์ผิดได้น้อยลง คุณสามารถใช้สตริง '\ App \ Console \ Commands \ Inspire' หรือ Inspire :: class เพื่อให้ได้สิ่งเดียวกัน แต่ IDE ของคุณจะตรวจจับข้อผิดพลาดทางไวยากรณ์ / การสะกดคำในภายหลังทำให้การดีบักง่ายขึ้นเล็กน้อย
jfadich

1

หากคุณสงสัยว่าอยู่ในหมวดหมู่::classใด (ไม่ว่าจะเป็นโครงสร้างภาษา ฯลฯ ) มันง่ายมาก มันคงที่ค่าคงที่PHP เรียกมันว่า "ค่าคงที่พิเศษ" เป็นพิเศษเพราะจัดทำโดย PHP

https://www.php.net/manual/en/language.oop5.constants.php


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.