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

问题描述 投票:2回答:2

我正在尝试通过变量实例化一个类(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
        }
    }

当我如上所述运行代码时,它抛出“ Class'Phone'not found”“错误。当我将new $contact_type()替换为new Phone()(或传真或电子邮件)时,它可以正常工作。我敢打赌,有一些简单的事情我正在查看:)我想念的是什么?请帮助!

php laravel instantiation eloquent laravel-3
2个回答
6
投票

涉及此的相关手册条目是herehere。引用第二个链接:

如果包含类名称的字符串与new一起使用,则将创建该类的新实例。如果该类在名称空间中,则在执行此操作时必须使用其完全限定名称。

这对我有用:

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代码中也无效,更不用说在同一个文件中了。


0
投票

我不知道我在这里问是否合适。在来到这里之前,我尝试了上述解决方案,但均无效果。

在我的本地计算机上,运行Win 10,PHP 7.4,以下代码可以运行,但即使在我的生产服务器上都具有相同的PHP版本,也无法在生产服务器上使用。

<?php
use controller\Admin;

$ct_name = 'controller'. DIRECTORY_SEPARATOR . ucfirst($this->url[0]);

$controller = new $ct_name();

我以前尝试过某些可行的方法,但我不记得自己做了什么。我同意

© www.soinside.com 2019 - 2024. All rights reserved.