|
|
|
| Здравствуйте.
Изучая книгу "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)
| | Если я правильно разобрался в ссылочных ответах, то если тип объекта логический, то возращается true, в противном случае false? Правильно? | |
|
|
|
|
|
|
|
для: baston
(19.01.2010 в 12:27)
| | Нет. В скобках записывается условие как в операторе if, после вопроса выполняется код, если условие истинное. После двоеточия выполняется код, если условие ложное.
Вот пример. Оба варианта равнозначны:
<?
$var = '1';
// -- обычный оператор
if ( $var == '1' ) {
print 'один';
} else {
print 'два';
}
// -- тренарный оператор
print ($var == '1') ? 'один' : 'два';
|
| |
|
|
|
|
|
|
|
для: Саня
(19.01.2010 в 12:35)
| | Хорошо, тогда давайте пройдемся по "моему" коду, чтобы уж разобраться до конца.
Вот, что дано:
elseif (gettype($obj) == "boolen")
{
return $obj? "true" : "false";
|
Исходя из логики, мы определяем, что в скобках содержится условие определения типа объекта и сравнение его с типом "boolen".
Тогда, если тип логический, то это условие верно, и возвращаем значение "true", в противном случае - "false".
Почему же тогда вы сказали "нет"? Или я недопонимаю что-то? Тогда, пожалуйста, проясните.
Спасибо. | |
|
|
|
|
|
|
|
для: baston
(19.01.2010 в 12:45)
| | Это две совершенно разные проверки. Одна проверяет тип переменной, а другая её значение.
Здесь просто выводится значение булевой переменной в текстовом виде, потому что print true напечатает 1, а print false ничего не напечатает и сиди гадай что это — null, пустая строка, целое число или всё же bool. | |
|
|
|
|
|
|
|
для: Саня
(19.01.2010 в 12:51)
| | Прошу простить мою непонятливость, но вот я представил в ином виде это выражение:
$obj = 53 > 12;
if (gettype($obj) == "boolean")
{
echo "true";
}
else echo "false";
|
Верно ли я сделал? Если да, то для меня ясны стали условные операции, если нет ...
Но эта же строка
return $obj? "true" : "false";
|
ничего не проверяет! Она просто возвращает текстовое значение, как и у меня выше.
В чем же мое непонимание? | |
|
|
|
|
|
|
|
для: baston
(19.01.2010 в 13:23)
| |
<?
$obj = 53 > 12;
if (gettype($obj) == "boolean") {
if ($obj) {
return "true";
} else {
return "false";
}
}
|
| |
|
|
|
|
|
|
|
для: Саня
(19.01.2010 в 13:29)
| | Ок, тогда вопрос такой: зачем нужна вторая проверка? Разве первой проверки выражения в скобках не достаточно? | |
|
|
|
|
|
|
|
для: baston
(19.01.2010 в 13:33)
| | Первая проверка проверяет тип переменной, а вторая ее значение. Вот что из этого не понятно? | |
|
|
|
|
|
|
|
для: sim5
(19.01.2010 в 13:39)
| | Это просто не очевидно для меня (я недавно изучаю язык, поэтому и задаю такие вопросы). Для меня логика выражения в скобках такова: если левая часть равна правой, то...
Вот для меня и непонятно, почему функция gettype является проверкой? Разве она просто не возвращает точный тип переменной?
Спасибо. | |
|
|
|
|
|
|
|
для: baston
(19.01.2010 в 13:44)
| | тип переменной и значение переменной - разные вещи | |
|
|
|
|
|
|
|
для: GeorgeIV
(19.01.2010 в 13:49)
| | Да, конечно, это ясно. Я же спрашиваю о другом - в скобках мы сравниваем возвращаемый тип переменной с текстовым значением. Разве выражение в скобках не возвращает уже готовый результат? На мой взгляд - возвращает. Зачем нужна вторая проверка?
Или я не прав? | |
|
|
|
|
|
|
|
для: baston
(19.01.2010 в 13:44)
| | В первом условии требуется не возврат типа, а проверка на указанный тип, и если это булевый тип, будет возвращено true, но не как значение этой переменной, а как результат проверки (для условия if), то получить (заметьте, теперь именно получить, а не проверить) значение самой переменной. | |
|
|
|
|
|
|
|
для: sim5
(19.01.2010 в 13:57)
| | Какая-то нелогичная логика...
Получается по-вашему, что выражение в скобках
(gettype($obj) == "boolean")
|
это двойная проверка: 1) типа переменной, 2) равенства типа и значения?
Функция gettype возвращает тип переменной в виде "boolen" (в нашем случае). Возвращает в виде строки. Это сравнивается со строкой "boolean". Если это сравнение верно, то возвращается true. В первой же скобке. Для чего вторая проверка
?
Никак не пойму... | |
|
|
|
|
|
|
|
для: baston
(19.01.2010 в 14:36)
| | Выражение gettype($obj) получает ТИП переменной сравнивает его с нами указанным - "boolean", и если тип будет равен "boolean", то ТОЛЬКО ТЕПЕРЬ ВОЗВРАЩАЕТ TRUE для IF (иначе вернет FALSE). Вот это TRUE/FALSE никакого отношения не имеет к значению самой переменной! Это результат сравнения!
Вторая проверка дает нам возможность получить ЗНАЧЕНИЕ самой булевой переменной в виде строки, и если if ($obj), что равноценно if ($obj == true), то вывести на экран СЛОВО true, иначе будет выведено false.
Выполните вот такое:
что получим? | |
|
|
|
|
|
|
|
для: Саня
(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 (у Сани). Но разве она обязательна, ведь по сути получаем один и тот же результат? | |
|
|
|
|
|
|
|
для: baston
(19.01.2010 в 14:49)
| | Да, тяжелый случай. Вы знаете как устроен процессор, в общем виде? | |
|
|
|
|
|
|
|
для: sim5
(19.01.2010 в 14:54)
| | Что случай тяжелый, согласен. Но не обижайте гуманитариев.
Приводимое вами разъяснение выше мне понятно, спасибо.
P.S. Вы про "нули и единицы"? | |
|
|
|
|
|
|
|
для: 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 флагового регистра. Нам возвращается признак того - равны или нет сравниваемые операнды! | |
|
|
|
|
|
|
|
для: sim5
(19.01.2010 в 15:22)
| | >$a = true;
>print $a;
>на экран ничего не выведет
выведет 1 (не в браузере, а при выполнении в редакторе).
>А теперь выполните такое:
>$a = true;
>print gettype($a);
>Что получим? Получим на экране boolean. Как вы думаете, это значение переменной?
Это тип переменной. А значение - true или false.
Похоже, что я вывел вас из себя своим непониманием - уж простите. Хочется уяснить до мелочей.
Спасибо. | |
|
|
|
|
|
|
|
для: baston
(19.01.2010 в 15:52)
| |
<?
$a = true;
echo "1. Значение переменной равно " . $a . "<BR>";
//а здесь получаем строковый вид значения булевой переменной,
//которое не может быть выведено способом 1.
echo "2. Значение переменной равно " . ($a ? "true" : "false") . "<BR>";
echo "3. Переменная имеет тип " . gettype($a);
|
Именно тип, но не значение! Вы же утверждаете, что нет смысла получать значение, так как первое выражение уже его получает. А это разве так?
Меня трудно вывести из себя, не обольщайтесь ;-) Восклицательные знаки, это не ругань с моей стороны, а способ заострить ваше внимание. | |
|
|
|
|
|
|
|
для: baston
(19.01.2010 в 15:05)
| | Гуманитариям нужно так объяснять.
<? пыхапэ
если(это коробка с чем нибудь)
{
так и запишем - "коробка с ". подсчитаем сколько ." штук";
}
а если(это что какое то устройство)
{
то запишем "устройство";
}
а если(это переключатель)
{
то выполним (включено ли)? "Включено" : "Выключено";
}
или
{
покажем, что же это все таки такое.
}
|
| |
|
|
|
|
|
|
|
для: Николай2357
(19.01.2010 в 16:49)
| | >Гуманитариям нужно так объяснять.
><? пыхапэ
>
> если(это коробка с чем нибудь)
> {
> так и запишем - "коробка с ". подсчитаем сколько ." штук";
> }
> а если(это что какое то устройство)
> .........
> }
5 балов, посмеялся. Нас так в школе учили изучать язык программирования. Вы случаем не в школе работаете? | |
|
|
|
|
|
|
|
для: Usta
(19.01.2010 в 21:51)
| | Зря смеетесь.
Порой мозг кипит и приходится на листочек расписывать себе алгоритм работы скрипта на русском языке, а потом все это превращать в код.
По сути - это сначала делается в голове, минуя листок с карандашом. Но не всегда можно удержать в голове все детали алгоритма, поэтому начеркать его схематическое представление хороший выход. | |
|
|
|
|
|
|
|
для: neadekvat
(19.01.2010 в 21:56)
| | Автор темы не алгоритм не понимает, он не понимает совсем иное. | |
|
|
|
|
|
|
|
для: sim5
(19.01.2010 в 22:07)
| | Автор темы тупит.
Ясно. | |
|
|
|
|
|
|
|
для: neadekvat
(19.01.2010 в 22:11)
| | :) | |
|
|
|
|
|
|
|
для: 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
(19.01.2010 в 12:15)
| | Я рад, что вас повеселил своей темой. Но будете ли вы смеятся над ребенком, только-только изучающего азбуку? Так вот я и есть тот ребенок - в PHP, разумеется.
Если что и не понимаю сейчас, то пойму позже, не сомневайтесь. А прежде чем обвинять в тупости (это реплкика к товарищу neadekvat), вы себя вспомните, когда были такими же "чайниками". | |
|
|
|
|
|
|
|
для: baston
(20.01.2010 в 12:04)
| | Не обижайтесь, в "тупости" (в прямом смысле этого слова) вас не обвиняют. И всегда помогут на форуме (по мере возможного).
Все рождаются без штанишек, это точно. | |
|
|
|
|
|
|
|
для: sim5
(20.01.2010 в 12:08)
| | >Все рождаются без штанишек, это точно.
Но некоторые - в рубашке:) | |
|
|
|
|
|
|
|
для: Loki
(20.01.2010 в 12:28)
| | Бывает. Я даже не сомневаюсь, что вы еще и при галстуке были :) | |
|
|
|
|
|
|
|
для: baston
(20.01.2010 в 12:04)
| | Не стоит обижаться.
"Автор тупит" - не значит, что "Автор тупой", а значит, что "автор не понимает, что 2+2*2 = 6 даже после того, как ему показали это на яблочках, палочках и прочем".
Тупить могут все.
Конкретно вчера я не отстал от вас по "тупизму" и мучал мозг sim5 в соседней, буквально, теме. | |
|
|
|
|
|
|
|
для: baston
(20.01.2010 в 12:04)
| | повесилить ладно, а поняли ? | |
|
|
|
|
|
|
|
для: GeorgeIV
(20.01.2010 в 15:52)
| | Разумеется.
Всем спасибо. | |
|
|
|