2013-09-14 4 views
0

У меня есть небольшая проблема:Проверьте переменный устанавливаются в вызове функции

<?=$this->bs_forms->text_input('last_name','Name', $user->last_name);?> 

Если последний переменный $ пользователя, не существует в настоящее время я получить некоторые ошибки PHP. Мое решение было таким:

<?=$this->bs_forms->text_input('last_name','Last Name', (isset($user))? $user->last_name : NULL);?> 

Но это кажется немного взломанным. Есть лучший способ сделать это?

+0

почему необходимо в вызове функции? –

+0

Этот вопрос будет улучшен путем добавления точного сообщения об ошибке, которое вы получите. Это позволило бы людям с подобными проблемами найти ваш вопрос (и связанные с ним ответы) в будущем. –

ответ

1
//Ultimate  
     (isset($user))? $user->last_name : NULL) 
//Best 
+0

Я не думаю, что это имеет какое-либо отношение к необязательным аргументам. Вопрос заключается в том, чтобы иметь дело с переменной в вызывающем, которая не может быть установлена. – Barmar

+0

делает этот вопрос, показывает любого вызывающего абонента –

+0

Да. Он показывает код, вызывающий функцию 'text_input()'. Проблема в том, что '$ user' не может быть установлен при выполнении этого вызова, что вызывает ошибку, когда он пытается передать' $ user-> last_name' в качестве аргумента. – Barmar

0

Вы можете использовать РНР ошибок подавления модификатора:

<?=$this->bs_forms->text_input('last_name','Name', @$user->last_name);?> 
0

Есть другие способы сделать это, но они не являются какой-либо «лучше», чем друг-друга. PHP дает вам сообщение об ошибке, и ваше предлагаемое решение на самом деле не устраняет проблему, оно просто добавляет немного кода, чтобы избежать его запуска.

Фактическая ошибка, о которой PHP пытается рассказать вам, заключается в том, что вы попали в ситуацию, когда пытаетесь выполнить строку кода, не зная состояния тех вещей, которые вы передаете в нее. Вкратце: PHP жалуется, что $user не определено, потому что вы на самом деле не определили какое-либо значение для $user.

Есть несколько решений здесь, имеющих равную юридическую силу (и все по существу разные способы сделать ту же самую основную вещь):

  • Убедитесь, что этот бит кода не будет вызвана, если $user не определен. Я ожидаю, что у вас на самом деле есть несколько похожих строк, поэтому вы можете разделить все эти два на более крупные «если определены $user» и «если не определены».
  • Загрузите массив «значений по умолчанию», чтобы передать, и не переопределяют значения этих умолчанию, если $user не определен
  • Убедитесь, что $user всегда определяется, но загрузить его со значениями по умолчанию, если реальный $user Безразлично» t существует.
+0

Думаю, вы делаете это хуже, чем есть. Это не редкость оставлять переменную вроде этого неустановленной и разрешить код по умолчанию разумно. Функция 'text_input()', вероятно, использует этот аргумент как значение по умолчанию в поле ввода; если он не установлен, просто нет значения по умолчанию. – Barmar

+0

Причина, по которой она может быть пустой, состоит в том, что я дважды использую одну и ту же форму. 1. для регистрации пользователя, и в этом случае для пользователя не будет никаких значений, так как у пользователя еще нет записи в Db. 2. Если зарегистрированный пользователь хочет изменить данные своей учетной записи, я загружаю форму и заполняю ее значениями, хранящимися в БД, данные пользователя хранятся в объекте $ user. – Jursels

+0

Обычно считается неправильной практикой ссылаться на переменную, которая «может или не может быть» определена (поэтому PHP дает ошибку, а не игнорирует ее). Явное указание поведения в ситуациях, когда значение не было задано, вместо того, чтобы полагаться на внутренности как языка программирования, так и вызываемой функции, делает код более читаемым. Использование передовой практики, а не шаблон шаблона для устранения ошибок, также предотвращает проскальзывание фактических ошибок (чаще всего в этом случае: опечатки). –

0

(isset ($ user))? $ User-> last_name: NULL)

Здесь ошибка возможно - "Попытка получить имущество не-объект"

Лучший способ:

(isset($user->last_name))? $user->last_name : NULL) 

PS. Использовать @ - плохая практика

+0

Если ваш код имеет инвариант _ $, пользователь либо не определен, либо настроен на объект User_, эти две формы по существу эквивалентны. Вероятно, вам нужно сообщить об ошибке, если для '$ user' установлено значение, отличное от' User'. – Barmar

Смежные вопросы