Php 成功包含时未找到类
由于找不到类,我遇到此致命错误: 致命错误:未捕获错误:找不到类“HomeController” 但文件也包括在内Php 成功包含时未找到类,php,Php,由于找不到类,我遇到此致命错误: 致命错误:未捕获错误:找不到类“HomeController” 但文件也包括在内 require_once self::CONTROLLERS_PATH . $this->controller . '.php'; var_dump(file_exists(self::CONTROLLERS_PATH . $this->controller . '.php')); new $this->controller; 我通过var_dumpingfil
require_once self::CONTROLLERS_PATH . $this->controller . '.php';
var_dump(file_exists(self::CONTROLLERS_PATH . $this->controller . '.php'));
new $this->controller;
我通过var_dumpingfile_exists
对其进行了调试,它返回true。我检查了名称空间,一切看起来都很好。如果I var dump$this->controller
,则其值与预期值相同-字符串(14)“HomeController”
。如果我硬编码它像newhomecontroller()代码>,类已初始化。但是为什么它不能从变量开始工作呢?你可以在下面看到我的代码。这是我的文件结构:
App.php
<?php
namespace App\Core;
class App
{
protected $controller = 'HomeController';
protected $method = 'index';
protected $params = [];
const CONTROLLERS_PATH = '../App/Controllers/';
public function __construct ()
{
$url = $this->parseUrl();
if(file_exists(self::CONTROLLERS_PATH . ucfirst($url[0]) . '.php'))
{
$this->controller = ucfirst($url[0]); //Update $this->controller value
unset($url[0]);
echo 'file exists';
}
require_once self::CONTROLLERS_PATH . $this->controller . '.php';
var_dump(file_exists(self::CONTROLLERS_PATH . $this->controller . '.php'));
var_dump($this->controller);
new $this->controller;
if(isset($url[1]))
{
if(method_exists($this->controller, $url[1]))
{
$this->method = $url[1];
unset($url[1]);
echo 'method exists';
}
}
$this->params = $url ? array_values($url): [];
call_user_func_array([$this->controller, $this->method], $this->params);
var_dump($url);
}
public function parseUrl()
{
if(isset($_GET['url']))
{
return $url = explode('/', filter_var(rtrim($_GET['url'], '/'), FILTER_SANITIZE_URL));
}
}
}
通过变量名实例化类时,始终必须包含整个命名空间。必须先将其存储为字符串。
例如:
namespace Api;
Class test {
public function __construct() {
echo "test";
}
}
$className = 'test';
$classNameNamespaced = "\\Api\\".$className;
$a = new $classNameNamespaced; // echoes "test"
就你而言:
$className = "\\App\\Controllers\\".$this->controller;
new $className;
通过变量名实例化类时,始终必须包含整个命名空间。必须先将其存储为字符串。
例如:
namespace Api;
Class test {
public function __construct() {
echo "test";
}
}
$className = 'test';
$classNameNamespaced = "\\Api\\".$className;
$a = new $classNameNamespaced; // echoes "test"
就你而言:
$className = "\\App\\Controllers\\".$this->controller;
new $className;
由于代码位于命名空间中,new$this->controller
与new HomeController
不同,即使$this->controller
的值为HomeController
表达式new HomeController
在编译时进行计算,由于名称空间的原因,它被扩展为new\App\Controllers\HomeController
(上的规则#6)。解释器需要完全限定的类名才能找到它
表达式new$this->controller
在运行时进行计算,它会导致new HomeController
,这与new\HomeController
相同。根命名空间中没有定义任何类HomeController
,因此会出现错误
通过将完整的类名构建到字符串中,您可以使其轻松工作:
$class = 'App\\Controllers\\'.$this->controller;
new $class;
在文档页面中找到更多示例
但是加载类的最佳方法是使用。因为代码位于命名空间中,new$this->controller
与new HomeController
不同,即使$this->controller
的值是HomeController
表达式new HomeController
在编译时进行计算,由于名称空间的原因,它被扩展为new\App\Controllers\HomeController
(上的规则#6)。解释器需要完全限定的类名才能找到它
表达式new$this->controller
在运行时进行计算,它会导致new HomeController
,这与new\HomeController
相同。根命名空间中没有定义任何类HomeController
,因此会出现错误
通过将完整的类名构建到字符串中,您可以使其轻松工作:
$class = 'App\\Controllers\\'.$this->controller;
new $class;
在文档页面中找到更多示例
但是加载类的最佳方法是使用。它是否有名称空间?(即使它的名称空间与此脚本相同)我不明白您的意思。我强烈建议您使用Composer自动加载,而不是连接您自己的解决方案啊,对不起,忘记了您必须首先将其全部放入变量:$className=“\\App\\Controllers\\”$this->controller
然后新建$className代码>我会把它写下来作为答案,那么它是否有名字空间?(即使它的名称空间与此脚本相同)我不明白您的意思。我强烈建议您使用Composer自动加载,而不是连接您自己的解决方案啊,对不起,忘记了您必须首先将其全部放入变量:$className=“\\App\\Controllers\\”$this->controller
然后新建$className代码>我将把它作为一个答案来写,那么名称空间的开头不需要有一个“\”吗?因为我们已经在一个名称空间中。名称空间只存在于代码中。在编译过程中,所有对象名称都扩展为完全限定名称。在运行期间,没有名称空间,并且名称不会展开。变量中作为字符串的任何名称都将被视为完全限定名称,不管它是否以反斜杠开头。看看文档页面上的示例2。名称空间的开头不需要有一个“\”吗?因为我们已经在一个名称空间中。名称空间只存在于代码中。在编译过程中,所有对象名称都扩展为完全限定名称。在运行期间,没有名称空间,并且名称不会展开。变量中作为字符串的任何名称都将被视为完全限定名称,不管它是否以反斜杠开头。请看文档页面上的示例2。