我正在尝试在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就可以为新创建的类提供模拟。
答案 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
应在某处声明为以下三种之一:
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
当你打电话给一个班级时,它会自动加载它。