:: class trong PHP là gì?


102

Là gì ::classký hiệu trong PHP?

Một tìm kiếm nhanh trên Google không trả lại kết quả nào vì bản chất của cú pháp.

lớp dấu hai chấm

Lợi ích của việc sử dụng ký hiệu này là gì?

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

Câu trả lời:


87

Tính năng này đã được triển khai trong PHP 5.5.

Tài liệu: http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name

Nó rất hữu ích vì 2 lý do.

  • Bạn không phải lưu trữ tên lớp của mình trong chuỗi nữa. Vì vậy, nhiều IDE có thể truy xuất các tên lớp này khi bạn cấu trúc lại mã của mình
  • Bạn có thể sử dụng usetừ khóa để giải quyết lớp của mình và bạn không cần phải viết tên lớp đầy đủ.

Ví dụ như :

use \App\Console\Commands\Inspire;

//...

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

Cập nhật :

Tính năng này cũng hữu ích cho việc kết thúc tĩnh muộn .

Thay vì sử dụng __CLASS__hằng số ma thuật, bạn có thể sử dụng static::classtính năng này để lấy tên của lớp dẫn xuất bên trong lớp cha. Ví dụ:

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
Sửa một chút: trong ví dụ đầu tiên, Inspire::classtương đương với "App \ Console \ Commands \ Inspire", không có tiền tố gạch chéo ngược.
Jason

1
@FabienHaddadi: lưu ý rằng hai ký hiệu use \App\...use App\...được phép. Tôi sử dụng điều đó để tạo sự khác biệt giữa một lớp được chứa trong một không gian tên con và một lớp được chứa bên ngoài hệ thống phân cấp không gian tên hiện tại.
alphayax

Một lời cảnh báo, bạn có thể gõ bất cứ thứ gì mà vẫn nhận được tên "lớp". Tôi có thể nhập lớp SomeDumbCrapThatDoesntExist :: và nó sẽ không cung cấp cho tôi lỗi hoặc cảnh báo nếu IDE không bắt được. Dễ mắc lỗi đánh máy và bỏ sót.
Gabriel Alack

19

class là đặc biệt, được cung cấp bởi php để có được tên lớp đủ điều kiện.

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

Có lý do gì khiến Laravel quyết định chuyển sang nó không?
Yada

7
Nó không phải là một hằng số trên lớp Inspire. Nó là một hằng số được cung cấp bởi php. Đó là một cách nhanh chóng để có được tên lớp đủ điều kiện. php.net/manual/en/...
jfadich

1
@Yada Tôi tin rằng lý do đằng sau việc sử dụng Laravel là nó giúp bạn bớt mắc lỗi chính tả hơn. Bạn có thể sử dụng chuỗi '\ App \ Console \ Commands \ Inspire' hoặc lớp Inspire :: để có được điều tương tự, nhưng IDE của bạn sẽ bắt lỗi cú pháp / chính tả ở sau đó, khiến việc gỡ lỗi dễ dàng hơn một chút.
jfadich


0

Hãy lưu ý để sử dụng những điều sau:

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

Điều này sẽ tạo ra một lỗi cú pháp:

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

Nhưng bạn có thể làm như sau:

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

hoặc là

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

hack này cho đặt tên động, từ php 5. * hoạt động như$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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.