LINUX.ORG.RU

Неработающее условие на php

 ,


0

1

Минутка быдлокода, но мой мозг уже взрывается от непонимания.

Простой скрипт

$str = (empty( $user->ID ) || !is_super_admin($user->ID)) ? "123" : "admin";
echo $str;

Дебаг офк включен, варнинги и ошибки вижу (когда они есть). Почему когда false, скрипт отрабатывает, а когда true - нет? Если поменять условие на противоположное - результат тоже изменится, но в любом случае - выводится только один из вариантов, второй не выводится никогда. В чем может быть дело?

Сформулируй по-русски. Что не отрабатывает, что false, что true?

Если ты про то, что || не вычисляет правый аргумент когда левый — true, то так практически везде и ты ничерта не умеешь читать маны.

x3al ★★★★★
()
Ответ на: комментарий от x3al

За false или true принял результат всего выражения. Когда выражение false, то $str выводится нормально. Когда выражение true, то $str, по логике, должен быть 123, но он почему-то пустой.

Можно упростить выражение, оставить одно условие - результат не изменился.

l0stparadise ★★★★★
() автор топика
Последнее исправление: l0stparadise (всего исправлений: 1)

вполне возможно из-за того, что при empty( $user->ID ) функция is_super_admin( ) не может выполниться никогда, и тупо завершает оператор.

Infra_HDC ★★★★★
()
Ответ на: комментарий от x3al

Ну это еще бабушка на двое сказала. Такое поведение «ленивого или» может вполне тюниться в php.ini или при сборке php. IMHO.

Infra_HDC ★★★★★
()
Ответ на: комментарий от Infra_HDC

Да, это понятно. Но комментарий выше - все равно $str должен во что-то обернуться. А в случае, когда оба условия выполняются, $str пустой.

l0stparadise ★★★★★
() автор топика
Ответ на: комментарий от l0stparadise

На уровне банальной логики мне всё же непонятно, как пустой пользователь может быть или может не быть суперадмином? К нему эта категория неприменима IMHO. Эту неопределённость попробуйте убрать, добавлением дополнительного условия.

Infra_HDC ★★★★★
()
Ответ на: комментарий от Infra_HDC

На уровне банальной логики мне всё же непонятно, как пустой пользователь может быть или может не быть суперадмином?

в похапе 0 это тоже эмпти, как и false и array(), ткчто если айди админа 0 - то вполне

anTaRes ★★★★
()
Ответ на: комментарий от anTaRes

Вы это неработающему куску кода объясните, мне-то что объясняете

Infra_HDC ★★★★★
()

как вариант $user это не объект и на попытке доступа к $user->ID тихо загибается
перед этим лучшее проверить чем-то типо:
if($user && isset($user->ID))

anTaRes ★★★★
()
Ответ на: комментарий от Infra_HDC

Кажется, я совсем сломался.

Ок, сделал проще. Оставил только проверку на админа. Все равно если проверка проходит, то выводится текст. Если проверка не проходит, то не выводится ничего.

Вопрос даже не в логике, почему выводится тот а не другой ответ. Я не могу понять, каким образом $str может быть пустым.

l0stparadise ★★★★★
() автор топика
Ответ на: комментарий от anTaRes

Отходя от того, что $user это все же объект...

Все равно $str принимает только одно из значений. Вместо второго значения - пусто.

l0stparadise ★★★★★
() автор топика
Ответ на: комментарий от l0stparadise

Проверьте на работоспособность такой кусок кода:

if (!empty( $user->ID )) {
	if (is_super_admin($user->ID)) {
		$str = "admin";
	} else {
		$str = "123";
	}
} else {
	$str = "admin";
}
echo $str;

Infra_HDC ★★★★★
()
Последнее исправление: Infra_HDC (всего исправлений: 1)
Ответ на: комментарий от anTaRes

Всегда пустой вывод. Если попробовать echo по кускам объекта - выводит нормально.

l0stparadise ★★★★★
() автор топика
Ответ на: комментарий от l0stparadise

а если дебажить только is_super_admin(), исключив пустых пользователей?

Infra_HDC ★★★★★
()
<?php
$user=4654;
function is_super_admin($user)
{
    return true;
};

$str = ((empty( $user )) || (!is_super_admin($user))) ? "123\n" : "admin\n";
echo $str;
?>
dron@gnu:~$ php5 ./test.php 
admin
dron@gnu:~$ 
<?php
$user=4654;

function is_super_admin($user)
{
    return false;
};


$str = ((empty( $user )) || (!is_super_admin($user))) ? "123" : "admin";
echo $str;
?>
dron@gnu:~$ php5 ./test.php 
123
dron@gnu:~$ 

Dron ★★★★★
()
Ответ на: комментарий от Dron

Ну да, можно и так сделать. Вместо реальной функции на время отладки заглушку вставить. Если изменится поведение проблемного куска кода, то видно, кто ломает поведение.

Infra_HDC ★★★★★
()
Ответ на: комментарий от Infra_HDC

!@#$%^&

Поймал, кто ломает поведение. Хостинг перенастроил кэширование, сделал это плохо, и я только что поймал письмо с извинениями. Даже исходная строка работает, как надо.

l0stparadise ★★★★★
() автор топика

Тебе xdebug сказал что там пустота? Может быть у тебя там где то exit висит в коде.

anonymous
()
Ответ на: комментарий от Infra_HDC

Не, вордпресс. Было настроено кэширование fastcgi. И тут вдруг хостер решил его переделать. Посмотрел бы, что они там накрутили, да нет доступа к конфигам.

И не ясно, почему вообще изменения на странице не распознались.

l0stparadise ★★★★★
() автор топика
Последнее исправление: l0stparadise (всего исправлений: 1)

ох уж наш «любимый» пхп) а еще «1e3» == 1000 true, ну вы знаете да

LeoK
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.