gpt4 book ai didi

PHP:从变量实例化一个类奇怪地失败了

转载 作者:行者123 更新时间:2023-12-04 09:13:15 25 4
gpt4 key购买 nike

我正在尝试通过变量实例化一个类(Laravel3 Eloquent 模型),但我收到一条错误消息,提示找不到该类。
但是,当我对类名进行硬编码时,它工作得很好。
(仅供引用,在下面的代码中,$contact_type 应该是电话、传真或电子邮件。)

这是我目前正在玩的东西:

    foreach( $input AS $contact_type => $contact_info )
{
foreach( $contact_info AS $data )
{
$obj = new $contact_type( (array)$data);
echo'<pre>Obj: ',print_r($obj),'</pre>'; // <----- For Testing
}
}

当我运行上面的代码时,它会抛出一个“未找到类‘Phone’”错误。
当我将 new $contact_type() 替换为 new Phone()(或传真或电子邮件)时,它工作正常。
我敢打赌我只是在看一些简单的东西 :) 我错过了什么?
请帮忙!

最佳答案

涵盖此内容的相关手册条目是 herehere .引用第二个链接:

If a string containing the name of a class is used with new, a new instance of that class will be created. If the class is in a namespace, its fully qualified name must be used when doing this.

这对我有用:

class Phone {}
$classtype = 'Phone';
$phone = new $classtype();
var_dump($phone);

产生输出:

object(Phone)#1 (0) {
}

确保您不在命名空间中(如果是,请在字符串中包含 Phone 类的命名空间)。或者,您也可以尝试使用反射:

class Phone {}
$classtype = 'Phone';
$reflectionClass = new ReflectionClass($classtype);
$phone = $reflectionClass->newInstanceArgs();
var_dump($phone);

如果 Phone 类在命名空间中,这也有效:

Phone.php

<?php namespace Contact;

class Phone {}

test.php

<?php

include 'Phone.php';

$classtype = 'Contact\Phone';
$phone = new $classtype();
var_dump($phone);

我不是 100% 确定为什么,尽管我怀疑在评估变量类名时当前命名空间映射不可见。考虑这段代码:

<?php namespace Foo;

use SomePackage\SomeClass as WeirdName;

$test = new WeirdName();

比较一下:

<?php namespace Foo;

use SomePackage\SomeClass as WeirdName;

$class = 'WeirdName';
$test = new $class();

当 PHP 决定为新实例分配内存时,它如何知道将 WeirdName 的类名别名映射到 SomePackage\Someclass?该别名仅对当前文件有效,实际执行该操作的代码甚至不在 userland 中。代码,更不用说同一个文件了。

关于PHP:从变量实例化一个类奇怪地失败了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20908496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com