Я пытаюсь динамически создавать свойства моего производного класса тестового случая внутри 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 или выше?
Попробуйте установить переменную с чем-то статичным. Если это работает, попробуйте сначала поместить выходные данные метода во временную переменную.
Вы пробовали следующее:
$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
Когда вы вызываете класс, он автоматически загружает его.