我通过函数参数传递的字符串变量调用类。
ApiTester.php
use MyApp\Sites\Site;
abstract class ApiTester extends TestCase() {
/**
* Make a new record in the DB
*
* @param $type
* @param array $fields
* @throws BadMethodCallException
*/
protected function make($type, array $fields = [])
{
while($this->times--)
{
$stub = array_merge($this->getStub(), $fields);
$type::create($stub);
}
}
SitesTester.php
class SitesTester extends ApiTester() {
/** @test */
public function it_fetches_a_single_site()
{
// arrange
$this->make('Site');
// act
$site = $this->getJson('api/v1/sites/1')->data;
// assertion
$this->assertResponseOk();
$this->assertObjectHasAttributes($site, 'name', 'address');
}
Site.php // Eloquent Model
namespace MyApp\Sites;
class Site extends \Eloquent {
}
但是,如果我调用字符串变量$type
包含的类,例如;字符串变量$type
包含'网站',它表示类'网站'没找到。
我尝试手动输入Site::create($stub)
并最终接受它。
我也试过了
call_user_func($type::create(), $stub);
和
$model = new $type;
$model->create($stub);
但不幸的是,它说的是“网站”#39;没找到。
有什么想法吗?
答案 0 :(得分:0)
你快到了:
class X {
static function foo($arg) {
return 'hi ' . $arg;
}
};
$cls = 'X';
print call_user_func("$cls::foo", 'there');
如果你的php很老(我认为是<5.3),你必须使用数组:
print call_user_func(array($cls, "foo"), 'there');
答案 1 :(得分:0)
您可能希望使用以下内容替换static class call
:
while( $this->times-- )
{
$stub = array_merge( $this->getStub(), $fields );
call_user_func( "$type::create", $stub );
}