Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Прошу пояснить выражение в коде (из книги авторов сайта)
 
 автор: baston   (19.01.2010 в 12:15)   письмо автору
 
 

Здравствуйте.
Изучая книгу "PHP 5/6. В подлиннике", столкнулся с тем, что не понимаю, как работает код функции dumper(), который приводят авторы книги в качестве инструмента для отладки.
В частности, приводится следующий код:
<?php # Функция для вывода содержимого переменной.
// Распечатывает дамп переменной на экран.
function dumper($obj)
{
    echo 
"<font size=3><pre>",
                
htmlspecialchars(dumperGet($obj)),
                
"</pre></font>";
}
// Возвращает строку - дамп значения переменной в древовидной форме
// (если это массив или объект). В переменной $leftSp хранится
// строка с пробелами, которая будет выводиться слева от текста.
function dumperGet(&$obj$leftSp="")
{
    if (
is_array($obj))
    {
        
$type "Array[".count($obj)."]";
    }
    elseif (
is_object($obj))
    {
        
$type "Object";
    }
    elseif (
gettype($obj) == "boolen")
    {
        return 
$obj"true" "false";
    }
    else
    {
        return 
"\"$obj\"";
    }
    
$buf $type;
    
$leftSp .= "   ";
    for (
Reset($obj); list($k$v) = each($obj);)
    {
        if (
$k === "GLOBALS") continue;
        
$buf .= "\n$leftSp$k => ".dumperGet($v$leftSp);
    }
    return 
$buf;
}
?>

Мне не понятна вот эта связка:
return $obj? "true" : "false";

В книге до этого момента нет объяснения по этому. Что это за знак вопроса и что делает это выражение?
Вроде бы мелочь, но хочется выяснить до конца каждый момент кода.
Спасибо и надеюсь на пояснение.

  Ответить  
 
 автор: Саня   (19.01.2010 в 12:21)   письмо автору
 
   для: baston   (19.01.2010 в 12:15)
 

Буквально несколькими темами ниже: http://softtime.ru/forum/read.php?id_forum=1&id_theme=71143

  Ответить  
 
 автор: baston   (19.01.2010 в 12:27)   письмо автору
 
   для: Саня   (19.01.2010 в 12:21)
 

Если я правильно разобрался в ссылочных ответах, то если тип объекта логический, то возращается true, в противном случае false? Правильно?

  Ответить  
 
 автор: Саня   (19.01.2010 в 12:35)   письмо автору
 
   для: baston   (19.01.2010 в 12:27)
 

Нет. В скобках записывается условие как в операторе if, после вопроса выполняется код, если условие истинное. После двоеточия выполняется код, если условие ложное.

Вот пример. Оба варианта равнозначны:
<?
$var 
'1';

// -- обычный оператор
if ( $var == '1' ) {
  print 
'один';
} else {
  print 
'два';
}

// -- тренарный оператор
print ($var == '1') ? 'один' 'два';

  Ответить  
 
 автор: baston   (19.01.2010 в 12:45)   письмо автору
 
   для: Саня   (19.01.2010 в 12:35)
 

Хорошо, тогда давайте пройдемся по "моему" коду, чтобы уж разобраться до конца.
Вот, что дано:
elseif (gettype($obj) == "boolen")
    {
        return $obj? "true" : "false";

Исходя из логики, мы определяем, что в скобках содержится условие определения типа объекта и сравнение его с типом "boolen".
Тогда, если тип логический, то это условие верно, и возвращаем значение "true", в противном случае - "false".
Почему же тогда вы сказали "нет"? Или я недопонимаю что-то? Тогда, пожалуйста, проясните.
Спасибо.

  Ответить  
 
 автор: Саня   (19.01.2010 в 12:51)   письмо автору
 
   для: baston   (19.01.2010 в 12:45)
 

Это две совершенно разные проверки. Одна проверяет тип переменной, а другая её значение.
Здесь просто выводится значение булевой переменной в текстовом виде, потому что print true напечатает 1, а print false ничего не напечатает и сиди гадай что это — null, пустая строка, целое число или всё же bool.

  Ответить  
 
 автор: baston   (19.01.2010 в 13:23)   письмо автору
 
   для: Саня   (19.01.2010 в 12:51)
 

Прошу простить мою непонятливость, но вот я представил в ином виде это выражение:
$obj = 53 > 12;
if (gettype($obj) == "boolean")
    {
        echo "true";        
    }
else echo "false";

Верно ли я сделал? Если да, то для меня ясны стали условные операции, если нет ...
Но эта же строка
return $obj? "true" : "false";

ничего не проверяет! Она просто возвращает текстовое значение, как и у меня выше.
В чем же мое непонимание?

  Ответить  
 
 автор: Саня   (19.01.2010 в 13:29)   письмо автору
 
   для: baston   (19.01.2010 в 13:23)
 

<?
$obj 
53 12
if (
gettype($obj) == "boolean") { 
  if (
$obj) {
    return 
"true";         
  } else {
    return 
"false";
  }
}

  Ответить  
 
 автор: baston   (19.01.2010 в 13:33)   письмо автору
 
   для: Саня   (19.01.2010 в 13:29)
 

Ок, тогда вопрос такой: зачем нужна вторая проверка? Разве первой проверки выражения в скобках не достаточно?

  Ответить  
 
 автор: sim5   (19.01.2010 в 13:39)   письмо автору
 
   для: baston   (19.01.2010 в 13:33)
 

Первая проверка проверяет тип переменной, а вторая ее значение. Вот что из этого не понятно?

  Ответить  
 
 автор: baston   (19.01.2010 в 13:44)   письмо автору
 
   для: sim5   (19.01.2010 в 13:39)
 

Это просто не очевидно для меня (я недавно изучаю язык, поэтому и задаю такие вопросы). Для меня логика выражения в скобках такова: если левая часть равна правой, то...
Вот для меня и непонятно, почему функция gettype является проверкой? Разве она просто не возвращает точный тип переменной?
Спасибо.

  Ответить  
 
 автор: GeorgeIV   (19.01.2010 в 13:49)   письмо автору
 
   для: baston   (19.01.2010 в 13:44)
 

тип переменной и значение переменной - разные вещи

  Ответить  
 
 автор: baston   (19.01.2010 в 13:58)   письмо автору
 
   для: GeorgeIV   (19.01.2010 в 13:49)
 

Да, конечно, это ясно. Я же спрашиваю о другом - в скобках мы сравниваем возвращаемый тип переменной с текстовым значением. Разве выражение в скобках не возвращает уже готовый результат? На мой взгляд - возвращает. Зачем нужна вторая проверка?
Или я не прав?

  Ответить  
 
 автор: sim5   (19.01.2010 в 13:57)   письмо автору
 
   для: baston   (19.01.2010 в 13:44)
 

В первом условии требуется не возврат типа, а проверка на указанный тип, и если это булевый тип, будет возвращено true, но не как значение этой переменной, а как результат проверки (для условия if), то получить (заметьте, теперь именно получить, а не проверить) значение самой переменной.

  Ответить  
 
 автор: baston   (19.01.2010 в 14:36)   письмо автору
 
   для: sim5   (19.01.2010 в 13:57)
 

Какая-то нелогичная логика...

Получается по-вашему, что выражение в скобках
(gettype($obj) == "boolean")

это двойная проверка: 1) типа переменной, 2) равенства типа и значения?

Функция gettype возвращает тип переменной в виде "boolen" (в нашем случае). Возвращает в виде строки. Это сравнивается со строкой "boolean". Если это сравнение верно, то возвращается true. В первой же скобке. Для чего вторая проверка
if ($obj)
?
Никак не пойму...

  Ответить  
 
 автор: sim5   (19.01.2010 в 14:50)   письмо автору
 
   для: baston   (19.01.2010 в 14:36)
 

Выражение gettype($obj) получает ТИП переменной сравнивает его с нами указанным - "boolean", и если тип будет равен "boolean", то ТОЛЬКО ТЕПЕРЬ ВОЗВРАЩАЕТ TRUE для IF (иначе вернет FALSE). Вот это TRUE/FALSE никакого отношения не имеет к значению самой переменной! Это результат сравнения!

Вторая проверка дает нам возможность получить ЗНАЧЕНИЕ самой булевой переменной в виде строки, и если if ($obj), что равноценно if ($obj == true), то вывести на экран СЛОВО true, иначе будет выведено false.

Выполните вот такое:
<?
$a 
true;
print 
$a;

что получим?

  Ответить  
 
 автор: baston   (19.01.2010 в 14:49)   письмо автору
 
   для: Саня   (19.01.2010 в 13:29)
 

Поясню, что я не понимаю.
Есть выражение:
elseif (gettype($obj) == "boolean")
    {
        return $obj? "true" : "false";

Оно может быть представлено в таком виде (автор: Саня):
$obj = 53 > 12; 
if (gettype($obj) == "boolean") { 
  if ($obj) {
    return "true";         
  } else {
    return "false";
  }
}

А может быть в таком (мое представление):
$obj = 53 > 12;
if (gettype($obj) == "boolean")
    {
        echo "true";        
    }
else echo "false";

Различие вижу в доп.проверке значения $obj (у Сани). Но разве она обязательна, ведь по сути получаем один и тот же результат?

  Ответить  
 
 автор: sim5   (19.01.2010 в 14:54)   письмо автору
 
   для: baston   (19.01.2010 в 14:49)
 

Да, тяжелый случай. Вы знаете как устроен процессор, в общем виде?

  Ответить  
 
 автор: baston   (19.01.2010 в 15:05)   письмо автору
 
   для: sim5   (19.01.2010 в 14:54)
 

Что случай тяжелый, согласен. Но не обижайте гуманитариев.
Приводимое вами разъяснение выше мне понятно, спасибо.
P.S. Вы про "нули и единицы"?

  Ответить  
 
 автор: sim5   (19.01.2010 в 15:22)   письмо автору
 
   для: baston   (19.01.2010 в 15:05)
 

Я не про нули и единцы, если вы о разъяснении выше, я о том, что:
$a = true;
print $a;
на экран ничего не выведет, а в том, в чем вы запутались, необходимо вывести в виде строки именно это самое "true/false" - ЗНАЧЕНИЕ ПЕРЕМЕННОЙ.
А теперь выполните такое:
$a = true;
print gettype($a);
Что получим? Получим на экране boolean. Как вы думаете, это значение переменной?

Если же о процессоре, то все операции над операндами производятся в аккумуляторе и в общем случае результат операции возвращается в аккумулятор. Кроме этого, результат операций может воздействовать на флаговый регистр процессора, устнавливая или сбрасывая его соответствующие флаги (биты).
При операциях сравнения будет сброшен (установлен в 0) флаг Z (zero) флагового регистра, если операнды не равны, и установлен в 1, если равны. Так вот, во время выполнения этого:
if(gettype($obj)=="boolean")
в конечном итоге, мы интересуемся (нам возвращается) не результат аккумулятора (как результат математической операции сравнения (вычитания)), а тем более значение какого либо из сравниваемых операндов, а состояние флага Z флагового регистра. Нам возвращается признак того - равны или нет сравниваемые операнды!

  Ответить  
 
 автор: baston   (19.01.2010 в 15:52)   письмо автору
 
   для: sim5   (19.01.2010 в 15:22)
 

>$a = true;
>print $a;
>на экран ничего не выведет

выведет 1 (не в браузере, а при выполнении в редакторе).

>А теперь выполните такое:
>$a = true;
>print gettype($a);
>Что получим? Получим на экране boolean. Как вы думаете, это значение переменной?

Это тип переменной. А значение - true или false.

Похоже, что я вывел вас из себя своим непониманием - уж простите. Хочется уяснить до мелочей.
Спасибо.

  Ответить  
 
 автор: sim5   (19.01.2010 в 16:03)   письмо автору
 
   для: baston   (19.01.2010 в 15:52)
 

<?
$a 
true;
echo 
"1. Значение переменной равно " $a "<BR>";
//а здесь получаем строковый вид значения булевой переменной,
//которое не может быть выведено способом 1.
echo "2. Значение переменной равно " . ($a "true" "false") . "<BR>"
echo 
"3. Переменная имеет тип " gettype($a);


Именно тип, но не значение! Вы же утверждаете, что нет смысла получать значение, так как первое выражение уже его получает. А это разве так?

Меня трудно вывести из себя, не обольщайтесь ;-) Восклицательные знаки, это не ругань с моей стороны, а способ заострить ваше внимание.

  Ответить  
 
 автор: Николай2357   (19.01.2010 в 16:49)   письмо автору
 
   для: baston   (19.01.2010 в 15:05)
 

Гуманитариям нужно так объяснять.
<? пыхапэ
    
    если
(это коробка с чем нибудь)
    {
        
так и запишем "коробка с "подсчитаем сколько ." штук";
    }
    
а если(это что какое то устройство)
    {    
        
то запишем "устройство";
    }
    
а если(это переключатель)
    {
        
то выполним (включено ли)? "Включено" "Выключено";
    }
    
или
    
{
        
покажемчто же это все таки такое.
    }

  Ответить  
 
 автор: Usta   (19.01.2010 в 21:51)   письмо автору
 
   для: Николай2357   (19.01.2010 в 16:49)
 

>Гуманитариям нужно так объяснять.
><? пыхапэ
>
> если(это коробка с чем нибудь)
> {
> так и запишем - "коробка с ". подсчитаем сколько ." штук";
> }
> а если(это что какое то устройство)
> .........
> }

5 балов, посмеялся. Нас так в школе учили изучать язык программирования. Вы случаем не в школе работаете?

  Ответить  
 
 автор: neadekvat   (19.01.2010 в 21:56)   письмо автору
 
   для: Usta   (19.01.2010 в 21:51)
 

Зря смеетесь.
Порой мозг кипит и приходится на листочек расписывать себе алгоритм работы скрипта на русском языке, а потом все это превращать в код.
По сути - это сначала делается в голове, минуя листок с карандашом. Но не всегда можно удержать в голове все детали алгоритма, поэтому начеркать его схематическое представление хороший выход.

  Ответить  
 
 автор: sim5   (19.01.2010 в 22:07)   письмо автору
 
   для: neadekvat   (19.01.2010 в 21:56)
 

Автор темы не алгоритм не понимает, он не понимает совсем иное.

  Ответить  
 
 автор: neadekvat   (19.01.2010 в 22:11)   письмо автору
 
   для: sim5   (19.01.2010 в 22:07)
 

Автор темы тупит.
Ясно.

  Ответить  
 
 автор: sim5   (19.01.2010 в 22:18)   письмо автору
 
   для: neadekvat   (19.01.2010 в 22:11)
 

:)

  Ответить  
 
 автор: GeorgeIV   (20.01.2010 в 10:07)   письмо автору
 
   для: baston   (19.01.2010 в 14:49)
 

Оно может быть представлено в таком виде (автор: Саня):
$obj = 53 > 12;  
if (gettype($obj) == "boolean") {  
  if ($obj) { 
    return "true";          
  } else { 
    return "false"; 
  } 
}  
А может быть в таком (мое представление):
$obj = 53 > 12; 
if (gettype($obj) == "boolean") 
    { 
        echo "true";         
    } 
else echo "false";  

а попробуйт е так $obj = 53 < 12; и далее по тексту. Что получите?

  Ответить  
 
 автор: baston   (20.01.2010 в 12:04)   письмо автору
 
   для: baston   (19.01.2010 в 12:15)
 

Я рад, что вас повеселил своей темой. Но будете ли вы смеятся над ребенком, только-только изучающего азбуку? Так вот я и есть тот ребенок - в PHP, разумеется.
Если что и не понимаю сейчас, то пойму позже, не сомневайтесь. А прежде чем обвинять в тупости (это реплкика к товарищу neadekvat), вы себя вспомните, когда были такими же "чайниками".

  Ответить  
 
 автор: sim5   (20.01.2010 в 12:08)   письмо автору
 
   для: baston   (20.01.2010 в 12:04)
 

Не обижайтесь, в "тупости" (в прямом смысле этого слова) вас не обвиняют. И всегда помогут на форуме (по мере возможного).
Все рождаются без штанишек, это точно.

  Ответить  
 
 автор: Loki   (20.01.2010 в 12:28)   письмо автору
 
   для: sim5   (20.01.2010 в 12:08)
 

>Все рождаются без штанишек, это точно.
Но некоторые - в рубашке:)

  Ответить  
 
 автор: sim5   (20.01.2010 в 12:30)   письмо автору
 
   для: Loki   (20.01.2010 в 12:28)
 

Бывает. Я даже не сомневаюсь, что вы еще и при галстуке были :)

  Ответить  
 
 автор: neadekvat   (20.01.2010 в 15:28)   письмо автору
 
   для: baston   (20.01.2010 в 12:04)
 

Не стоит обижаться.
"Автор тупит" - не значит, что "Автор тупой", а значит, что "автор не понимает, что 2+2*2 = 6 даже после того, как ему показали это на яблочках, палочках и прочем".
Тупить могут все.
Конкретно вчера я не отстал от вас по "тупизму" и мучал мозг sim5 в соседней, буквально, теме.

  Ответить  
 
 автор: GeorgeIV   (20.01.2010 в 15:52)   письмо автору
 
   для: baston   (20.01.2010 в 12:04)
 

повесилить ладно, а поняли ?

  Ответить  
 
 автор: baston   (20.01.2010 в 16:12)   письмо автору
 
   для: GeorgeIV   (20.01.2010 в 15:52)
 

Разумеется.
Всем спасибо.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования