创造&使用$ this关键字动态设置PHP对象属性

时间:2014-12-16 17:39:40

标签: php properties mocking phpunit this

我正在尝试在setUp方法中动态创建我的测试用例衍生类的属性,但是我正在努力工作。

$folder = dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'classes';
foreach ( scandir($folder) as $filename ) {
    $path = $folder . DIRECTORY_SEPARATOR . $filename;
    if ( is_file( $path ) ) {
        $nameExtSplit = explode('.', $filename);
        $namePrefixSplit = explode('Hf', $nameExtSplit[0]);
        $propertyName = 'Mock'.$namePrefixSplit[1];
        // $propertyName is getting set correctly—I've checked
        $this->{$propertyName} = $this->makeMock($nameExtSplit[0]);
    }
}

我已尝试$this->$propertyName$this->{$propertyName}$this[$propertyName],但都无济于事。

我找到this question,但他动态设置属性,而不是创建设置它们。

如何在对象中动态创建属性?

编辑:更多详情:

此代码位于扩展PHPUnit TestCase类的类中,并从中派生所有测试类。我正在尝试将我的每个类的模拟自动加载到我的自定义TestCase类的受保护属性中。我正在尝试这样做,所以我不需要编辑我的TestCase就可以为新创建的类提供模拟。

3 个答案:

答案 0 :(得分:1)

使用重载: http://php.net/manual/en/language.oop5.overloading.php#object.set

您将拥有数据的数组属性,并使用__set(),__ get(),__ isset()和__unset()魔术方法。

示例1应该是您正在尝试做的事情。将这些方法添加到您的班级。

您也可以直接调用__set方法

$this->__set($propertyName, $this->makeMock($nameExtSplit[0]));

答案 1 :(得分:0)

您使用的是PHP 5.4或更高版本吗? 尝试使用静态设置var。如果可行,请先尝试将方法的输出放在临时变量中。

答案 2 :(得分:0)

您是否尝试过以下操作:

$this->propertyName;

变量$propertyName应在某处声明为以下三种之一:

  1. public $propertyName;(甚至可以在课外使用)
  2. private $propertyName;(只能在同一个班级中使用)
  3. protected $propertyName;(可以在同一个班级和扩展班级中使用)
  4. 在同一个班级。

    示例:

    <?php
    class setUp {
       public $propertyName;
    
       function folders() {
          $folder = dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'classes';
          foreach ( scandir($folder) as $filename ) {
            $path = $folder . DIRECTORY_SEPARATOR . $filename;
              if ( is_file( $path ) ) {
                $nameExtSplit = explode('.', $filename);
                $namePrefixSplit = explode('Hf', $nameExtSplit[0]);
                $propertyName = 'Mock'.$namePrefixSplit[1];
                // $propertyName is getting set correctly—I've checked
                $this->propertyName = $this->makeMock($nameExtSplit[0]);
             }
          }   
       }
    }
    

    <强>更新

    spl_autoload_register(function( $class ) {
        include_once '/classes/'.$class.'.php';
    });
    
    $user = new User(); // Will load: /classes/User.php
    

    当你打电话给一个班级时,它会自动加载它。