通过字符串PHP调用类

时间:2014-12-12 08:40:48

标签: php laravel

我通过函数参数传递的字符串变量调用类。

  

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;没找到。

有什么想法吗?

2 个答案:

答案 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 );
        }

此处可运行代码:http://runnable.com/VIqy4CDePeY-AeMV/output