我使用Composer自动加载器(PSR-4)在我需要的时候加载我的类.当我从另一个类(如控制器的模型)内部调用一个类时,我遇到了一个问题.

当我需要自己调用类时,它工作得很好,但当我try 从一个类内部调用另一个类时,它似乎不起作用.

我的Composer.json为自动加载提供了以下内容:

"autoload": {
    "psr-4": {
        "WhizzKids\\Controller\\": "controllers/",
        "WhizzKids\\Model\\": "models/"
    }
},

我的控制器被称为类似于$AccountsController = new WhizzKids\Controller\AccountsController();,该文件中的代码是:

<?php
namespace WhizzKids\Controller;

class AccountsController {
    private $AccountsModel;

    public function __construct() {
        $this->AccountsModel = new WhizzKids\Model\AccountsModel();
    }

    public function getAccounts() {
        return $this->AccountsModel->getAccounts();
    }
}

在这个控制器中,我试图调用我的模型,该模型包括从数据库获取数据的逻辑.模型中的代码为:

<?php
namespace WhizzKids\Model;

class AccountsModel {
    private $conn;
    
    public function __construct() {
        $this->conn = mysqli_connect($_ENV['DB_SERVER'], $_ENV['DB_USER'], $_ENV['DB_PASSWORD'], $_ENV['DB_DATABASE']);
        if (!$this->conn) {
            die("Connection failed: " . mysqli_connect_error());
        }
    }

    public function getAccounts() {
        $sql = 'SELECT * FROM accounts';
        $result = mysqli_query($this->conn, $sql);
        $accounts = [];
        if(mysqli_num_rows($result) > 0) {
            // output data of each row
            while($row = mysqli_fetch_assoc($result)) {
                $accounts[] = $row;
            }
        } 
        mysqli_close($this->conn);
        return $accounts;
    }
}

When I try to load the view that uses this on the front-end i get the following error: error message

正如您在错误消息中看到的,它似乎将先前的名称空间添加到子名称空间中,不确定我在哪里出错了?(还可以进行任何改进)

推荐答案

您的问题与如何在PHP中引用名称空间和类有关.当您在名称空间中try 使用新关键字实例化一个类时,PHP会认为您引用的是当前名称空间中存在的一个类.

如果要引用不同命名空间中的类,您有两个 Select .您可以使用完全限定的类名(包括前导),也可以在文件的顶部包含一条USE语句.

因此,您可以按如下方式更新AcCountsControler类:

<?php
namespace WhizzKids\Controller;

use WhizzKids\Model\AccountsModel;

class AccountsController {
    private $AccountsModel;

    public function __construct() {
        $this->AccountsModel = new AccountsModel();
    }

    public function getAccounts() {
        return $this->AccountsModel->getAccounts();
    }
}

或者,您可以在__Construction函数中使用完全限定名:

public function __construct() {
    $this->AccountsModel = new \WhizzKids\Model\AccountsModel();
}

请记住,当您在PHP中使用名称空间时,如果您想引用全局类(如根名称空间中的类,包括内置的PHP类),则需要在它们之前加上.因此,如果您希望在名称空间中使用全局类,例如Except类,则需要将其称为\Except.

同样的原则也适用于此.通过使用\WhizzKids\Model\Account tsModel,您可以说"在根()名称空间中查找此类,然后在WhizzKids\Model名称空间中查找此类".

Php相关问答推荐

根据特定运输类别增加WooCommerce购物车总重量

自定义WooCommerce查询字符串仅显示前3个产品

在不超过PHP时间限制的情况下,在Laravel中高效地插入批量数据(25万条记录)?(队列、多租户)

如何使用php-amqplib连接到ActiveMQ Classic Docker镜像

Mod_重写子目录中相应的php文件

我必须对所有的SQL查询使用预准备语句吗?

将一个按钮添加到WooCommerce产品的管理视图中,该按钮链接到一个自定义的WebHook,并在末尾附加产品ID

莫德克斯.当我try 使用pThumb为手机压缩图像时,没有任何react

在PHP中使用curl命令执行SCRAPYD操作.json不返回任何内容

防止同时从Laravel中的用户帐户中提取

如何在 Laravel 中修改嵌套数组的键?

正则表达式请帮我从内容中找到这个词

为什么在 phpunit 的开头测试 PHP_VERSION?

输出每个可能的产品选项

如何将数字文本文件添加到 PHP 数学方程式中?

NetBeans 不显示中文内容

如果 static:: 被解析为B,为什么 PHP 会执行A的方法

在全局安装 Composer 包后运行命令

Laravel 响应 html 默认页面忽略控制器

使用 PHP 有条件地使用关键字 Twilio Programmable SMS