我正在尝试在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
应在某处声明为以下三个之一:
-
public $propertyName;
(甚至可以在课堂外使用) -
private $propertyName;
(只能在同一类中使用) -
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
当你调用一个类时,它会自动加载它。