mOr*_*off 2 php instantiation laravel eloquent laravel-3
我正在尝试通过变量实例化一个类(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
}
}
Run Code Online (Sandbox Code Playgroud)
当我如上所述运行代码时,它将引发“找不到类'Phone'”错误。
当我替换new $contact_type()为new Phone()(或传真或电子邮件)时,它可以正常工作。
我敢打赌,有一些简单的事情我正在查看:)我想念的是什么?
请帮忙!
如果将包含类名称的字符串与new一起使用,则将创建该类的新实例。如果该类在名称空间中,则在执行此操作时必须使用其完全限定名称。
这对我有用:
class Phone {}
$classtype = 'Phone';
$phone = new $classtype();
var_dump($phone);
Run Code Online (Sandbox Code Playgroud)
产生输出:
object(Phone)#1 (0) {
}
Run Code Online (Sandbox Code Playgroud)
请确保您不在名称空间中(如果在字符串中,请包含Phone类的名称空间)。或者,您也可以尝试使用反射:
class Phone {}
$classtype = 'Phone';
$reflectionClass = new ReflectionClass($classtype);
$phone = $reflectionClass->newInstanceArgs();
var_dump($phone);
Run Code Online (Sandbox Code Playgroud)
如果Phone类在名称空间中,则此方法也适用:
Phone.php
<?php namespace Contact;
class Phone {}
Run Code Online (Sandbox Code Playgroud)
test.php
<?php
include 'Phone.php';
$classtype = 'Contact\Phone';
$phone = new $classtype();
var_dump($phone);
Run Code Online (Sandbox Code Playgroud)
尽管不确定在评估变量类名时当前的名称空间映射不可见,但我不确定100%为什么。考虑以下代码:
<?php namespace Foo;
use SomePackage\SomeClass as WeirdName;
$test = new WeirdName();
Run Code Online (Sandbox Code Playgroud)
与以下内容进行比较:
<?php namespace Foo;
use SomePackage\SomeClass as WeirdName;
$class = 'WeirdName';
$test = new $class();
Run Code Online (Sandbox Code Playgroud)
当PHP决定为新实例分配内存时,它将如何知道将类名别名映射WeirdName到SomePackage\Someclass?该别名仅对当前文件有效,而实际上执行该操作的代码甚至不在用户区代码中,更不用说同一文件了。
| 归档时间: |
|
| 查看次数: |
2055 次 |
| 最近记录: |