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


Creating & setting PHP object properties dynamically using $this keyword

我正在尝试在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],都无济于事。

我发现了这个问题,但他正在动态设置属性,而不是创建和设置它们。

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

编辑:更多详细信息:

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

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

你将有一个用于数据的数组属性,并使用 __set()、__get()、__isset() 和 __unset() 魔术方法。

示例 1 应该正是您要尝试执行的操作。 将这些方法添加到类中。

您也可以直接调用 __set 方法

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

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

您是否尝试过以下方法:

$this->propertyName;

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

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

在同一个班级。

例:

<?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

当你调用一个类时,它会自动加载它。