arturweb01
@arturweb01

Как достать переменную из класса в var_dump (код внутри)?

Есть реализованная вот такая фабрика:

$role = $_SESSION['role'];
	class admin {
		protected $addItem = true;
		protected $editItem = true;
		protected $deleteItem = true;
	}
	class moderator {
		protected $addItem = true;
		protected $editItem = true;
		protected $deleteItem = false;
	}
	class publicator {
		protected $addItem = true;
		protected $editItem = false;
		protected $deleteItem = false;
	}

	class Factory{
		public static function createUsers($role){
			if(class_exists($role))
				return new $role;
			else
				echo ("Роль".$role."отсутствует");
		}
	}

	$login = Factory::createUsers($role);
	var_dump($login);


Как в нем из var_dump($login) достать значение переменных соответствующего класса?
Или возможно напрямую из $login это сделать?
  • Вопрос задан
  • 268 просмотров
Пригласить эксперта
Ответы на вопрос 2
Добавь для каждого из поле геттер вида:
public function hasAddItemPermission()
    {
        return $this->addItem;
    }


И используй его для проверок.

А если прямо так критично получать из var_dump, то можно и по рофлить:
class moderator {
    protected $addItem = true;
    protected $editItem = true;
    protected $deleteItem = false;
}
  
$testRole = new moderator();
  
  
ob_start();
var_dump($testRole);
$vraDumpedRole = ob_get_clean();
    
preg_match_all('/bool\((true|false)\)/', $vraDumpedRole, $match);
    
list($addItem, $editItem, $deleteItem) = $match[1];
    
var_dump($addItem);
var_dump($editItem);
var_dump($deleteItem);
Ответ написан
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Артур,
Но вопрос в том, насколько это правильно, с точки зрения паттерна фабричного метода.
Чет вы сильно путаете теплое с мягким... Внутренняя реализация классов созданных фабрикой НИКАК не влияет на "фабричность". Паттерн относится только к методу создания готовых объектов по определенным условиям. Какие это объекты вообще не суть важно. По сути они могут быть абсолютно разные, просто по логике чаще всего это однотипные объекты, отличающиеся в настройках или внутренней реализации (например все они реализуют один интерфейс, но внутри работают по разному).

Что касается вашего кода - как я уже сказал, для вашего случая(проверки доступа для текущей роли) достаточно задать метод проверки доступа. Как то так:
//$role = $_SESSION['role'];
$role = 'moderator';
  class Role{
     public function checkPermission($action)
     {
         if(isset ($this->$action))
         {
           return $this->$action;
           }
          return false;
   }
}

  class admin extends Role{
    protected $addItem = true;
    protected $editItem = true;
    protected $deleteItem = true;
  }
  class moderator  extends Role{
    protected $addItem = true;
    protected $editItem = true;
    protected $deleteItem = false;
  }
  class publicator  extends Role{
    protected $addItem = true;
    protected $editItem = false;
    protected $deleteItem = false;
  }

  class Factory{
    public static function createUsers($role) : Role{
      if(class_exists($role))
        return new $role;
      else
        echo ("Роль".$role."отсутствует");
    }
  }

  $login = Factory::createUsers($role);
  var_dump($login);
   
// try to use in code:
  if ($login->checkPermission('editItem')){
     echo 'lets edit!';
  };
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы