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

当我在学校项目上工作时,我遇到了一个问题。


我已经制作了一个路由器类,它可以获得正确的文件,但我得到以下错误:


致命错误: 方法 mvc\App::__toString() 不得引发异常,捕获错误: 调用成员函数 getHTML() 字符串 /选择/灯/htdocs/学校/测试PHP/mvc/公共/索引.php第 0 行


echo 返回正确的文件路径,因此这不是我遇到的问题。


我认为问题是因为我尝试将函数执行到字符串中。


有谁知道我该如何解决我的问题?


应用类:


<?php

namespace 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:


<?php

namespace 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


<?php

define("DEFAULT_ROUTE", "home");

$routes = array(

"home" => array(

    "view" => "HomeView",

    "controller" => "HomeController",

),

"form" => array(

    "view" => "FormView",

    "controller" => "FormController",

),

"test" => array(

    "view" => "TestView",

    "controller" => "TestController",

),

)

?>

测试视图.php


<?php

namespace 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;

}

}


?>


青春有我
浏览 74回答 1
1回答

冉冉说

问题:好的,所以问题是你从字符串调用函数。这是类中的方法:getViewRouterpublic function getView(){&nbsp; &nbsp; return $this->view;}此方法返回一个字符串:$this->view = "\\views\\". $routes[$route]['view'];然后,您正在尝试从以下字符串调用方法:return $this->router->getView()->getHTML();可能的解决方案:显然,您正在尝试访问类中的方法,因此在不了解有关您的设置的更多信息的情况下,很难获得确切的信息,但是我会在下面进行猜测,您可以在注释中指导我朝着正确的方向前进。getHTMLTestView如果将类中的构造函数更改为:Apppublic function __construct(){&nbsp; &nbsp; $this->router = new \mvc\Router();&nbsp; &nbsp; $this->testView = new \views\TestView();}然后,您可以将方法更改为以下内容:__toStringecho $this->router->getView(); //this returns the correct file path&nbsp;return $this->testView->getHTML();我不确定你为什么会这样做,然后,通常是一个或另一个,但如果你更详细地阐述你预期的输出,我可以帮你更多,或者希望我的解释已经给了你足够的工作。echoreturn溶液:阅读注释后,看起来要从方法的结果实例化类,可以通过将结果设置为变量并从该字符串调用新类,然后从该类调用该方法来执行此操作。getView$class = $this->router->getView();$class = new $class;return $class->getHTML();
打开App,查看更多内容
随时随地看视频慕课网APP