LINUX.ORG.RU
Ответ на: комментарий от Artificial_Thought

В php этого нет. Там вообще исключений не дождешься :(

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

Эээ, ну в жизни не догадался бы что строка «false» будет проинтерпертирвоана как False. Так что это пхп такой пхп.

Artificial_Thought ★★★★
()

На самом деле проблема сильно усугубляется тем, что строка из важнейшего модуля битрикс. Анализировать 7000 строк кода и искать почему там строковое значение вместо логического не сильно хочется. Но это админка, штатная. Там нет кастомизации соответсвенно у всех работает, а тут нет? Может быть какая-то настройка php которая заставляет при присвоении логического значения конвертировать его в строку?

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

Если бы я хотел защитить PHP я бы сказал, что тут сначала происходит приведение к целому, а потом к булеву.

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

Ну не так тут можно рассматривать то, что не любая строка приводится в начале к целому. "-0.00" - тоже ЛОЖЬ?

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

Не вижу логики. Если строка не пуста, значит она не пуста, независимо от того, что в ней записано.

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

Suntechnic, Artificial_Thought

Она и не приводится к целому. Это специальный кейс для начинающих, так проще строковые параметры (полученные из GET, POST, БД и других источников) разбирать, не заморачиваясь с приведением типов.

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

Я и не спорю логикой. Может и так. Просто привел аргумент и контраргумент. Я полностью согласен что в рамках предполагаемой парадигмы использования PHP такое поведение можно считать оправданным. Но мне то что делать? Не - я воткну дополнительное сравнение со строкой. Но это же не дело.

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

Но мне то что делать?

Искать источник проблемы, а не придумывать костыли. Согласно венгерской нотации там должен быть булев.

gatsu
()
When converting to boolean, the following values are considered FALSE:

the boolean FALSE itself
the integer 0 (zero)
the float 0.0 (zero)
the empty string, and the string «0»
an array with zero elements
an object with zero member variables (PHP 4 only)
the special type NULL (including unset variables)
SimpleXML objects created from empty tags
RR
()
Ответ на: комментарий от Yasenfire

Решето

Это ничего, бывает :)

if(array_key_exists("bUpdateOnly", $this->next_step) && $this->next_step["bUpdateOnly"]) 
            return $counter;

Слишком много размышлений на тему: «если так, то тогда вот это, а если... то, тьфу, опять забыл с чего начал».

Когда вместо архитектуры проекта в головушке деревья ветвятся... С чем битрикс-программистов можно и поздравить.

Один написал проверку if, позабыв привести явно тип важнецкой переменной. Другой где-то в дебрях модуля не предусмотрел появления строки вместо bool.

А модульные тесты придумали трусы. Фраза закопирайчена кем-то на ЛОРе, только не помню кем.

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

Хуже того:

if(array_key_exists("bUpdateOnly", $this->next_step) && $this->next_step["bUpdateOnly"]) 
$bUpdateOnly = array_key_exists("bUpdateOnly", $this->next_step) && $this->next_step["bUpdateOnly"];
...
if(!$bUpdateOnly)
Ага - это один и тот же класс в одном и том же модуле. В случае чего меня даже регулярка не спасет :( Точнее рассчитывать на нее нельзя.

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

Пока сравниваю если прошло через их проверку. Но коряво это...

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

grep присвоения:

$this->next_step["bUpdateOnly"] = ($attrs[GetMessage("IBLOCK_XML2_UPDATE_ONLY")]=="true") || intval($attrs["IBLOCK_XML2_UPDATE_ONLY"])? true: false;
$this->next_step["bUpdateOnly"] = ($ar["VALUE"]=="true") || intval($ar["VALUE"])? true: false;
$this->next_step["bUpdateOnly"] = true;
Вроде все нормально...

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

Получается, что bUpdateOnly устанавливается ключом-переменной, с помощью list (или export, но это наврятли) или в результате манипуляций с массивами.

Можно ещё грепнуть:

bUpdateOnly
>next_step[$
>next_step

Если ничего подозрительного не найдётся, то вам придётся изучить битрикс поподробнее :)

gatsu
()

Это называется привет 90-е,и инвалиды Си программисты неосвоившие нормальных языков...

Поэтому и видим в ПХП тот берд что и у вас-вам нужно проверять сначала на тип,потом выполнять условие-глупейший бред,вы во нормальный прекрастнгый ПХП тяните свое функциональное программирование....ОСВОЙТЕ КЛАССЫ В КОНЦЕ КОНЦОВ...

Также поэтойже причине частое явление в прекрасной java где также прекрастно живется с абстрактными классами...так встречаются гениальные коды прямиком из 90-х,где ПРОСТО НЕРЕАЛЬНЫМ костылем реализована СТРУКТУРА,еще и сайзоф используется...(да в джаве нет сайзофа но можно накостылять).

Также у вас очевидная ошибка,и почему никто из вышеотписавшихся незаметил: У вас В ОДНОМ УСЛОВИИ ПРОВЕРКА СУЩЕСТВОВАНИЯ И ОБРАЩЕНИЕ ДАЖЕ ЕСЛИ НЕ СУЩЕСТВУЕТ. Вам нужно ДВА УСЛОВИЯ

Первое-ЕСЛИ СУЩЕСТВУЕТ ТО второе ДЕЙСТВИЕ ПРОВЕРКИ

У вас выпадет исключение если не существует и выполнение прервется,т.к. вы обращаетесь в условии иф к несуществующему объекту....

Какой ужас.....

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

Также у вас очевидная ошибка,и почему никто из вышеотписавшихся незаметил: У вас В ОДНОМ УСЛОВИИ ПРОВЕРКА СУЩЕСТВОВАНИЯ И ОБРАЩЕНИЕ ДАЖЕ ЕСЛИ НЕ СУЩЕСТВУЕТ. Вам нужно ДВА УСЛОВИЯ

Поциент, прописываю вам срочный курс булевой алгебры, там И, а не ИЛИ в условии.

RR
()
Ответ на: комментарий от gatsu

Я знаю, но что-то он у меня не работает в сусе (или то руки=))

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

Поэтому и видим в ПХП тот берд что и у вас-вам нужно проверять сначала на тип,потом выполнять условие-глупейший бред,вы во нормальный прекрастнгый ПХП тяните свое функциональное программирование....ОСВОЙТЕ КЛАССЫ В КОНЦЕ КОНЦОВ...

водку? с утра?!

Также у вас очевидная ошибка,и почему никто из вышеотписавшихся незаметил: У вас В ОДНОМ УСЛОВИИ ПРОВЕРКА СУЩЕСТВОВАНИЯ И ОБРАЩЕНИЕ ДАЖЕ ЕСЛИ НЕ СУЩЕСТВУЕТ. Вам нужно ДВА УСЛОВИЯ

хотя нет, не с утра, а с понедельника... Может хватит?

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

Поэтому и видим в ПХП тот берд что и у вас

Там ни одной моей строчки.

ОСВОЙТЕ КЛАССЫ В КОНЦЕ КОНЦОВ

Это класс. Да. И что это им дало?

Также у вас очевидная ошибка

У меня?! o_O

У вас В ОДНОМ УСЛОВИИ ПРОВЕРКА СУЩЕСТВОВАНИЯ И ОБРАЩЕНИЕ ДАЖЕ ЕСЛИ НЕ СУЩЕСТВУЕТ.

Да ну? А это не два? Я знаю только один язык, где будет проверятся второе условие из объединённых AND даже если первое окажется ложным. Это не PHP.

У вас выпадет исключение если не существует и выполнение прервется

Исключений в PHP и по более насущным поводам не дождешься. Я удивляюсь как он до сих пор на 0 не делит.

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

Да - по идеи можно первую половину условия опустить. Но вот так вот там...

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

Исключений в PHP и по более насущным поводам не дождешься.

#!/usr/bin/env php
<?php
set_error_handler(function($code, $message, $file, $line) {
    if (($code & error_reporting()) !== 0) {
        throw new ErrorException($message, $code, 0, $file, $line);
    }

    return true;
});


try {
	echo 10 / 0;
} catch (Exception $e) {
	echo $e->getMessage(), "\n";
}
[gatsu@gatsu ~]$ ./test.php 
Division by zero
gatsu
()

Ты тупишь. Строкову строково, а булеву-булево. Логическое сравнение - это таки === и !==

r_asian ★☆☆
()

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

r_asian ★☆☆
()
Ответ на: И то, и другое. от Test11

Круто, уже легкие шутки трут. Понабрали по объявлению вахтеров.

anonymous
()
Ответ на: комментарий от moscwich
vir@elephant:~$ php -r "var_dump("false" !== false);"
bool(false)
vir@elephant:~$ php -v
PHP 5.3.10-1ubuntu3.1 with Suhosin-Patch (cli) (built: May  4 2012 02:20:36) 
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
VirRaa ★★★
()
Ответ на: комментарий от VirRaa
alex@hm:~$ php -r "var_dump("false" !== false);"
bool(false)
alex@hm:~$ php -r 'var_dump("false" !== false);'
bool(true)
ramambahara
()

читайте доки.

Надо

($this->next_step["bUpdateOnly"] === false) или ($this->next_step["bUpdateOnly"] !== false)

P.S.: тред не читал...

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