为了账号安全,请及时绑定邮箱和手机立即绑定

如何在字符串 PHP 上执行函数

如何在字符串 PHP 上执行函数

PHP
青春有我 2022-09-12 12:52:44
当我在学校项目上工作时,我遇到了一个问题。我已经制作了一个路由器类,它可以获得正确的文件,但我得到以下错误:致命错误: 方法 mvc\App::__toString() 不得引发异常,捕获错误: 调用成员函数 getHTML() 字符串 /选择/灯/htdocs/学校/测试PHP/mvc/公共/索引.php第 0 行echo 返回正确的文件路径,因此这不是我遇到的问题。我认为问题是因为我尝试将函数执行到字符串中。有谁知道我该如何解决我的问题?应用类:<?phpnamespace mvc;class App{    private $router;    public function __construct(){        $this->router = new \mvc\Router();    }    public function __toString(){        try {            echo $this->router->getView(); //this returns the correct file path             return $this->router->getView()->getHTML();        } catch (Exception $e) {            return $e.getMessage;        }    }}?>路由器.php:<?phpnamespace mvc;class Router{private $route;private $view;private $controller;private $model;public function __construct(){    require_once(LOCAL_ROOT. "php/Routes.php");    if (isset($_GET['route'])){        $this->route = explode("/" , $_GET['route']);    }    $route = isset($routes[$this->getRoute()])? $this->getRoute() : DEFAULT_ROUTE;    $this->controller = "\\controllers\\". $routes[$route]['controller'];    $this->view = "\\views\\". $routes[$route]['view'];    // $model = "\\models\\". $routes[$route]['model'];}private function getRoute(){    return count($this->route) > 0 ? $this->route[0] : DEFAULT_ROUTE;}public function getView(){    return $this->view;}}?>路线.php<?phpdefine("DEFAULT_ROUTE", "home");$routes = array("home" => array(    "view" => "HomeView",    "controller" => "HomeController",),"form" => array(    "view" => "FormView",    "controller" => "FormController",),"test" => array(    "view" => "TestView",    "controller" => "TestController",),)?>测试视图.php<?phpnamespace views;class TestView extends \mvc\View{public function getHTML(){    // return 'dit is testView';    $klik = $this->controller->getGetData("klik");    $output = "";    $output .= "<h1>".$klik++ ."</h1>";    $output .= "<a href=\"test?klik=$klik\">klik</a>";    $output .= "<br>";    return $output;}}?>
查看完整描述

1 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

问题:


好的,所以问题是你从字符串调用函数。


这是类中的方法:getViewRouter


public function getView(){

    return $this->view;

}

此方法返回一个字符串:


$this->view = "\\views\\". $routes[$route]['view'];

然后,您正在尝试从以下字符串调用方法:


return $this->router->getView()->getHTML();

可能的解决方案:


显然,您正在尝试访问类中的方法,因此在不了解有关您的设置的更多信息的情况下,很难获得确切的信息,但是我会在下面进行猜测,您可以在注释中指导我朝着正确的方向前进。getHTMLTestView


如果将类中的构造函数更改为:App


public function __construct(){

    $this->router = new \mvc\Router();

    $this->testView = new \views\TestView();

}

然后,您可以将方法更改为以下内容:__toString


echo $this->router->getView(); //this returns the correct file path 

return $this->testView->getHTML();

我不确定你为什么会这样做,然后,通常是一个或另一个,但如果你更详细地阐述你预期的输出,我可以帮你更多,或者希望我的解释已经给了你足够的工作。echoreturn


溶液:


阅读注释后,看起来要从方法的结果实例化类,可以通过将结果设置为变量并从该字符串调用新类,然后从该类调用该方法来执行此操作。getView


$class = $this->router->getView();

$class = new $class;


return $class->getHTML();


查看完整回答
反对 回复 2022-09-12
  • 1 回答
  • 0 关注
  • 73 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信