【问题标题】:PHP how to stop class from inheriting namespace of parent classPHP如何阻止类继承父类的命名空间
【发布时间】:2016-12-12 21:43:14
【问题描述】:

我正在尝试编写自动加载器功能,但遇到了问题。当我从 Product 类内部调用 DBConnect 类时,它继承了 Product 类命名空间。

我不知道在自动加载 DBConnect 类时如何使用“use”语句。如果我尝试在我的加载器函数中的 include 之后添加“use”语句,则会引发错误。所以我不断收到“致命错误:找不到类'App\Model\Entity\DbConnect'”。它应该使用“App\Config\DBConnect”。

这是我构建的第一个自动加载器,所以我不确定我哪里出错了。

提前致谢。

bootstrap.php

require_once('Autoloader.php');
require_once $_SERVER['DOCUMENT_ROOT'] . '/Config/config.php';
spl_autoload_register('Core\Autoloader::loader');

Autoloader.php

namespace Core;
class Autoloader
{
  public static function loader( $class, $dir = null ) {

    if ( is_null( $dir ) )
        $direct  = array(
        '/Controller',
        '/Model/Entity',
        '/Model/Table',
        '/Config'
        );

    foreach ($direct as $dir){

        $scan = scandir(ROOTPATH . $dir);
        $classname = substr(strrchr($class, "\\"), 1);
        $classfile = $classname . '.php';

        foreach($scan as $file)
        {
            if(file_exists(ROOTPATH . $dir . '/' . $classfile)){
                include ROOTPATH . $dir . '/' . $classfile;
                goto xspot;
            }
        }
    }
    xspot:
  }
}

产品.php

namespace App\Model\Entity;
require_once $_SERVER['DOCUMENT_ROOT'] . '/Config/config.php';
include ROOTPATH . '/Core/bootstrap.php';

class Product
 {
    public function __construct($conntype = 'MYSQLI') {
        $db = new DbConnect();
        $this->conn = $db->connect($conntype);
    }

DBConnect.php

namespace App\Config;
class DbConnect {
    function connect() {
        require_once $_SERVER['DOCUMENT_ROOT'] . '/Config/config.php';   
        $conn = new \mysqli(DB_SERVER_MYSQLI, DB_USERNAME, DB_PASSWORD, DB_NAME, DB_PORT);
          if (mysqli_connect_errno()) {
                echo "Failed to connect to MySQL: " . mysqli_connect_error();
          }
 }

【问题讨论】:

    标签: php class namespaces


    【解决方案1】:

    首先,从Product.php文件中删除行require_once $_SERVER['DOCUMENT_ROOT'] . '/Config/config.php';,因为它已经包含在bootstrap.php
    其次,为DbConnect类添加别名,如下所示:

    Product.php:

    namespace App\Model\Entity;
    
    include ROOTPATH . '/Core/bootstrap.php';
    use App\Config\DbConnect as DbConnect;
    
    ...
    $db = new DbConnect();
    ...
    

    【讨论】:

    • 这给了我一个新的致命错误:“致命错误:找不到类 'App\Config\DBConnect'”。
    • @ErichMosier,也尽量不要将bootstrap.php 包含在Product.php 中,只包含config.php
    • 我不清楚这将如何工作。如果我不包含 bootstrap.php,那么我不会包含自动加载器。我错过了什么吗?还是您建议我在配置文件中包含引导程序?
    • 有一个我没有发现的拼写错误,但是下面的@diaraf 发现了。这就是导致错误的原因。但是在修复拼写错误(DbConnect 而不是 DBConnect)之后,它就可以工作了。谢谢。
    【解决方案2】:

    添加在上面

    产品.php

    use App\Config;
    

    或使用:

    $db = new App\Config\DbConnect();
    

    因为现在对象创建使用了错误的命名空间

    【讨论】:

    • 我试过了,但没用。我仍然遇到同样的致命错误
    • 其实我回去仔细看了一下,它实际上给了我一个不同的致命错误:“Fatal error: Class 'App\Model\Entity\App\Config\DbConnect' not found”
    • @RomanPerekhret 回答中存在拼写错误use App\Config\DbConnect as DbConnect;
    • 就是这样。当我尝试罗马人的方式时,拼写错误是给我的错误。谢谢你抓住那个。现在工作。
    猜你喜欢
    • 2013-09-02
    • 1970-01-01
    • 2017-12-10
    • 2013-12-31
    • 1970-01-01
    • 2023-03-27
    • 2015-07-18
    • 2010-11-26
    • 1970-01-01
    相关资源
    最近更新 更多