2011-04-19 73 views
1

我正在尋找一個相當於PHP的函數call_user_func。 我遇到這個函數的問題是它沒有進入「對象模式」。通過這個,我的意思是我不能在課堂上使用$this和其他東西,所以幾乎用兩個詞:不是oop。PHP call_user_func替代

我需要這基本上是我處理的請求的URL,解析它,並查看是否一切正常等等,然後做下面幾行:

call_user_func(array(ucfirst($controller . "Controller"), '_initAction'), $param);  
call_user_func(array(ucfirst($controller . "Controller"), $action . 'Action'), $param); 

因爲我想動態調用"Controller"及其行爲。但是我不能在$action方法中使用$this,因爲它不是OOP。

這裏的消息,我得到:

Fatal error: Using $this when not in object context in E:\htdocs\wit\application\controller\InformationController.php on line 6 

所以我希望有人能幫助我。

你能告訴我,如果我以錯誤的方式接近這個問題嗎? PS:請不要推薦任何處理這些東西的MVC框架。我喜歡Zend,但有時它太重了:((我需要爲此設置一個輕量級設置。

+0

您在另一個問題上使用了'ucfirst'提示。 – mario 2011-04-19 01:16:54

+0

我最近問了一些類似的東西。看看我的問題:http://stackoverflow.com/questions/5549724/call-user-func-within-class-context-with-this-defined – romaninsh 2011-04-19 12:36:58

回答

9

你可以通過對象的回調的第一個元素調用對象的方法:

$class = ucfirst($controller . "Controller"); 
$controller = new $class(); 
call_user_func(array($controller, $action . 'Action'), $param); 

事實上,你甚至可以用

$controller = new $class(); 
$controller->{$action . 'Action'}(); 
+0

我和這個答案一起去,因爲它最適合我 - 其實它最簡單的答案實際上:D謝謝你和其他人當然也 – Richard 2011-04-19 01:39:53

+0

如何通過第二個用法傳遞參數數組?我嘗試了一個寫在括號()中的數組,但這會導致「不支持的操作數類型」 - 錯誤。 – 2014-10-10 07:00:16

+0

第二個例子中的參數在哪裏? – 2015-08-17 08:19:25

0

看看Glue如何調用用戶定義的函數,它可能指向你正確的方向,因爲用戶定義了類。處理路線

<?php 
require_once('glue.php'); 
$urls = array(
    '/' => 'index' 
); 
class index { 
    function GET() { 
     echo "Hello, World!"; 
    } 
} 
glue::stick($urls); 
?> 
+0

這實際上很有趣...它看起來像在路由器在zend框架...我可以使用它 - 謝謝你。 – Richard 2011-04-19 01:41:14

+0

如果您發現它有用,請投它。 – Sean 2011-04-19 01:42:15

0

如果我完全錯過了你的問題的重點,我很抱歉。這聽起來像你正在嘗試使用call_user_func來調用對象方法。你可以做到這一點,你只需要傳遞一個數組作爲第一個索引,並將該方法的字符串名稱作爲第二個索引。

例如,假設您的控制器「IndexController」與「index」作爲您的操作/方法。

class IndexController { 
    public function index() { 
     // $this available here 
    } 
} 

$controller = new IndexController(); 

// if you know your parameters all ahead of time 
call_user_func(array($controller, 'index'), $param1, $param2); 

// if you want to pass an unknown number of params 
call_user_func_array(array($controller, 'index'), $params); 
0
$view  = View::getInstance($config['view']); 
$err  = new ErrorController(array(), $view); 

//load the class and its method 
//pass the params to it 
$class  = ucfirst($controller . "Controller"); 
if (class_exists($class)) 
{ 
    $con = new $class($param, $view); 
    $act = $action . 'Action'; 
    if (method_exists($con, $act) ) 
    { 
     $con->$act(); 

    } 
    else 
    { 
     $view->setController("error"); 
     $view->setAction('index'); 
     $err->indexAction(); 
    } 
} 
else 
{ 
    $view->setController("error"); 
    $view->setAction('index'); 
    $err->indexAction(); 
} 

所以這是我的解決方案我如何解決我的問題。它基於@AlexAtNet解決方案和由@Sean推薦給我的膠水部分