Giải pháp: Sử dụng PHP7
Lưu ý: Để biết phiên bản tóm tắt, xem TL; DR ở cuối câu trả lời. For a summarized version, see TL;DR at the end of the answer.
Phương pháp cũ
Cập nhật: Một trong những phương pháp cũ được giải thích ở đây đã bị xóa. Tham khảo các câu trả lời khác để giải thích về các phương pháp khác, nó không được đề cập ở đây. Nhân tiện, nếu câu trả lời này không giúp bạn, bạn nên trả lại công cụ của mình. Hỗ trợ Php 5.6 đã kết thúc vào tháng 1 năm 2019 [hiện thậm chí cả Php 7.2 và 7.3 không được hỗ trợ]. Xem các phiên bản được hỗ trợ để biết thêm thông tin.: One of the old methods explained here has been removed. Refer to other answers for explanation on other methods, it isn't covered here. By the way, if this answer doesn't help you, you should return upgrading your stuff. PHP 5.6 support has ended in January 2019 [now even PHP 7.2 and 7.3 are not being supported]. See supported versions for more information.
Như những người khác đã đề cập, trong PHP5 [và cả trong các phiên bản mới hơn như PHP7], chúng ta có thể sử dụng các biến làm tên hàm, sử dụng ____10 và
function something[]: string
{
return "something";
}
$bar = "some_thing";
[str_replace["_", "", $bar]][]; // something
// Possible, too; but generally, not recommended, because makes your
// code more complicated
[str_replace["_", "", $bar]][][];
1, v.v.Phương pháp mới
Kể từ PHP7, có những cách mới được giới thiệu:
Lưu ý: Tất cả mọi thứ bên trong khung
2 có nghĩa là một hoặc nhiều biểu thức để tạo thành một cái gì đó, ví dụ: function something[]: string
{
return "something";
}
$bar = "some_thing";
[str_replace["_", "", $bar]][]; // something
// Possible, too; but generally, not recommended, because makes your
// code more complicated
[str_replace["_", "", $bar]][][];
3 có nghĩa là các biểu thức tạo thành một tên hàm. Everything inside function something[]: string
{
return "something";
}
$bar = "some_thing";
[str_replace["_", "", $bar]][]; // something
// Possible, too; but generally, not recommended, because makes your
// code more complicated
[str_replace["_", "", $bar]][][];
function something[]: string
{
return "something";
}
$bar = "some_thing";
[str_replace["_", "", $bar]][]; // something
// Possible, too; but generally, not recommended, because makes your
// code more complicated
[str_replace["_", "", $bar]][][];
2 brackets means one or more expressions to form something, e.g. function something[]: string
{
return "something";
}
$bar = "some_thing";
[str_replace["_", "", $bar]][]; // something
// Possible, too; but generally, not recommended, because makes your
// code more complicated
[str_replace["_", "", $bar]][][];
3
means expressions forming a function name.Chức năng động cuộc gọi: Tên chức năng trên đường bay
Chúng ta có thể tạo một tên hàm bên trong dấu ngoặc đơn chỉ trong một lần:
[][arguments];
Ví dụ:
function something[]: string
{
return "something";
}
$bar = "some_thing";
[str_replace["_", "", $bar]][]; // something
// Possible, too; but generally, not recommended, because makes your
// code more complicated
[str_replace["_", "", $bar]][][];
Lưu ý: Mặc dù việc loại bỏ các dấu ngoặc đơn xung quanh
4 không phải là một lỗi, việc đặt dấu ngoặc đơn làm cho mã dễ đọc hơn. Tuy nhiên, đôi khi bạn không thể làm điều đó, ví dụ: trong khi sử dụng toán tử function something[]: string
{
return "something";
}
$bar = "some_thing";
[str_replace["_", "", $bar]][]; // something
// Possible, too; but generally, not recommended, because makes your
// code more complicated
[str_replace["_", "", $bar]][][];
5. Để nhất quán, tôi khuyên bạn nên đặt dấu ngoặc đơn luôn. Although removing the parentheses around function something[]: string
{
return "something";
}
$bar = "some_thing";
[str_replace["_", "", $bar]][]; // something
// Possible, too; but generally, not recommended, because makes your
// code more complicated
[str_replace["_", "", $bar]][][];
function something[]: string
{
return "something";
}
$bar = "some_thing";
[str_replace["_", "", $bar]][]; // something
// Possible, too; but generally, not recommended, because makes your
// code more complicated
[str_replace["_", "", $bar]][][];
4 is not an error, putting parentheses makes code more readable. However, you cannot do that sometimes, e.g. while using function something[]: string
{
return "something";
}
$bar = "some_thing";
[str_replace["_", "", $bar]][]; // something
// Possible, too; but generally, not recommended, because makes your
// code more complicated
[str_replace["_", "", $bar]][][];
5 operator. To be consistent, I recommend you to put the parentheses always.Gọi chức năng động: Thuộc tính có thể gọi được
Một ví dụ hữu ích sẽ nằm trong bối cảnh của các đối tượng: nếu bạn đã lưu trữ một cuộc gọi trong một tài sản, bạn phải gọi nó theo cách này:
[$object->{}][];
Như một ví dụ đơn giản:
// Suppose we're in a class method context
[$this->eventHandler][];
Rõ ràng, gọi nó là
function something[]: string
{
return "something";
}
$bar = "some_thing";
[str_replace["_", "", $bar]][]; // something
// Possible, too; but generally, not recommended, because makes your
// code more complicated
[str_replace["_", "", $bar]][][];
6 là sai đơn giản: bằng cách đó, bạn có nghĩa là gọi một phương thức có tên function something[]: string
{
return "something";
}
$bar = "some_thing";
[str_replace["_", "", $bar]][]; // something
// Possible, too; but generally, not recommended, because makes your
// code more complicated
[str_replace["_", "", $bar]][][];
7.Phương thức động cuộc gọi: Tên phương thức trên đường bay
Giống như các cuộc gọi chức năng động, chúng ta có thể thực hiện theo cùng một cách với các cuộc gọi phương thức, được bao quanh bởi niềng răng xoăn thay vì dấu ngoặc đơn [để có các hình thức bổ sung, điều hướng đến phần TL; DR]:
$object->{}[arguments];
$object::{}[arguments];
Xem nó trong một ví dụ:
class Foo
{
public function another[]: string
{
return "something";
}
}
$bar = "another thing";
[new Something[]]->{explode[" ", $bar][0]}[]; // something
Phương thức động cuộc gọi: Cú pháp mảng
Một cách thanh lịch hơn được thêm vào trong PHP7 là như sau:
[, ][arguments];
[, ][arguments]; // Static calls only
Ví dụ:
class Foo
{
public function nonStaticCall[]
{
echo "Non-static call";
}
public static function staticCall[]
{
echo "Static call";
}
}
$x = new X[];
[$x, "non" . "StaticCall"][]; // Non-static call
[$x, "static" . "Call"][]; // Static call
Lưu ý: Lợi ích của việc sử dụng phương pháp này so với phương pháp trước đó là, bạn không quan tâm đến loại cuộc gọi [nghĩa là nó có tĩnh hay không]. The benefit of using this method over the previous one is that, you don't care about the call type [i.e. whether it's static or not].
Lưu ý: Nếu bạn quan tâm đến hiệu suất [và tối ưu hóa vi mô], đừng sử dụng phương pháp này. Như tôi đã thử nghiệm, phương pháp này thực sự chậm hơn các phương pháp khác [hơn 10 lần]. If you care about performance [and micro-optimizations], don't use this method. As I tested, this method is really slower than other methods [more than 10 times].
Ví dụ bổ sung: Sử dụng các lớp ẩn danh
Làm cho mọi thứ hơi phức tạp, bạn có thể sử dụng kết hợp các lớp ẩn danh và các tính năng trên:
$bar = "SomeThing";
echo [new class {
public function something[]
{
return 512;
}
}]->{strtolower[$bar]}[]; // 512
TL; DR [Kết luận]
Nói chung, trong PHP7, sử dụng các biểu mẫu sau đều có thể:
// Everything inside `` brackets means one or more expressions
// to form something
// Dynamic function call via function name
[][arguments];
// Dynamic function call on a callable property
[$object->{}][arguments];
// Dynamic method call on an object
$object->{}[arguments];
$object::{}[arguments];
// Dynamic method call on a dynamically-generated object
[]->{}[arguments];
[]::{}[arguments];
// Dynamic method call, statically
ClassName::{}[arguments];
[]::{}[arguments];
// Dynamic method call, array-like [no different between static
// and non-static calls
[, ][arguments];
// Dynamic method call, array-like, statically
[, ][arguments];
Đặc biệt cảm ơn Php nói chuyện này.