Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 成功包含时未找到类_Php - Fatal编程技术网

Php 成功包含时未找到类

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

由于找不到类,我遇到此致命错误:

致命错误:未捕获错误:找不到类“HomeController”

但文件也包括在内

require_once self::CONTROLLERS_PATH . $this->controller . '.php';
var_dump(file_exists(self::CONTROLLERS_PATH . $this->controller . '.php'));
new $this->controller;
我通过var_dumping
file_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。