【问题标题】:php structural design pattern extended class not found找不到php结构设计模式扩展类
【发布时间】:2019-05-23 20:58:21
【问题描述】:

每当我尝试扩展一个类时,我都会得到 ​​p>

致命错误:第 8 行的 C:\xampp\htdocs\project\home\register\register.php 中找不到类 'home\register\Create'

我在同一目录下有 2 个文件类,第一个是抽象类 Create :

<?php

namespace home\register;

use home\libs\Tools\Sanitize\Sanitize as sanitize;

abstract class Create
{
    public $sanitize;

    function __construct ()
    {
        $this->sanitize = new sanitize();
        if (isset($_POST)){
            foreach ($_POST as $key => $value){
                if (!empty($_POST["$key"])){
                    $this->$key = $this->sanitize->clean($value);
                }
            }
        }
    }

    abstract function db_query($pdo_db_name, $password, $query, $host = 'localhost');
}

还有一个扩展 Create 的二级寄存器:

<?php

namespace home\register;

use PDO as pdo;
use home\libs\MainLogger\MainLogger as logger;

class register extends Create //Line 8 Error is thrown when extending the class

我可以发布整个代码,但我怀疑问题是否存在。我一直在努力适应结构化设计模式,因为我认为它是处理大量类的最整洁的方式

【问题讨论】:

  • 错误出现在register.php的第8行。您能否在上面的 sn-p 中至少包含这一行,或者更多?
  • 扩展 Create 时抛出错误,这是上面的最后一行,我将更新我的问题以更清楚

标签: php oop input pdo


【解决方案1】:

现在

您需要确保已加载 Create,然后才能在 register.php 中扩展它。最简单的方法是使用require_once,添加如下内容:

require_once(__DIR__ . '/Create.php');

register.php 的顶部。现在应该足够了。

也许以后

一旦你开始加载许多类,你可能想看看使用autoloader。根据我的经验,最灵活的方法是将项目转换为使用composer,然后使用autoload 配置项。

您的课程布局(不包括此问题中未显示的课程)将类似于:

src/register/Create.php
src/register/register.php

并且,为了匹配这个,你的 composer.json 看起来像:

{
    "autoload": {
        "psr-4": {"home\\": "src/"}
    }
}

然后你可以通过运行来生成自动加载器:

composer dump-autoload

并通过添加以下内容在项目的入口点中使用它:

require_once('vendor/autoload.php');

从此时起,您无需为每个文件添加单独的 require_once 行,前提是您在将新类添加到源代码后重新运行 dump-autoload

【讨论】:

  • 好吧,这就像一个魅力。谢谢你。但是我有一些问题,所以即使我use 一个类它没有加载到内存中?如果我有加载它们的脚本怎么办?它们会一直加载到内存中,还是我需要包含包含所有这些的文件?这可能与我所理解的作曲家很接近
  • 自动加载的工作方式是,当找不到以前加载(包含)的类时,使用完全限定的类名(命名空间\类)调用 spl 自动加载函数。自动加载器接受它并计算出文件的路径,并包含它。
  • 使用语句,就像类名的快捷方式。它不加载任何东西。一旦一个类被 PHP 包含并解析,它就会告诉请求结束。事实上,这是命名空间的主要原因,因此命名相同的类不会相互冲突(因为它们保持加载状态)
猜你喜欢
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
相关资源
最近更新 更多