2014-02-12 74 views
0

我創建了一個php函數來返回或保存一些jsons,並且類看起來像這樣。從字符串調用php函數名稱

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

什麼,我想知道是,我可以以某種方式實現從字符串名稱contruct的行動,而不是作出這樣大,如果如果函數調用/其他executeAction。丹尼爾,先謝謝你!

+3

'call_user_func( )' – zerkms

+0

@zerkms'$ this'雖然會使事情變得複雜。 – kapa

+0

@kapa:'call_user_func(array($ this,'methodname'))' – zerkms

回答

0

Barmar幾乎是正確的: $ this - > {$ action}();

+0

非常感謝你這一點,這工作完美,我甚至不需要使執行操作功能了,我只是打電話給它就像這裏面的構造 –

+1

這個答案不值得被檢查,對不起 – zerkms

+0

'$ action'是一個類的屬性,你需要'$ this->' – Barmar

4

如果使用其中將要使用的功能名稱的表達式,該表達式的值將作爲函數名:

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

既然你得到來自用戶的輸入操作,確保你驗證它。否則,有人可能會發送使您執行任意方法的輸入。

+0

非常感謝你這個作品的目的是:D我希望我可以給你們兩個正確的答案:) –

1

使用類似的東西:

function __construct($action = "getEvents") 
{ 
    ... 
    $this->$action(); 
} 

由於$動作是由用戶定義的,你可能要檢查$行動是否在你的類的現有功能:

if (array_key_exists($action, get_class_methods($this))) { 
    $this->$action(); 
} 
相關問題