从字符串调用php函数名


call php function name from a string

本问题已经有最佳答案,请猛点这里访问。

我创建了一个PHP函数来返回或保存一些JSON,这个类看起来像这样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<?php
    class calendarModel {

        // global variables
        var $user;
        var $action;
        var $connect;

        // init class
        function __construct($action ="getEvents") {
            $this->user = 1;

            $this->action = $action;

            $dbhost ="localhost";
            $dbport ="5432";
            $dbname ="fixevents";
            $dbuser ="postgres";
            $dbpass ="123";
            $this->connect = pg_connect("host=" . $dbhost ." port=" . $dbport ." dbname=" . $dbname ." user=" . $dbuser ." password=" . $dbpass);

            $this->executeAction();
        }

        // action router
        function executeAction() {
            if($this->action =="getEvents")
                $this->getEvents();
            else if($this->action =="moveEvent")
                $this->moveEvent();
            else if($this->action =="insertEvent")
                $this->insertEvent();
            else if($this->action =="updateEvent")
                $this->updateEvent();
            else if($this->action =="getCalendars")
                $this->getCalendars();
            else if($this->action =="toggleCalendar")
                $this->toggleCalendar();
            else if($this->action =="deleteCalendar")
                $this->deleteCalendar();
            else if($this->action =="insertCalendar")
                $this->insertCalendar();
        }

        // getEvents
        function getEvents() {
            //...
        }

        // moveEvent
        function moveEvent() {
            //...
        }

        // insertEvent
        function insertEvent() {
            //...
        }

        // updateEvent
        function updateEvent() {
            //...
        }

        // toggleCalendar
        function toggleCalendar() {
            //...
        }

        // deleteCalendar
        function deleteCalendar() {
            //...
        }

        // insertCalendar
        function insertCalendar() {
            //...
        }

    }

    // call class
    if(isset($_GET['action']))
        $instance = new calendarModel($_GET['action']);
    else
        $instance = new calendarModel();
?>

我想知道的是,我是否可以从字符串名称中调用该构造中的操作,而不是将该if/else if函数变为名为executeAction的大if/else if函数。提前谢谢你,丹尼尔!


如果使用将使用函数名的表达式,则表达式的值将用作函数名:

1
2
3
function executeAction() {
    $this->{$this->action}();
}

由于您从用户输入中获取操作,请确保您对其进行了验证。否则,会有人发送使您执行任意方法的输入。


使用类似的方法:

1
2
3
4
5
function __construct($action ="getEvents")
{
    ...
    $this->$action();
}

由于$action由用户定义,因此您可能需要检查$action是否是类中的现有函数:

1
2
3
if (array_key_exists($action, get_class_methods($this))) {
    $this->$action();
}


Barmar几乎是正确的:$this->$action();