LINUX.ORG.RU

Как в php (без ООП) передать false с кодом ошибки?

 ,


0

1

есть функция, назовём её api_query()
в случае успеха она возвращает какое-то значение, которое не есть false
в случае неудачи она возвращает false
по говнокоду натыканы проверки типа if(!api_query()).
но теперь возникла необходимость помимо FALSE/NULL передавать еще и код ошибки.
то есть, что-то типа

$errcode = "You are very bydlokoder"; return false
в самой функции api_query, только из внешних скриптов нужно бы получить этот $errcode.
менять все 50 вызовов функции if(!api_query()), мягко говоря, гемморно..
как без лишнего оверхеда передать во внешний скрипт код ошибки вместе с false результатом функции?

★★★★★

Последнее исправление: snoopcat (всего исправлений: 2)

Ну вы блин, даете! (с)

менять все 50 вызовов функции if(!api_query()), мягко говоря, гемморно..

Подтягиваешь исходники в любимую IDE (я в NetBeans) и делаешь «рефакторинг» (понимаю, слово незнакомое). РРааз! И все вызовы изменились! Волшебство! А пальчики то вот они...

Munhgauzen
()

Фастфуды:

кидаешь кастомное исключение, к нему цепляешь $reason|$info

добавляешь функцию в свой чудный АПИ: api_query_last_error()

если это крутится на php-fpm+nginx включи логи ошибок: этот выхлоп более информативен...

Лонгфуды:

Кидать исключение

Можно паттерн-матчить (типа эрланг :)) например возвращаемое значение типа:

$error = false;
$reason = false;
if (is_array($ret)) {
  list($error, $reason) = $ret;
} else {
  $error = true;
  $reason = $ret;
}

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

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

global $api_query_errcode = "You are very bydlokoder";
Ford_Focus ★★★★★
()

А если передавать переменную, куда сохранять код ошибки, по ссылке?

<?php

function api_query($trigger_error=false, &$error=null) {
	if ($trigger_error) {
		$error = "an error manually triggered";
	} else {
		$error = null;
	}
	return !$trigger_error;
}

// success
echo api_query() . "\n";

// failure
if (api_query(true, $errcode)) {
	echo 'WAT';
} else {
	echo "You are screwed: " . $errcode . "\n";
}

?>

PS. Пых не знаю, писал с гуглом.

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

После исключения функция уже не вернет фолс и все твои 50 условий придется переписывать.

Паттерн подписчик-издатель можно реализовать без ООП.

metrokto ★★
()

Запили шину, будь мужиком!

// man static

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

А если передавать переменную, куда сохранять код ошибки, по ссылке?

менять все 50 вызовов функции if(!api_query()), мягко говоря, гемморно..

да, лучший вариант, чо

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

Ну, не факт, что ему во всех 50 вызовах понадобится код ошибки. А вообще, я просто предложил ещё один вариант.

theNamelessOne ★★★★★
()

а что, в похапе еще нет эксепшенов?

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

Почему в PHP так любят глобальные переменные

Потому что они есть. Там, где их не любят, их на уровне языка не поддерживают :)

и функции типа get_last_error?

Наследие древнего тёмного прошлого. Тогда все так делали.

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

пхп не умеет кортежи? не знал...

Синтаксис некрасивый:

list($result, $errno, $errcode) = my_method();

В любом случае исключения удобнее.

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

пхп не умеет кортежи? не знал...

к сожалению такого типа данных нет т.к. реализация массивов в данном языке типа «мульти-парадигменная» - это и списки и массивы и кортежи и все что угодно... в общем из серии «на два чатла дешевле...» (c)

Как вариант реализации кортежей с точки зрения расходования памяти, это SplFixedArray, но в плане паттерн-матчинга использовать не очень возможно. Приходится использовать костыли типа list($foo, $bar...) = $a, как примитивная форма реализации паттерн-матчинга.

swwwfactory ★★
()
define("EBYDLO", 42);

function foo()
{
    // ...
    return -EBYDLO;
}

// ...

$err = foo();
if ($err < 0)
{
    // FALSE
}

:trollface:

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