Задать вопрос
@IdFox

Как динамически создать переменную PHP класса?

Всем привет

Подскажите как создать переменную класса в цикле?
Т.е например имеем

<?php

class FormCompany extends Model {
    
    public $promo1_id, $promo2_id, $promo3_id;
    
}

?>


Как эти переменные можно создать в цикле?
Если пробую в __construct указать $this->promo1_id = 111; тогда ругается, что нет такой переменной
Цикл в самом классе (после class сразу же) делать тоже нельзя
Как просто создать переменную (вне класса) - все понятно и вопросов нет, а в классе никак не пойму как их динамически объявить (
В общем смысл вопроса - как создать эти три переменные (объявить их и присвоить значение) в цикле
Спасибо за ответы

P.S
В общем выяснилось, что проблемма с YII2
На самом PHP (чистом) все создается вполне нормально

<?php

error_reporting(E_ALL);
ini_set('display_error', 1);

class FormCompany {

public function __construct() {

$this->{'promo7_id'} = 111;

echo 'val: ' . $this->promo7_id;

}

}

$test = new FormCompany();

?>


Если используется YII2, тогда только решение ниже
Хотя как мне кажется, оно тоже не совсем красивое...
  • Вопрос задан
  • 2271 просмотр
Подписаться 1 Средний 3 комментария
Решения вопроса 1
wielski
@wielski
✔ Совет: Вам помогли? Отметьте ответы решением.
PHP не запрещает делать так, но у YII свои заморочки, и чертики в голове.
Можно (но не стоит) так:
class FormCompany extends Model {
  public $promo;

  public function __construct(){
    $this->promo = (object)[];
    for($i = 1; $i < 10; $i++){
      $this->promo->{'var' . $i} = rand(0, 10);
    }
  }

}


Решение довольно громоздское (для Yii2), но переназначение стандартных сеттеров и геттеров - единственное решение.
private $_attributes = ['test' => null]; //объвляем приватную переменную где будем объявлять без особых проблем переменные, и хранить их данные

    public function __get($name){
       if (array_key_exists($name, $this->_attributes)) //если переменная объявлена в нашем магическом массиве - выводим его значение
           return $this->_attributes[$name];

       return parent::__get($name); //либо стандартное
   }

   public function __set($name, $value){
       if (array_key_exists($name, $this->_attributes)) //аналог __get, только устанавливаем значение
           $this->_attributes[$name] = $value;

       else parent::__set($name, $value); //ну дефолтная установка значения
   }

   public function __construct(){
        parent::__construct(); //обязательно для Yii2, да и вообще в ООП при переназначении функций
        $this->__set('test', 'test'); // устанавливаем значение test
        $this->_attributes['newAttr'] = null; // объявляем новое значение
        $this->__set('newAttr', 'test value'); // и устанавливаем его значение
        $this->_attributes['newAttr'] = 'test value'; // хотя можно и так, как вам удобнее
   }


Если не хотите захламлять код - опять же попробуйте впихнуть все это в хелпер, и через use подключить в модели.
Из view получаем как обычный параметр (к примеру Yii::$app->user->identity->test)
Из класса через $this->__get('test')
Удачи!
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Melkij
@Melkij
PostgreSQL DBA
Если пробую в __construct указать $this->promo1_id = 111; тогда ругается, что нет такой переменной

Вопрос не к PHP, а к вашему конкретному классу Model (видимо, какого-то фреймворка).
PHP позволяет в любой момент и из любого места добавить любое новое свойство объекту.
Ответ написан
nskarl
@nskarl
Вообще дизайнер
class FormCompany extends Model {
	
	public $promo1_id = null;

	public function __construct()
	{
		$this->promo1_id = 111;
	}

	public function some()
	{
		print_r($this->promo1_id);
	}

}
Ответ написан
bitver
@bitver
Какое сложное решение вы отметили....
public function attributes()
    {
        return array_merge(parent::attributes(), [
            'test1', 'test2'
        ]);
    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы