Создание & amp; динамическое задание свойств объекта PHP с помощью ключевого слова $ 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]все безрезультатно.

я нашел этот вопрос, но он динамически установка свойства вместо создания а также устанавливая их.

Как я могу динамически создавать свойства внутри объекта?

РЕДАКТИРОВАТЬ: Больше деталей:

Этот код находится внутри класса, который расширяет класс PHPUnit TestCase и является источником всех моих тестовых классов. Я пытаюсь загрузить макет каждого из моих классов в защищенные свойства моего пользовательского класса TestCase. Я пытаюсь сделать так, чтобы мне не нужно было редактировать свой TestCase, чтобы макет был доступен для вновь созданного класса.

0

Решение

Используйте перегрузку:
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

Другие решения

Вы используете PHP 5.4 или выше?
Попробуйте установить переменную с чем-то статичным. Если это работает, попробуйте сначала поместить выходные данные метода во временную переменную.

0

Вы пробовали следующее:

$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

Когда вы вызываете класс, он автоматически загружает его.

0
По вопросам рекламы [email protected]