Tham khảo - Biểu tượng này có ý nghĩa gì trong PHP?


4478

Cái này là cái gì?

Đây là một tập hợp các câu hỏi xuất hiện mọi lúc và sau đó về cú pháp trong PHP. Đây cũng là một Wiki cộng đồng, vì vậy mọi người đều được mời tham gia để duy trì danh sách này.

Tại sao lại thế này?

Trước đây, rất khó để tìm câu hỏi về toán tử và các mã thông báo cú pháp khác
. Ý tưởng chính là có các liên kết đến các câu hỏi hiện có trên Stack Overflow, vì vậy chúng tôi dễ dàng tham khảo chúng hơn, không sao chép nội dung từ Hướng dẫn PHP.

Lưu ý: Kể từ tháng 1 năm 2013, Stack Overflow không hỗ trợ các ký tự đặc biệt . Chỉ cần bao quanh các cụm từ tìm kiếm bằng dấu ngoặc kép, vd[php] "==" vs "==="

Tôi nên làm gì ở đây?

Nếu bạn đã bị ai đó chỉ vào đây vì bạn đã hỏi một câu hỏi như vậy, vui lòng tìm cú pháp cụ thể bên dưới. Các trang được liên kết với hướng dẫn PHP cùng với các câu hỏi được liên kết có thể sẽ trả lời câu hỏi của bạn sau đó. Nếu vậy, bạn được khuyến khích nâng cao câu trả lời. Danh sách này không có nghĩa là một sự thay thế cho sự giúp đỡ mà người khác cung cấp.

Danh sách

Nếu mã thông báo cụ thể của bạn không được liệt kê bên dưới, bạn có thể tìm thấy nó trong Danh sách mã phân tích cú pháp .


& Toán tử bitwise hoặc tài liệu tham khảo


=& Người giới thiệu


&= Toán tử bitwise


&& Toán tử logic


% Toán tử số học


!! Toán tử logic


@ Toán tử kiểm soát lỗi


?: Toán tử Ternary


?? Toán tử hợp nhất Null (kể từ PHP 7)


?string ?int ?array ?bool ?float Khai báo kiểu trả về Nullable (kể từ PHP 7.1)


: Cú pháp thay thế cho các cấu trúc điều khiển , Toán tử Ternary


:: Toán tử giải quyết phạm vi


\ Không gian tên


-> Lớp học và đối tượng


=> Mảng


^ Toán tử bitwise


>> Toán tử bitwise


<< Toán tử bitwise


<<< Di truyền hoặc Nowdoc


= Toán tử chuyển nhượng


== Toán tử so sánh


=== Toán tử so sánh


!== Toán tử so sánh


!= Toán tử so sánh


<> Toán tử so sánh


<=> Toán tử so sánh (kể từ PHP 7.0)


| Toán tử bitwise


|| Toán tử logic


~ Toán tử bitwise


+ Toán tử số học , toán tử mảng


+=-= Người vận hành chuyển nhượng


++và các -- toán tử tăng / giảm


.= Toán tử chuyển nhượng


. Toán tử chuỗi


, Đối số chức năng

, Tuyên bố biến


$$ Biến số biến


` Toán tử thực thi


<?= Thẻ mở ngắn


[] Mảng (cú pháp ngắn kể từ PHP 5.4)


<? Mở và đóng thẻ


... Giải nén đối số (kể từ PHP 5.6)


** Số mũ (kể từ PHP 5.6)


# Nhận xét kiểu vỏ một dòng


:? Các loại trả lại không có giá trị


?-> Các cuộc gọi của nhà khai thác NullSafe



36
Tôi biết điều này không hoàn toàn là PHP, nhưng bao gồm một liên kết đến phpdoc.org cho cú pháp nhận xét phpDocumentor, thường được sử dụng và cũng không thể tìm kiếm /**?
Mike

8
Tôi có thể đề nghị khung vuông và khung xoăn?
ajreal

124
Tôi cũng gặp phải vấn đề này rất nhiều (không thể tìm kiếm các ký tự đặc biệt), đó là lý do tại sao tôi tạo ra SymbolHound , một công cụ tìm kiếm không bỏ qua các ký tự đặc biệt. Tôi cũng đã đăng nó trên StackApps .
dncrane

1
Vâng, từ tiêu đề Tại sao lại thế này? , Tôi đoán đó là vì "Ý tưởng chính là có liên kết đến các câu hỏi hiện có trên Stack Overflow, vì vậy chúng tôi dễ dàng tham khảo chúng hơn".
Herbert

3
Một câu hỏi đã được hỏi ngày hôm nay (20/11/15) stackoverflow.com/questions/33833259/what-is-rscat-in-php hỏi "$ rsCat trong php" là gì (nếu câu hỏi đó vẫn được hiển thị và không bị xóa) . Thật kỳ lạ, không có tài liệu tham khảo về $biến, mà chỉ về $$Biến biến. Tôi tin rằng nên được sửa đổi ở đâu đó.
Funk Bốn mươi Niner

Câu trả lời:


1172

Toán tử tăng / giảm

++ toán tử gia tăng

-- toán tử giảm

Example    Name              Effect
---------------------------------------------------------------------
++$a       Pre-increment     Increments $a by one, then returns $a.
$a++       Post-increment    Returns $a, then increments $a by one.
--$a       Pre-decrement     Decrements $a by one, then returns $a.
$a--       Post-decrement    Returns $a, then decrements $a by one.

Chúng có thể đi trước hoặc sau biến.

Nếu đặt trước biến, thao tác tăng / giảm được thực hiện cho biến trước sau đó kết quả được trả về. Nếu đặt sau biến, biến đầu tiên được trả về, sau đó thao tác tăng / giảm được thực hiện.

Ví dụ:

$apples = 10;
for ($i = 0; $i < 10; ++$i) {
    echo 'I have ' . $apples-- . " apples. I just ate one.\n";
}

Ví dụ sống

Trong trường hợp trên ++$iđược sử dụng, vì nó nhanh hơn. $i++sẽ có kết quả tương tự.

Gia tăng trước nhanh hơn một chút vì nó thực sự tăng biến và sau đó 'trả về' kết quả. Gia tăng sau tạo một biến đặc biệt, sao chép giá trị của biến đầu tiên và chỉ sau khi biến đầu tiên được sử dụng, thay thế giá trị của nó bằng biến thứ hai.

Tuy nhiên, bạn phải sử dụng $apples--, vì trước tiên, bạn muốn hiển thị số táo hiện tại và sau đó bạn muốn trừ đi một quả từ nó.

Bạn cũng có thể tăng các chữ cái trong PHP:

$i = "a";
while ($i < "c") {
    echo $i++;
}

Một khi zđạt aađược là tiếp theo, và như vậy.

Lưu ý rằng các biến ký tự có thể được tăng nhưng không giảm và thậm chí chỉ có các ký tự ASCII đơn giản (az và AZ) được hỗ trợ.


Bài viết chồng chéo:


9
+1 cho lưu ý rằng bộ giảm tốc không hoạt động trên các ký tự, chỉ trên các số
Mark Baker

163
Vì lợi ích của mọi người, vui lòng xóa thông tin in đậm về việc tăng trước cực kỳ nhanh hơn. Đây là ví dụ tồi tệ nhất tuyệt đối về tối ưu hóa sớm và loại thông tin này không nên có trong đầu mọi người nếu họ mới bắt đầu học PHP.
Lotus Notes

14
@Lotus - Tôi coi đó là một sự thật thú vị. Nếu bạn là người mới bắt đầu sử dụng PHP, hoặc C ++, v.v., có vẻ khá kỳ quặc khi ++ i và i ++ đủ khác nhau để hoạt động ở các tốc độ khác nhau. Tôi thấy nó thật hấp dẫn.
Peter Ajtai

12
@Peter Ajtai Vâng, điều đó thật thú vị, nhưng từ cách bạn cấu trúc bài đăng của mình, bạn làm cho nó có vẻ như là một trong những sự kiện chính của PHP rất quan trọng đối với việc sử dụng ngôn ngữ.
Lotus Notes

4
Không chắc đó có phải là tôi hay không, nhưng ví dụ táo có vẻ hơi sai lệch. 'Tôi có 10 quả táo. Tôi chỉ ăn một quả 'khiến tôi tin rằng bạn có 11 quả táo, nhưng bây giờ bạn có 10 quả vì bạn chỉ ăn một quả chứ không phải bạn ăn một quả sau khi nói bạn có 10 quả, do đó, bạn có 9 quả - đó là điều mà mật mã đang ám chỉ.
さ り げ

440

Toán tử bitwise

Một chút là gì? Một bit là đại diện của 1 hoặc 0. Về cơ bản TẮT (0) và BẬT (1)

Một byte là gì? Một byte được tạo thành từ 8 bit và giá trị cao nhất của một byte là 255, có nghĩa là mọi bit được đặt. Chúng ta sẽ xem xét tại sao giá trị tối đa của một byte là 255.

-------------------------------------------
|      1 Byte ( 8 bits )                  |
-------------------------------------------
|Place Value | 128| 64| 32| 16| 8| 4| 2| 1|     
-------------------------------------------

Đại diện này của 1 Byte

1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255 (1 byte)

Một vài ví dụ để hiểu rõ hơn

Toán tử "VÀ": &

$a =  9;
$b = 10;
echo $a & $b;

Điều này sẽ xuất số 8. Tại sao? Vâng, hãy xem sử dụng ví dụ bảng của chúng tôi.

-------------------------------------------
|      1 Byte ( 8 bits )                  |
-------------------------------------------
|Place Value | 128| 64| 32| 16| 8| 4| 2| 1|     
-------------------------------------------
|      $a    |   0|  0|  0|  0| 1| 0| 0| 1|    
-------------------------------------------
|      $b    |   0|  0|  0|  0| 1| 0| 1| 0|
------------------------------------------- 
|      &     |   0|  0|  0|  0| 1| 0| 0| 0|
------------------------------------------- 

Vì vậy, bạn có thể thấy từ bảng, bit duy nhất họ chia sẻ với nhau là 8 bit.

Ví dụ thứ hai

$a =  36;
$b = 103;
echo $a & $b; // This would output the number 36.
$a = 00100100
$b = 01100111

Hai bit được chia sẻ là 32 và 4, khi cộng lại sẽ trả về 36.

Toán tử "Hoặc": |

$a =  9;
$b = 10;
echo $a | $b;

Điều này sẽ xuất số 11. Tại sao?

-------------------------------------------
|      1 Byte ( 8 bits )                  |
-------------------------------------------
|Place Value | 128| 64| 32| 16| 8| 4| 2| 1|     
-------------------------------------------
|      $a    |   0|  0|  0|  0| 1| 0| 0| 1|    
-------------------------------------------
|      $b    |   0|  0|  0|  0| 1| 0| 1| 0|
------------------------------------------- 
|      |     |   0|  0|  0|  0| 1| 0| 1| 1|
-------------------------------------------

Bạn sẽ nhận thấy rằng chúng ta có 3 bit được đặt trong các cột 8, 2 và 1. Thêm chúng lên: 8 + 2 + 1 = 11.


6
Nếu $ a lấy giá trị lớn hơn 255 thì sao?
Aycan Yaşıt

@ AycanYaşıt Hầu hết hệ điều hành đang sử dụng hệ thống 32 bit và 64 bit, điều đó có nghĩa là giới hạn lớn hơn 255 (8 bit).
AlbertSamuel

@ AycanYaşıt Trên thực tế, biểu diễn ở đây với độ dài một byte thậm chí không chính xác, vì ngay cả số nguyên nhỏ nhất vẫn là 64 bit (8 byte) trong bộ nhớ trên nền tảng 64 bit hiện đại.
Kaii

Tại sao and &0 0 0 0 1 0 0 0or |0 0 0 0 1 0 1 1?
Vir

285

<=> Nhà điều hành tàu vũ trụ

Đã thêm vào PHP 7

Các nhà điều hành tàu vũ trụ <=> là toán tử so sánh mới nhất được thêm vào trong PHP 7. Đó là một phi kết hợp điều hành nhị phân với độ ưu tiên tương tự như các nhà khai thác bình đẳng ( ==, !=, ===, !==). Toán tử này cho phép so sánh ba chiều đơn giản hơn giữa các toán hạng tay trái và tay phải.

Toán tử dẫn đến một biểu thức nguyên của:

  • 0 khi cả hai toán hạng đều bằng nhau
  • Ít hơn 0khi toán hạng bên trái nhỏ hơn toán hạng bên phải
  • Lớn hơn 0khi toán hạng bên trái lớn hơn toán hạng bên phải

ví dụ

1 <=> 1; // 0
1 <=> 2; // -1
2 <=> 1; // 1

Một ứng dụng thực tế tốt khi sử dụng toán tử này sẽ là trong các cuộc gọi lại loại so sánh dự kiến ​​sẽ trả về một số nguyên 0, âm hoặc dương dựa trên so sánh ba chiều giữa hai giá trị. Hàm so sánh được truyền vào usortlà một ví dụ như vậy.

Trước PHP 7 bạn sẽ viết ...

$arr = [4,2,1,3];

usort($arr, function ($a, $b) {
    if ($a < $b) {
        return -1;
    } elseif ($a > $b) {
        return 1;
    } else {
        return 0;
    }
});

Vì PHP 7 bạn có thể viết ...

$arr = [4,2,1,3];

usort($arr, function ($a, $b) {
    return $a <=> $b;
});

21
Bạn không chắc chắn như thế nào $a <=> $blà khác nhau để$a - $b
rev

38
@AcidShout $a - $bhoạt động cho các số, nhưng không phải là chuỗi, đối tượng hoặc mảng.
mcrumley

44
@mcrumley Không, nó còn tệ hơn thế. Nói chung $a - $bthậm chí không làm việc cho các số; nó chỉ hoạt động cho số nguyên . Nó không hoạt động đối với các số không nguyên, bởi vì usortcác giá trị trả về của hàm so sánh của bạn thành int, có nghĩa là 0,5 được chuyển thành 0, có nghĩa là hai số có chênh lệch nhỏ hơn 1, chẳng hạn như 4 và 4.6, có thể (tùy thuộc theo đó một đối số được truyền làm đối số đầu tiên cho hàm so sánh của bạn) so sánh không chính xác như nhau.
Đánh dấu Amery

5
@MarkAmery hướng dẫn di chuyển không phải là hành vi được ghi lại của toán tử. Vì bạn muốn xem phần toán tử ngôn ngữ trong hướng dẫn sử dụng cho php.net/lingu.operators.comparison hành vi thực tế đằng sau điều này phụ thuộc vào các hàm so sánh khác nhau của API, như khi bạn thực hiện strcmp cho chuỗi, trong đó bạn không thể đảm bảo giá trị trả lại thực tế trong mọi trường hợp. Chắc chắn, hầu như luôn luôn là 1, 0 hoặc -1, nhưng đối với những trường hợp bạn không thể đảm bảo nó như trong việc gói strcmp của libc, bạn đưa ra hành vi được xác định tương tự như thông số cơ bản để an toàn
Sherif

9
@MarkAmery Điểm ở đây là không cho phép mọi người dựa vào hành vi không xác định. Đối với một trường hợp khi ai đó nhận được giá trị không chính xác là 1, 0 hoặc -1, bạn sẽ có người nộp báo cáo lỗi vì nghĩ rằng có điều gì đó không đúng trong ngôn ngữ. Đó là lý do tại sao chúng tôi chứng minh rằng tất cả những gì chúng tôi có thể đảm bảo là giá trị đó sẽ nhỏ hơn , lớn hơn hoặc bằng 0 và không nhất thiết là 1, 0 và -1.
Sherif


273
Syntax    Name             Description

x == y    Equality         True if x and y have the same key/value pairs
x != y    Inequality       True if x is not equal to y
x === y   Identity         True if x and y have the same key/value pairs
                            in the same order and of the same types
x !== y   Non-identity     True if x is not identical to y
++ x      Pre-increment    Increments x by one, then returns x
x ++      Post-increment   Returns x, then increments x by one
-- x      Pre-decrement    Decrements x by one, then returns x
x --      Post-decrement   Returns x, then decrements x by one
x and y   And              True if both x and y are true x=6 y=3
                           (x < 10 and y > 1) returns true 
x && y    And              True if both x and y are true x=6 y=3
                           (x < 10 && y > 1) returns true
x or y     Or              True if any of x or y are true x=6 y=3
                           (x < 10 or y > 10) returns true 
x || y     Or              True if any of x or y are true x=6 y=3
                           (x < 3 || y > 1) returns true
a . b     Concatenation    Concatenate two strings: "Hi" . "Ha"

239

Các hằng số ma thuật : Mặc dù đây không chỉ là biểu tượng mà là một phần quan trọng của gia đình mã thông báo này. Có tám hằng số ma thuật thay đổi tùy thuộc vào nơi chúng được sử dụng.

__LINE__: Số dòng hiện tại của tệp.

__FILE__: Đường dẫn đầy đủ và tên tệp của tệp. Nếu được sử dụng bên trong bao gồm, tên của tệp được bao gồm sẽ được trả về. Kể từ PHP 4.0.2, __FILE__luôn chứa một đường dẫn tuyệt đối với các liên kết tượng trưng được giải quyết trong khi trong các phiên bản cũ hơn, nó chứa đường dẫn tương đối trong một số trường hợp.

__DIR__: Thư mục của tập tin. Nếu được sử dụng bên trong bao gồm, thư mục của tệp được bao gồm sẽ được trả về. Điều này tương đương với dirname(__FILE__). Tên thư mục này không có dấu gạch chéo trừ khi nó là thư mục gốc. (Đã thêm vào PHP 5.3.0.)

__FUNCTION__: Tên hàm. (Đã thêm vào PHP 4.3.0) Kể từ PHP 5, hằng số này trả về tên hàm như được khai báo (phân biệt chữ hoa chữ thường). Trong PHP 4, giá trị của nó luôn luôn được hạ thấp.

__CLASS__: Tên lớp. (Đã thêm vào PHP 4.3.0) Kể từ PHP 5, hằng số này trả về tên lớp như được khai báo (phân biệt chữ hoa chữ thường). Trong PHP 4, giá trị của nó luôn luôn được hạ thấp. Tên lớp bao gồm không gian tên được khai báo (ví dụ Foo\Bar). Lưu ý rằng kể từ PHP 5.4 __CLASS__cũng hoạt động trong các đặc điểm. Khi được sử dụng trong một phương pháp đặc điểm,__CLASS__ là tên của lớp mà đặc điểm được sử dụng trong.

__TRAIT__: Tên tính trạng. (Đã thêm vào PHP 5.4.0) Kể từ PHP 5.4, hằng số này trả về đặc điểm như được khai báo (phân biệt chữ hoa chữ thường). Tên đặc điểm bao gồm không gian tên được khai báo (ví dụ:Foo\Bar ).

__METHOD__: Tên phương thức lớp. (Đã thêm trong PHP 5.0.0) Tên phương thức được trả về như được khai báo (phân biệt chữ hoa chữ thường).

__NAMESPACE__: Tên của không gian tên hiện tại (phân biệt chữ hoa chữ thường). Hằng số này được định nghĩa theo thời gian biên dịch (Đã thêm vào PHP 5.3.0).

Nguồn


150

Toán tử loại

instanceof được sử dụng để xác định xem một biến PHP có phải là một đối tượng khởi tạo của một lớp nhất định hay không.

<?php
class mclass { }
class sclass { }
$a = new mclass;
var_dump($a instanceof mclass);
var_dump($a instanceof sclass);

Ví dụ trên sẽ xuất ra:

bool(true)
bool(false)

Lý do: Ví dụ trên $alà một đối tượng mclassvì vậy chỉ sử dụng một mclassdữ liệu không phải là thể hiện củasclass

Ví dụ với thừa kế

<?php 
class pclass { } 
class childclass extends pclass { } 
$a = new childclass; 
var_dump($a instanceof childclass); 
var_dump($a instanceof pclass);

Ví dụ trên sẽ xuất ra:

bool(true)
bool(true)

Ví dụ với bản sao

<?php 
class cloneable { } 
$a = new cloneable;
$b = clone $a; 
var_dump($a instanceof cloneable); 
var_dump($b instanceof cloneable);

Ví dụ trên sẽ xuất ra:

bool(true)
bool(true)

7
Ở trên cũng hoạt động với 'giao diện'. Điều này rất hữu ích để kiểm tra rằng một giao diện cụ thể có sẵn.
Ryan Vincent

133

Tổng quan về các toán tử trong PHP :


Toán tử logic:

  • $ a && $ b: TRUE nếu cả $ a và $ b đều TRUE.
  • $ a | | $ b: TRUE nếu $ a hoặc $ b là TRUE.
  • $ a xor $ b: TRUE nếu $ a hoặc $ b là TRUE, nhưng không phải cả hai.
  • ! $ a: TRUE nếu $ a không TRUE.
  • $ a và $ b: TRUE nếu cả $ a và $ b là TRUE.
  • $ a hoặc $ b: TRUE nếu $ a hoặc $ b là TRUE.

Toán tử so sánh:

  • $ a == $ b: TRUE nếu $ a bằng $ b sau khi tung hứng.
  • $ a === $ b: TRUE nếu $ a bằng $ b và chúng cùng loại.
  • $ a! = $ b: TRUE nếu $ a không bằng $ b sau khi tung hứng.
  • $ a <> $ b: TRUE nếu $ a không bằng $ b sau khi tung hứng.
  • $ a! == $ b: TRUE nếu $ a không bằng $ b hoặc chúng không cùng loại.
  • $ a <$ b : TRUE nếu $ a hoàn toàn nhỏ hơn $ b.
  • $ a> $ b : TRUE nếu $ a hoàn toàn lớn hơn $ b.
  • $ a <= $ b : TRUE nếu $ a nhỏ hơn hoặc bằng $ b.
  • $ a> = $ b : TRUE nếu $ a lớn hơn hoặc bằng $ b.
  • $ a <=> $ b : Một số nguyên nhỏ hơn, bằng hoặc lớn hơn 0 khi $ a tương ứng nhỏ hơn, bằng hoặc lớn hơn $ b. Có sẵn như PHP 7.
  • $ a? $ b: $ c : nếu $ a return $ b khác trả về $ c ( toán tử ternary )
  • $ a ?? $ c : Tương tự như $ a? $ a: $ c ( toán tử hợp nhất null - yêu cầu PHP> = 7)

Toán tử số học:

  • - $ a : Đối diện với $ a.
  • $ a + $ b : Tổng của $ a và $ b.
  • $ a - $ b : Chênh lệch $ a và $ b.
  • $ a * $ b : Sản phẩm của $ a và $ b.
  • $ a / $ b : Đơn vị của $ a và $ b.
  • $ a% $ b : Phần còn lại của $ a chia cho $ b.
  • $ a ** $ b : Kết quả của việc tăng $ a lên sức mạnh $ b'th (được giới thiệu trong PHP 5.6)

Toán tử tăng / giảm:

  • ++ $ a : Tăng $ a một, sau đó trả về $ a.
  • $ a ++ : Trả về $ a, sau đó tăng $ a lên một.
  • - $ a : Giảm $ a một, sau đó trả về $ a.
  • $ a-- : Trả về $ a, sau đó giảm $ a một.

Toán tử bitwise:

  • $ a & $ b : Các bit được đặt ở cả $ a và $ b được đặt.
  • $ a | $ b : Các bit được đặt bằng $ a hoặc $ b được đặt.
  • $ a ^ $ b : Các bit được đặt thành $ a hoặc $ b nhưng không phải cả hai đều được đặt.
  • ~ $ a : Các bit được đặt thành $ a không được đặt và ngược lại.
  • $ a << $ b : Chuyển các bit của $ a $ b bước sang trái (mỗi bước có nghĩa là "nhân với hai")
  • $ a >> $ b : Chuyển các bit của $ a $ b bước sang phải (mỗi bước có nghĩa là "chia cho hai")

Toán tử chuỗi:

  • $ a. $ b : Ghép $ a và $ b.

Toán tử mảng:

  • $ a + $ b : Liên minh của $ a và $ b.
  • $ a == $ b : TRUE nếu $ a và $ b có cùng cặp khóa / giá trị.
  • $ a === $ b : TRUE nếu $ a và $ b có cùng cặp khóa / giá trị theo cùng một thứ tự và cùng loại.
  • $ a! = $ b : TRUE nếu $ a không bằng $ b.
  • $ a <> $ b : TRUE nếu $ a không bằng $ b.
  • $ a! == $ b : TRUE nếu $ a không giống với $ b.

Toán tử chuyển nhượng:

  • $ a = $ b : Giá trị của $ b được gán cho $ a
  • $ a + = $ b : Tương tự $ a = $ a + $ b
  • $ a - = $ b : Tương tự $ a = $ a - $ b
  • $ a * = $ b : Tương tự $ a = $ a * $ b
  • $ a / = $ b : Tương tự $ a = $ a / $ b
  • $ a% = $ b : Tương tự $ a = $ a% $ b
  • $ a ** = $ b : Tương tự $ a = $ a ** $ b
  • $ a. = $ b : Tương tự $ a = $ a. $ b
  • $ a & = $ b : Tương tự $ a = $ a & $ b
  • $ a | = $ b : Tương tự $ a = $ a | $ b
  • $ a ^ = $ b : Tương tự $ a = $ a ^ $ b
  • $ a << = $ b : Tương tự $ a = $ a << $ b
  • $ a >> = $ b : Tương tự $ a = $ a >> $ b

Ghi chú

andtoán tử và ortoán tử có độ ưu tiên thấp hơn toán tử gán =.

Điều này có nghĩa $a = true and false;là tương đương với ($a = true) and false.

Trong hầu hết các trường hợp, bạn có thể sẽ muốn sử dụng &&||, hoạt động theo cách được biết đến từ các ngôn ngữ như C, Java hoặc JavaScript.


1
Có một lỗi trong $a ?? $cđó, nó nói giống như $a ? $a : $c, nhưng toán tử ternary kiểm tra xem giá trị có đúng không, mặt khác, null kết hợp lại kiểm tra các giá trị null, vì vậy, nếu $ a bằng 0, bạn sẽ nhận được 0 (vì 0 là không null), ví dụ nếu bạn có: $a=0; $c=5;sau đó $a?$a:$ctrả về 5 và $a??$ctrả về 0.
stramin

104

Toán tử tàu vũ trụ<=> (Đã thêm vào PHP 7)

Ví dụ cho <=>toán tử Spaceship (PHP 7, Nguồn: Hướng dẫn sử dụng PHP):

Số nguyên, Floats, Chuỗi, Mảng & đối tượng để so sánh ba chiều của các biến.

// Integers
echo 10 <=> 10; // 0
echo 10 <=> 20; // -1
echo 20 <=> 10; // 1

// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1

// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
// Comparison is case-sensitive
echo "B" <=> "a"; // -1

echo "a" <=> "aa"; // -1
echo "zz" <=> "aa"; // 1

// Arrays
echo [] <=> []; // 0
echo [1, 2, 3] <=> [1, 2, 3]; // 0
echo [1, 2, 3] <=> []; // 1
echo [1, 2, 3] <=> [1, 2, 1]; // 1
echo [1, 2, 3] <=> [1, 2, 4]; // -1

// Objects
$a = (object) ["a" => "b"]; 
$b = (object) ["a" => "b"]; 
echo $a <=> $b; // 0

$a = (object) ["a" => "b"]; 
$b = (object) ["a" => "c"]; 
echo $a <=> $b; // -1

$a = (object) ["a" => "c"]; 
$b = (object) ["a" => "b"]; 
echo $a <=> $b; // 1

// only values are compared
$a = (object) ["a" => "b"]; 
$b = (object) ["b" => "b"]; 
echo $a <=> $b; // 1


74

{} Dấu ngoặc nhọn

Và một số từ về bài viết cuối cùng

$x[4] = 'd'; // it works
$x{4} = 'd'; // it works

$echo $x[4]; // it works
$echo $x{4}; // it works

$x[] = 'e'; // it works
$x{} = 'e'; // does not work

$x = [1, 2]; // it works
$x = {1, 2}; // does not work

echo "${x[4]}"; // it works
echo "${x{4}}"; // does not work

echo "{$x[4]}"; // it works
echo "{$x{4}}"; // it works

4
Ký hiệu {''} cho tên thuộc tính. echo $ movies-> phim -> {'great-lines'} -> line; có thể được sử dụng để truy cập dữ liệu trong SimpleXMLEuity. Có lẽ nó có thể được sử dụng trong các trường hợp khác quá. php.net/manual/en/simplexml.examples-basic.php
Andrei

68

Toán tử hợp nhất Null (??)

Toán tử này đã được thêm vào trong PHP 7.0 cho trường hợp phổ biến là cần sử dụng toán tử ternary kết hợp với isset(). Nó trả về toán hạng đầu tiên của nó nếu nó tồn tại và không NULL; nếu không, nó trả về toán hạng thứ hai của nó.

<?php
// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

// Coalescing can be chained: this will return the first
// defined value out of $_GET['user'], $_POST['user'], and
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>

64

Chuỗi PHP: Chuỗi PHP có thể được chỉ định theo bốn cách không chỉ hai cách:

1) Chuỗi trích dẫn duy nhất:

$string = 'This is my string'; // print This is my string

2) Chuỗi trích dẫn kép:

$str = 'string';

$string = "This is my $str"; // print This is my string

3) Di truyền:

$string = <<<EOD
This is my string
EOD; // print This is my string

4) Nowdoc (kể từ PHP 5.3.0):

$string = <<<'END_OF_STRING'
    This is my string 
END_OF_STRING; // print This is my string

@ Rizier123: "Heredocs không thể được sử dụng để khởi tạo các thuộc tính lớp có nghĩa là gì. Vì PHP 5.3, giới hạn này chỉ hợp lệ đối với heredocs có chứa các biến."?
PHPFan

48

CÂU HỎI:

=>nghĩa là gì?


CÂU TRẢ LỜI:

=>Là biểu tượng mà con người chúng ta quyết định sử dụng để phân tách "Key" => "Value"các cặp trong Mảng liên kết.

KIỂM TRA:

Để hiểu điều này, chúng ta phải biết Mảng liên kết là gì. Điều đầu tiên xuất hiện khi một lập trình viên thông thường nghĩ về một mảng ( trong PHP ) sẽ là một cái gì đó tương tự như:

$myArray1 = array(2016, "hello", 33);//option 1

$myArray2 = [2016, "hello", 33];//option 2

$myArray3 = [];//option 3
$myArray3[] = 2016; 
$myArray3[] = "hello"; 
$myArray3[] = 33;

Nếu chúng ta muốn gọi mảng trong phần sau của mã, chúng ta có thể thực hiện:

echo $myArray1[1];// output: hello
echo $myArray2[1];// output: hello
echo $myArray3[1];// output: hello

Càng xa càng tốt. Tuy nhiên, là con người, chúng ta có thể khó nhớ rằng chỉ số [0]của mảng là giá trị của năm 2016, chỉ số [1]của mảng là một lời chào và chỉ số [2]của mảng là một giá trị nguyên đơn giản . Cách khác chúng ta sẽ có là sử dụng cái được gọi là Associative Array . Mảng Associative có một vài điểm khác biệt so với Mảng liên tục ( đó là những gì các trường hợp trước đó vì chúng làm tăng chỉ số được sử dụng trong một chuỗi được xác định trước, bằng cách tăng 1 cho mỗi giá trị sau ).

Sự khác biệt ( giữa một mảng liên tiếp và liên kết ):

  • Xóa khai báo của Mảng liên kết, bạn không chỉ bao gồm phần valuebạn muốn đặt trong mảng, mà bạn cũng đặt giá trị chỉ mục (được gọi là key) mà bạn muốn sử dụng khi gọi mảng trong các phần sau của mã. Cú pháp sau đây được sử dụng trong khi khai báo : "key" => "value".

  • Khi sử dụng Mảng liên kết, keygiá trị sau đó sẽ được đặt bên trong chỉ mục của mảng để lấy ra mong muốn value.

Ví dụ:

    $myArray1 = array( 
        "Year" => 2016, 
        "Greetings" => "hello", 
        "Integer_value" => 33);//option 1

    $myArray2 = [ 
        "Year" =>  2016, 
        "Greetings" => "hello", 
        "Integer_value" => 33];//option 2

    $myArray3 = [];//option 3
    $myArray3["Year"] = 2016; 
    $myArray3["Greetings"] = "hello"; 
    $myArray3["Integer_value"] = 33;

Và bây giờ, để nhận được đầu ra giống như trước đây, keygiá trị sẽ được sử dụng trong chỉ mục mảng:

echo $myArray1["Greetings"];// output: hello
echo $myArray2["Greetings"];// output: hello
echo $myArray3["Greetings"];// output: hello

ĐIỂM CUỐI CÙNG:

Vì vậy, từ ví dụ trên, khá dễ dàng để thấy rằng =>biểu tượng được sử dụng để thể hiện mối quan hệ của Mảng liên kết giữa mỗi keyvaluecác cặp trong một mảng DURING sự khởi đầu của các giá trị trong mảng.


36

Câu hỏi :

"&" Có nghĩa là gì ở đây trong PHP?

Toán tử "&" PHP

Làm cho cuộc sống dễ dàng hơn một khi chúng ta đã quen với nó .. (kiểm tra ví dụ dưới đây một cách cẩn thận)

& thường kiểm tra các bit được đặt ở cả $ a và $ b được đặt.

Bạn thậm chí có nhận thấy làm thế nào những cuộc gọi này hoạt động?

   error_reporting(E_ERROR | E_WARNING | E_PARSE);
    error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
    error_reporting(E_ALL & ~E_NOTICE);
    error_reporting(E_ALL);

Vì vậy, đằng sau tất cả ở trên là trò chơi của toán tử bit và bit.

Một trường hợp hữu ích trong số này là các cấu hình dễ dàng như đưa ra dưới đây, vì vậy một trường số nguyên duy nhất có thể lưu trữ hàng ngàn combo cho bạn.

Hầu hết mọi người đã đọc các tài liệu nhưng không liên quan đến trường hợp sử dụng trong thế giới thực của các toán tử bitwise này.

Ví dụ bạn sẽ yêu

<?php

class Config {

    // our constants must be 1,2,4,8,16,32,64 ....so on
    const TYPE_CAT=1;
    const TYPE_DOG=2;
    const TYPE_LION=4;
    const TYPE_RAT=8;
    const TYPE_BIRD=16;
    const TYPE_ALL=31;

    private $config;

    public function __construct($config){
        $this->config=$config;

        if($this->is(Config::TYPE_CAT)){
            echo 'cat ';
        }
        if($this->is(Config::TYPE_DOG)){
            echo 'dog ';
        }
        if($this->is(Config::TYPE_RAT)){
            echo 'rat ';
        }
        if($this->is(Config::TYPE_LION)){
            echo 'lion ';
        }
        if($this->is(Config::TYPE_BIRD)){
            echo 'bird ';
        }
        echo "\n";
    }

    private function is($value){
        return $this->config & $value;
    }
}

new Config(Config::TYPE_ALL);
// cat dog rat lion bird
new Config(Config::TYPE_BIRD);
//bird
new Config(Config::TYPE_BIRD | Config::TYPE_DOG);
//dog bird
new Config(Config::TYPE_ALL & ~Config::TYPE_DOG & ~Config::TYPE_CAT);
//rat lion bird

30

== được sử dụng để kiểm tra sự bằng nhau mà không xem xét kiểu dữ liệu biến

===được sử dụng để kiểm tra sự bằng nhau cho cả giá trị biến và kiểu dữ liệu

Thí dụ

$a = 5

  1. if ($a == 5) - sẽ đánh giá là đúng

  2. if ($a == '5') - sẽ đánh giá là đúng, bởi vì trong khi so sánh cả hai giá trị này, PHP chuyển đổi bên trong giá trị chuỗi đó thành số nguyên và sau đó so sánh cả hai giá trị

  3. if ($a === 5) - sẽ đánh giá là đúng

  4. if ($a === '5') - sẽ đánh giá thành false, vì giá trị là 5, nhưng giá trị 5 này không phải là số nguyên.


27

Toán tử Null Coalesce "??" (Đã thêm vào PHP 7)

Không phải là tên hấp dẫn nhất cho một toán tử, nhưng PHP 7 mang lại sự kết hợp null khá tiện dụng nên tôi nghĩ tôi muốn chia sẻ một ví dụ.

Trong PHP 5, chúng ta đã có một toán tử ternary, kiểm tra một giá trị và sau đó trả về phần tử thứ hai nếu nó trả về true và phần thứ ba nếu nó không:

echo $count ? $count : 10; // outputs 10

Ngoài ra còn có một tốc ký cho phép bạn bỏ qua phần tử thứ hai nếu nó giống với phần tử thứ nhất: echo $ Count ?: 10; // cũng xuất ra 10

Trong PHP 7, chúng tôi cũng nhận được ?? toán tử thay vì chỉ ra sự nhầm lẫn cực độ, đó là cách tôi thường sử dụng hai dấu hỏi cùng nhau thay vào đó cho phép chúng ta xâu chuỗi một chuỗi các giá trị. Đọc từ trái sang phải, giá trị đầu tiên tồn tại và không rỗng là giá trị sẽ được trả về.

// $a is not set
$b = 16;

echo $a ?? 2; // outputs 2
echo $a ?? $b ?? 7; // outputs 16

Cấu trúc này rất hữu ích để ưu tiên cho một hoặc nhiều giá trị có lẽ đến từ đầu vào của người dùng hoặc cấu hình hiện có và an toàn quay lại mặc định đã cho nếu cấu hình đó bị thiếu. Đó là một tính năng nhỏ nhưng đó là một tính năng mà tôi biết tôi sẽ sử dụng ngay khi các ứng dụng của tôi nâng cấp lên PHP 7.


12

Khai báo kiểu hoàn trả Nullable

PHP 7 thêm hỗ trợ cho khai báo kiểu trả về. Tương tự như khai báo kiểu đối số, khai báo kiểu trả về xác định loại giá trị sẽ được trả về từ hàm. Các loại tương tự có sẵn cho khai báo kiểu trả về như có sẵn cho khai báo kiểu đối số.

Gõ nghiêm ngặt cũng có ảnh hưởng đến khai báo kiểu trả về. Trong chế độ yếu mặc định, các giá trị được trả về sẽ được ép đúng loại nếu chúng chưa thuộc loại đó. Trong chế độ mạnh, giá trị được trả về phải là loại chính xác, nếu không, TypeError sẽ bị ném.

Kể từ PHP 7.1.0, các giá trị trả về có thể được đánh dấu là nullable bằng cách thêm tiền tố tên loại bằng dấu chấm hỏi (?). Điều này biểu thị rằng hàm trả về loại được chỉ định hoặc NULL.

<?php
function get_item(): ?string {
    if (isset($_GET['item'])) {
        return $_GET['item'];
    } else {
        return null;
    }
}
?>

Nguồn


7

Ba DOTS là Toán tử Splat (...) (kể từ PHP 5.6)

PHP có một toán tử "..." (Ba dấu chấm) được gọi là Toán tử Splat. Nó được sử dụng để truyền số lượng tham số tùy ý trong một hàm và loại hàm này được gọi là Hàm Variadic. Hãy lấy ví dụ để sử dụng "..." (Ba dấu chấm).

Ví dụ 1:

<?php
function calculateNumbers(...$params){
    $total = 0;
    foreach($params as $v){
        $total = $total + $v;
    }
    return $total;
}

echo calculateNumbers(10, 20, 30, 40, 50);

//Output 150
?>

Mỗi đối số của hàm notifyNumbers () đều chuyển qua $ params dưới dạng một mảng khi sử dụng "Lọ".

Có nhiều cách khác nhau để sử dụng toán tử "'". Dưới đây là một số ví dụ:

Ví dụ 2:

<?php
function calculateNumbers($no1, $no2, $no3, $no4, $no5){
    $total = $no1 + $no2 + $no3 + $no4 + $no5;
    return $total;
}

$numbers = array(10, 20, 30, 40, 50);
echo calculateNumbers(...$numbers);

//Output 150
?>

Ví dụ 3:

<?php
function calculateNumbers(...$params){
    $total = 0;
    foreach($params as $v){
        $total = $total + $v;
    }
    return $total;
}
$no1 = 70;
$numbers = array(10, 20, 30, 40, 50);
echo calculateNumbers($no1, ...$numbers);

//Output 220
?>

Ví dụ 4:

<?php
function calculateNumbers(...$params){
    $total = 0;
    foreach($params as $v){
        $total = $total + $v;
    }
    return $total;
}

$numbers1 = array(10, 20, 30, 40, 50);
$numbers2 = array(100, 200, 300, 400, 500);
echo calculateNumbers(...$numbers1, ...$numbers2);

//Output 1650

?>

0

? -> Toán tử NullSafe

Hiện tại, nó chỉ là một đề xuất, bạn có thể tìm thấy nó ở đây . Đó là NullSafe Operator, nó trả về nulltrong trường hợp bạn cố gắng gọi hàm hoặc nhận giá trị từ null... Ví dụ

$objDrive = null;
$drive = $objDrive?->func?->getDriver()?->value; //return null
$drive = $objDrive->func->getDriver()->value; // Error: Trying to get property 'func' of non-object

Thêm điều này cảm thấy khá sớm, không ai sẽ thấy toán tử này trong bất kỳ mã trực tiếp nào và thậm chí nó có thể không được thêm vào. Sẽ là tốt hơn để chờ cho đến khi các chi tiết được hoàn thành và tài liệu đúng.
IMSoP

Chúng tôi đã nhận được câu hỏi về nó. : / Nếu đề xuất thất bại, chúng tôi có thể quyết định xem điều này có đáng để giữ không.
John Conde

@JohnConde thấy sao? đây là những gì tôi đã nói ...
Berto99

@JohnConde Tôi muốn đóng chúng ngoài chủ đề, bởi vì họ đang hỏi về một ngôn ngữ lập trình tưởng tượng; hoặc có lẽ "câu hỏi này thuộc về một phần khác của dòng thời gian, vui lòng kiểm tra cài đặt trên cỗ máy thời gian của bạn";)
IMSoP

lol Ý nghĩ thoáng qua tâm trí tôi. Tôi đã tự hỏi mình rằng điều này sẽ mang lại giá trị cho khách truy cập trong tương lai và hiện tại, câu trả lời là "có". Nhưng điều đó có thể thay đổi ...
John Conde

0

Toán tử NullSafe "? ->" (có thể) kể từ php8

Hiện tại, nó chỉ là một đề xuất, bạn có thể tìm thấy nó nhập mô tả liên kết ở đây . ?->đó là NullSafe Operator, nó trả về nulltrong trường hợp bạn cố gắng gọi các hàm hoặc nhận các giá trị từ null...

Ví dụ:

<?php
$obj = null;
$obj = $obj?->attr; //return null
$obj = ?->funct(); // return null
$obj = $objDrive->attr; // Error: Trying to get property 'attr' of non-object
?>

Thêm điều này cảm thấy khá sớm, không ai sẽ thấy toán tử này trong bất kỳ mã trực tiếp nào và thậm chí nó có thể không được thêm vào. Sẽ là tốt hơn để chờ cho đến khi các chi tiết được hoàn thành và tài liệu đúng.
IMSoP

@IMSoP Tôi với bạn, tuy nhiên tôi đã được mời làm như vậy tại đây stackoverflow.com/questions/62178354/iêu ...
Berto99

Có vẻ như bây giờ chúng ta có hai câu trả lời về điều này. Cá nhân, tôi sẽ bỏ phiếu để đóng câu hỏi khác thay vì cố gắng trả lời, bởi vì ngay bây giờ không có nhà điều hành nào như vậy.
IMSoP

@IMSoP có rất nhiều câu hỏi ở đây trên StackOverflow về Đề xuất C ++ và chúng chưa bị đóng: mặc dù vậy, tôi với bạn về việc không đăng bài ở đây cho nhà điều hành này vào lúc này
Berto99

Tôi không biết nhiều về quy trình C ++ và khi nào hợp lý để thảo luận về các đề xuất, và công bằng mà nói, điều này có vẻ khá có khả năng thành công trong việc sửa đổi tập luyện, nhưng nói chung có rất nhiều tính năng được đề xuất cho PHP mà không bao giờ thực hiện được ngôn ngữ và sẽ khá khó hiểu khi người dùng bắt gặp tất cả chúng trong danh sách tham khảo. Điều đó nói rằng, tôi một phần chỉ là một ông già gắt gỏng ở đây: P
IMSoP
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.