Попытка доступа к закрытой переменной с помощью метода __get () возвращает ноль - PullRequest
1 голос
/ 21 марта 2012

Используя PHP 5.3, я в настоящее время пишу приложение MVC, и мне нужно извлечь данные, которые были переданы в модель для проверки, и отправить обратно в представление для повторного заполнения формы при ошибке.

поля в модели помечены как закрытые и доступны только в том случае, если они появляются в списке fieldNames (поэтому контроллеры не могут пытаться изменить содержимое других «бизнес» полей в классе.

В контроллереобласть с пометкой «BUG» ниже, попытка доступа к закрытому полю приводит только к тому, что создается элемент массива, но устанавливается значение NULL, а не значение. В моем отладчике, если я проверяю поле источника ($ templateM -> $ field)) показывает правильное значение.

Что происходит?

В базовом классе модели:

class model {

protected $fieldNames;

public function __get($name)
{
    if ($name === 'fieldNames')
        return $this->fieldNames; // Special exception for getting the list of fields
    if ($name === 'errorList')
        return $this->errorList; // special exception for getting the current errors
    if (in_array($name, (array)$this->fieldNames))
        return $this->$name;
    else
        throw new Exception('Invalid access to private model field');
}
}

В модели:

class template extends model
{
function __construct()
{
    parent::__construct();
    $this->fieldNames = new immutableArray(array('id', 'etc'));
}

private $id = 0;
private $etc = 1;
}

В контроллере:

class templateManager extends controller
{
    function create()
    {
        // Validate form data
  $templateM = getModel('template');
  $templates = array();
  $bodyData = array();
  $bodyData['showSuccess'] = false;

  $result = $templateM->validate();

  if ($result)
  {
      if ($templateM->save())
      {
          $bodyData['showSuccess'] = true;
      }
  }

  // Load present data (post insert)
  $templates = $templateM->getAllAsArray();

  $bodyData['errorMessages'] = (array)$templateM->errorList;

  $formData = array();
  if (count($bodyData['errorMessages']) > 0)
  {
      foreach($templateM->fieldNames as $field)
            {
                $formData[$field] = $templateM->$field; // <- BUG
            }
  }

  $bodyData['formData'] = $formData;

  $bodyData['templateData'] = $templates;
  $this->_drawPage($bodyData);
}

1 Ответ

2 голосов
/ 21 марта 2012

На самом деле я бы порекомендовал вам прекратить злоупотреблять __get().У вас уже есть слишком много if, и этот список будет становиться все длиннее и длиннее.Лучше сделать правильные методы получения и установки.

КАК по причине ваших проблем: Model::__get() не может получить доступ к закрытым переменным.Это сработает, если вы определите их как protected.

. Кроме того, вы можете найти этот наплыв полезнымПо крайней мере, часть "примечаний стороны" этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...