【问题标题】:php Class not found but importedphp 类未找到但已导入
【发布时间】:2015-07-21 21:36:31
【问题描述】:

我有两个文件,第一个是 Test.php,看起来像这样:

<?php
namespace My\Namespaces\Test;

class Test {
    const ALERT_EMAIL = "AlertEmail";
    const ALERT_SMS = "AlertSms";
    const ALERT_NOTIFICATION = "AlertNotification";
}  // class - EnumAlertType
?>

另一个文件尝试使用 Test.php 中的 const

<?php
use My\Namespaces\Test;
$a = Test::ALERT_SMS;
?>

但我仍然收到Class 'My\Namespaces\Test' not found 错误,我不确定我是否正确使用了命名空间。谢谢

【问题讨论】:

  • 我认为这是在第二个示例中打开问题时的拼写错误(Namespace vs Namespaces),对吧?无论如何,您是否正确配置了自动加载(因为我在您的代码中没有看到任何手动包含的提及)?
  • 也许你会 include() 文件而不是 use 类。
  • 这里的类全名是My\Namespaces\Test\Test。要获得常数,您必须这样做:My\Namespaces\Test\Test::ALERT_SMS。命名空间就像硬盘上的文件夹,任何定义的类都像文件。 My\Namespaces\Test 是文件夹,Test 是文件。
  • @SverriM.Olsen:命名空间就像类路径的文件夹。因此My\Namespaces\Test 代表一个类,而不是一个文件夹。 See the use My\Full\Classname in the PHP doc.

标签: php


【解决方案1】:

您需要在这里区分两个术语:包括导入。前者是在当前正在执行的脚本中添加代码,后者是在您的代码中轻松使用它们。包括将代码逐字复制粘贴到当前脚本中,以便以后使用。

因此,您需要将Test 类的代码包含 (require_once()) 到将使用该代码的文件中。您确实可以在之后 import (use)(尤其是文件位于单独的文件夹中时)。因此,您需要这样做:

<?php
require_once('Test.php'); // include the code
use My\Namespaces\Test; // import it if you want but not useful as the two file are in the same folder
$a = Test::ALERT_SMS; // access to class constants

您应该开始深入研究spl_autoloader_register() 函数。

【讨论】:

  • 嗨,我尝试使用 require_once 并且它有效,非常感谢你。但我仍然很困惑,当我使用 symfony 框架时,我可以直接导入其他类而无需 require_once(),我不确定 symfony 是否有什么不同..
  • Of course Symfony does make a difference 和 ZF 一样,我很确定,任何其他框架。
  • 如果它解决了您的问题,您是否考虑过接受这个答案?
  • "Importing" 在这里用起来很混乱; aliasing 是正确的术语。
猜你喜欢
  • 2023-03-28
  • 2018-07-14
  • 2012-01-19
  • 1970-01-01
  • 2016-04-28
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多