【问题标题】:Can't create object in PHP无法在 PHP 中创建对象
【发布时间】:2014-11-04 07:02:14
【问题描述】:

我尝试根据变量创建对象。这是我的代码:

$a = 'Test';
$o = new $a();

Fatal error: Class 'Test' not found in ...

我做错了什么?或者在 PHP 中这是不允许的?

【问题讨论】:

  • 是否加载了class Test 的文件?你有设置自动加载器吗?您可以像这样通过动态字符串轻松创建类。问题是找不到该类 - 不是代码不起作用。
  • 是的,我有自动加载器,如果我写 new Test() 它可以工作。
  • 你的自动加载器是什么样的?这应该可以正常工作。 if (class_exists($a, true)) $o = new $a(); 有什么不同吗? (这将强制自动加载器工作)。
  • 我使用作曲家自动加载器
  • 我看到您使用命名空间 - 您需要使用 full 类名(带有命名空间),而不仅仅是您当前所在的命名空间所在的类。如果您're extra lazy __NAMESPACE__ 可能是一个有用的常量。

标签: php oop object


【解决方案1】:

如果你为你的类使用命名空间,你必须用你的字符串明确地写出来。

$a = '\namespace\Test';
$o = new $a();

详情请阅读documentation

正如 h2ooooooo 所指出的,您可能会使用常量来指向当前命名空间__NAMESPACE__。如,$a = '\' . __NAMESPACE . '\';

【讨论】:

  • $a = '\\' . __NAMESPACE__ . '\\Test'; 也可以工作,然后您(技术上)不必指定命名空间。 +1。
  • 感谢它的帮助。还有另一个相关的问题,我如何通过action . $a . (); 之类的方式调用方法,或者我不能这样做?
  • 如果我这样做,我会收到错误调用未定义函数 index()
  • 假设 $action 是您的方法,您可以轻松地使用 $a->$action(),或者如果 action 是您的方法的名称,则只需 $a->action()
  • 或者在更高级的情况下,call_user_func(array($a, $action), 'param1', 'param2');
【解决方案2】:

你的类 Test 没有定义...

试试这个:

$a = 'Test';
$o = new $a();
var_dump($o);

class Test {}

【讨论】:

  • 我使用 namespacec 并从另一个目录获取此类。如果我写 new Test();它工作正常。
  • 检查是否加载了测试类(使用\YourNamespace\Test),或者您可以加载类手册(需要....Test.php)。检查您是否有正确的名称(目录 - 命名空间,文件名 - 类名)。尝试验证自动加载无法正常工作的原因。
  • 由作曲家自动加载加载的类,我使用命名空间
  • “Dave Chen”的回复将解决您的问题。在您的 $a 变量前加上 Test 类的命名空间。 $a = '\TESTNAMESPACE\' 。 “测试”。
猜你喜欢
  • 1970-01-01
  • 2015-03-19
  • 2012-01-22
  • 2018-03-27
  • 2020-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多