如何通过从字符串创建类将参数传递给类

时间:2014-06-28 08:41:12

标签: php class

我的问题标题可能在逻辑上是错误的,因为我不知道如何解释它:)

以下是我需要的例子。我有一个主要的classe和另外两个这个大师班创建的类。这两个类有带参数的构造函数,我不知道如何传递这些参数。

class Master {

    function __construct() {
        $this->setup_settings();
        $this->load_classes();
    }

    public function setup_settings() {
        $this->settings['classes'] = array( 'Class_A', 'Class_B' );
    }

    public function load_classes() {
        foreach( $this->settings['classes'] as $class) {
            new $class; //Here are problem!
        }
    }

}

class Class_A {

    function __construct( $setiings ) {
        $this->settings = $settings;
    }

}
class Class_B {

    function __construct( $setiings ) {
        $this->settings = $settings;
    }

}

在这种情况下,我遇到了错误:

Warning: Missing argument 1 for Class_A ::__construct()

我明白为什么会这样。但是如何以这种方式将参数传递给这个类(当类名在数组中时)?当我创建字符串并传递它时,我有一个错误:类不能转换为字符串。

3 个答案:

答案 0 :(得分:1)

你忘了parens ($args)中的论据。

$instance = new $objectName($args);

ClassAClassB都有构造函数,这些构造函数需要一个名为$settings的参数。顺便说一下,你把它拼错了。

答案 1 :(得分:1)

如果你编写新的Class_A()而不是$ class,你会初始化对象:

public function load_classes() {
    foreach ($this->settings['classes'] as $class) {
        $obj = new $class($this->settings);
    }
}

答案 2 :(得分:1)

首先,您需要在此处修改变量名称:

class Class_A {

    function __construct( $settings // not setiings ) {
        $this->settings = $settings;
    }

}
class Class_B {

    function __construct( $settings // not setiings ) {
        $this->settings = $settings;
    }

}

为了将变量传递给类,您可以执行以下操作:

public function load_classes() {
        foreach( $this->settings['classes'] as $class) {
            new $class('helloworld'); // or any variable you'd like
        }
    }

但是,请注意,由于您正在创建新类,但未将其分配给任何变量,因此您可能无法看到结果。

如果您想查看结果,请尝试使用此选项:

class Master {
    private $result;

    function __construct() {
        $this->setup_settings();
        $result = $this->load_classes();
        $this->result = $result;
    }

    public function getResult()
   {
        return $this->result;
   }

    public function setup_settings() {
        $this->settings['classes'] = array( 'Class_A', 'Class_B' );
    }

    public function load_classes() {
        foreach( $this->settings['classes'] as $class) {
            $a = new $class('hello');
        $arr[] = $a; // store it in an array
        }

        return $arr; // return the array
    }

}

class Class_A {

    function __construct( $settings ) {
        $this->settings = $settings;
    }

}
class Class_B {

    function __construct( $settings ) {
        $this->settings = $settings;
    }
}

$master = new Master();
var_dump($master->getResult());