Hướng dẫn how do you call a function from a string in php? - làm thế nào để bạn gọi một hàm từ một chuỗi trong php?

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

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 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))()(); 
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

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 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))()(); 
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.

Bạn có thể sử dụng một chuỗi để gọi một hàm không?

Có hai phương thức để gọi một hàm từ chuỗi được lưu trữ trong một biến.Chế độ đầu tiên là bằng cách sử dụng phương thức đối tượng cửa sổ và phương thức thứ hai là bằng cách sử dụng phương thức eval ().. The first one is by using the window object method and the second one is by using eval() method.

Chức năng PHP nào tìm kiếm một văn bản cụ thể trong một chuỗi?

Hàm strpos () tìm thấy vị trí của lần xuất hiện đầu tiên của một chuỗi bên trong chuỗi khác.Lưu ý: Hàm strpos () nhạy cảm trường hợp.strpos() function finds the position of the first occurrence of a string inside another string. Note: The strpos() function is case-sensitive.

Tôi có thể gọi một hàm bên trong một hàm khác PHP không?

Nếu bạn muốn xác định các hàm trong hàm trong PHP, bạn có thể làm điều đó như thế này: function a () {function b () {echo 'i am b';} hàm c () {echo 'i là c';} } một();B ();c();Bạn phải gọi hàm cha trước, sau đó các chức năng bên trong.You must call the parent function first, then the functions inside.

Bạn có thể gọi một hàm trước khi nó được xác định PHP không?

Ví dụ #3 Chức năng trong các chức năng Tất cả các chức năng và các lớp trong PHP có phạm vi toàn cầu - chúng có thể được gọi bên ngoài một hàm ngay cả khi chúng được xác định bên trong và ngược lại.they can be called outside a function even if they were defined inside and vice versa.