我正在寻找PHP的功能call_user_func
。
我遇到这个函数的问题是它没有进入“对象模式”。通过这个,我的意思是我不能在课堂上使用$this
和其他东西,所以几乎用两个词来表达:不是oop。
我基本上需要这个,因为我正在处理请求的URL,解析它,并查看一切是否正常等等,然后执行以下操作:
call_user_func(array(ucfirst( $controller . "Controller" ), '_initAction'), $param);
call_user_func(array(ucfirst( $controller . "Controller" ), $action . 'Action'), $param);
因为我想动态调用"Controller"
及其动作。但我不能在$this
方法中使用$action
,因为它不是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 :(得分:10)
您可以通过在回调的第一个元素中传递object来调用object方法:
$class = ucfirst($controller . "Controller");
$controller = new $class();
call_user_func(array($controller, $action . 'Action'), $param);
实际上,您甚至可以使用
$controller = new $class();
$controller->{$action . 'Action'}();
答案 1 :(得分:0)
看看Glue如何调用用户定义的函数。它可能指向正确的方向,因为用户定义了处理路径的类。
<?php
require_once('glue.php');
$urls = array(
'/' => 'index'
);
class index {
function GET() {
echo "Hello, World!";
}
}
glue::stick($urls);
?>
答案 2 :(得分: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);
答案 3 :(得分: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推荐给我的部分胶水