Hướng dẫn php call function from string - chức năng gọi php từ chuỗi

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.

Làm thế nào tôi có thể gọi một chức năng trong PHP?

Có hai phương pháp để làm điều này. Một được gọi trực tiếp chức năng theo tên biến bằng cách sử dụng khung và tham số và tên kia là bằng cách sử dụng hàm call_user_func () nhưng trong cả hai tên biến của phương thức sẽ được sử dụng. call_user_func ($ var);calling function by variable name using bracket and parameters and the other is by using call_user_func() Function but in both method variable name is to be used. call_user_func( $var );

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

Các chức năng là điểm quan trọng là bất kỳ chức năng nào được xác định theo cách này đều có phạm vi toàn cầu.Nó có thể được gọi từ bất cứ nơi nào trong toàn bộ chương trình bao gồm từ trong một hàm khác và thậm chí từ trong một lớp hoặc một thể hiện của một lớp.It can be called from anywhere within the entire program including from within another function and even from within a class or an instance of a class.

Làm thế nào tôi có thể truy cập một biến chức năng từ một hàm khác trong PHP?

Bạn nên tạo VAR trong lớp, không phải trong hàm, vì khi hàm kết thúc, biến sẽ không được đặt (do chấm dứt chức năng) ... lớp Helloworld {private $ var;hàm SayHello () {echo "xin chào";$ this-> var = "thế giới";} hàm SayWorld () {echo $ this-> var;}}?>create the var in the class, not in the function, because when the function end the variable will be unset (due to function termination)... class helloWorld { private $var; function sayHello() { echo "Hello"; $this->var = "World"; } function sayWorld() { echo $this->var; } } ?>

Hàm động PHP là gì?

Hàm động gọi có thể gán tên hàm là chuỗi cho các biến và sau đó xử lý các biến này chính xác như chính bạn sẽ tự tên.It is possible to assign function names as strings to variables and then treat these variables exactly as you would the function name itself.