За последние 24 часа нас посетили 15782 программиста и 1635 роботов. Сейчас ищут 950 программистов ...

Проблема проверки переменной на пустоту

Тема в разделе "Прочие вопросы по PHP", создана пользователем lanzs, 24 фев 2010.

  1. lanzs

    lanzs Активный пользователь

    С нами с:
    8 окт 2008
    Сообщения:
    21
    Симпатии:
    0
    Начал писать проект.
    Пока все на начальной стадии, но уже и тут столкнулся с проблемой: ну никак не хочет работать проверка переменной на пустоту:

    PHP:
    1.  
    2. private function CheckEmpty($element) {
    3.         if(!empty($element)) return $element;
    4.         else {
    5.         echo "Error 2: Empty var occure <br>";
    6.         $this->SetError("Empty var occure: $element", 2);
    7.         exit;
    8.         }
    9.     }
    10.  
    ставит ошибку и все тут!

    эта функция вызывается в функции проверки переменной:

    PHP:
    1.  
    2. public function CheckName($name="") {
    3.         $name = trim($name);
    4.         $name = htmlspecialchars($name);
    5.         $this->CheckEmpty($name);
    6.         return $name;
    7.     }
    8.  
    вобщем никак не могу разобрать почему не хочет работать...

    з.ы. это все для проверки введенных данных при регистрации.. может кто более рациональный способ знает..
     
  2. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Ты взялся писать проект, ничерта не понимания ни об ООП, ни о передаче переменных.
    Во-первых, ты никогда не сможешь реально проверить существование переменной, передавая её в какую-либо функцию.
    Объясняю: передавая несуществующую переменную в функцию, передаётся её значение. Если передавать ссылку на переменную, то при этом СОЗДАЁТСЯ переменная и, разумеется, вернется true.

    Если же идет речь о проверке property класса, то делается это другим способом - через интернальную переменную this.
     
  3. lanzs

    lanzs Активный пользователь

    С нами с:
    8 окт 2008
    Сообщения:
    21
    Симпатии:
    0
    действительно, понимание ООП пока оставляет желать лучшего. Поэтому и взялся писать пробный проект, даже лучше сказать не проект, а набор классов... Если кого-то что-то задевает, что человек который только разбирается с ООП взялся писать проект - могу утешить - проект мой собственный, т.е. пишу сам для себя, для того, чтобы разобраться с ООП.

    Про передачу переменных: естественно нужно проверять значение переменной, которое и передается из функции в функцию. Изначально же в функции и посылается значение переменной, которое должно провериться и вернуться. Вопрос в другом:
    почему в данном конкретном случае не работает if(!empty($element)) ?!
     
  4. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    var_dump($element);
    и все будет видно
     
  5. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Я напишу код, попробуй самостоятельно разобраться:

    PHP:
    1. //<?
    2.  
    3. private function CheckEmpty($element) {
    4.     if(!$element) {
    5.         echo "Error 2: Empty var occure <br>";
    6.         $this->SetError("Empty var occure: $element", 2);
    7.         exit;
    8.     } else return $element
    9. }
     
  6. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Apple
    а я думал ты злой барадатый карабас-барабас ) оказывается нет :D
     
  7. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Apple
    причем тут ссылки к empty ?
     
  8. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Оставлю вопрос без ответа в виду его очевидности для человека такого уровня =)

    Увы, не оправдал надежд.
     
  9. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Apple
    не знаю, может я просто сильно сегодня запарился с этими техническими текстами на работе, но, честно говоря не понял ни намёка ни не намёка ни смысла...
     
  10. lanzs

    lanzs Активный пользователь

    С нами с:
    8 окт 2008
    Сообщения:
    21
    Симпатии:
    0
    ...в который раз уже случается такое... когда ошибка в элементарном: изначально в форме стояло одно поле под пароль с именем 'pass'
    но потом я решил, что нужно два поля под пароль (сверять одно с другим..чтобы от опечаток оградиться)

    получал значения переменных по именам pass1 и pass2, а сам забыл изменить имена у <input>`ов :) в итоге было два поля с именами pass

    вариант с
    PHP:
    1.  
    2.  private function CheckEmpty($element) {
    3.          if(!empty($element)) return $element;
    4.          else {
    5.          echo "Error 2: Empty var occure <br>";
    6.          $this->SetError("Empty var occure: $element", 2);
    7.          exit;
    8.          }
    9.      }
    10.  
    работает исправно. дело все было в том, что проверяя полученные переменные, функция исправно доходила до "паролей", после чего говорила, что поля пустые, ставила ошибку и все!
    помогло увидеть этот недосмотр var_dump - спасибо)

    ..но все же остался вопрос:
    почему так вернее:
    PHP:
    1.  
    2.  private function CheckEmpty($element) {
    3.      if(!$element) {
    4.          echo "Error 2: Empty var occure <br>";
    5.          $this->SetError("Empty var occure: $element", 2);
    6.          exit;
    7.      } else return $element
    8.  }
    9.  
    ?
    или не вернее?
    что-то пытаясь разобраться с этим примером - все больше прихожу к тому, что они схожи, только подходят "с разных сторон"... или в этом и есть главное отличие, характерное для ООП ??
     
  11. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    прочитай в мануале что проверяется с помощью empty
     
  12. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    lanzs
    Рассмотрим следующие примеры:

    PHP:
    1. <?php
    2.  
    3.  
    4. // Рассмотрим такой вариант
    5. if(empty($foo)) echo "'foo' does not exist<br />";
    6.  
    7. // Следующий вариант уже неверный
    8. if(!$bar) echo "'bar' does not exist<br />";
    9.  
    10. // Следующие два варианта идентичны
    11. $empty = array();
    12.  
    13. if(!$empty) echo "Variable is empty<br />";
    14. if(empty($empty)) echo "Variable is empty<br />";
    15.  
    16. ?>
     
  13. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Тут такой момент, что empty - языковая конструкция, возвращающая true только и только в том случае, если переменная эквивалентна приведенному типу данных bool(false), или этой переменной не существует.
    Т.е все случаи, когда массив пуст, значение 0 или тому подобное, то empty вернет true, но вернет она true так же в том случае, если переменная не декларирована.
     
  14. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Более сложный пример для раздумий:

    PHP:
    1. <?php
    2.  
    3. /**
    4.  * Попробуем имитировать проверку переменной.
    5.  * Будем помнить, что РНР не С++ и не требует предварительной
    6.  * инициализации переменной.
    7.  */
    8.  
    9. // Функция проверки существования переменной
    10. function var_exists(&$varname) {
    11.     return isset($varname);
    12. }
    13.  
    14. // Декларация переменной
    15. $foo; // Она всё ещё не существует
    16.  
    17. // Проверяем это нашей функцией
    18. var_dump(var_exists($foo));
    19. var_dump(empty($foo)); // вернет true
    20.  
    21. // Инициализация переменной $foo
    22. $foo = 0;
    23.  
    24. var_dump(var_exists($foo)); // вернет true
    25. var_dump(empty($foo)); // Внимание! тоже true
    26.  
    27. ?>
     
  15. lanzs

    lanzs Активный пользователь

    С нами с:
    8 окт 2008
    Сообщения:
    21
    Симпатии:
    0
    Apple, спасибо за столь развернутый ответ
    я подходил ко всему на более примитивном уровне..буду переосмысливать и переучиваться :)
     
  16. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    PHP:
    1. if (is_null(&$a)) echo 'Пусто';
    =)