iT邦幫忙

1

把 function 的變數拿到 function 外繼續用?php

當錯誤發生時,會找 db_error_handler
然後 return $params['error'] 出來
假設在 return 的同時
能否在裡面宣告一個變數
然後可以在 func 下面的代碼中使用它?

例如

function db_error_handler($params) {
    $p = $params['error'];
    return $params['error']; // return 'error'
}

echo $p; // 'error'
看更多先前的討論...收起先前的討論...
柯柯 iT邦新手 5 級 ‧ 2020-07-30 14:55:30 檢舉
$p = "B";

function test(){
global $p;
$p = "A";
}
test();
echo $p;
松松 iT邦研究生 2 級 ‧ 2020-07-30 15:18:47 檢舉
也就是說還是得在外面執行一次 func
listennn08 iT邦研究生 2 級 ‧ 2020-07-30 15:30:25 檢舉
是要先在外面定義 $p
你呼叫的時候不就執行 function 了
柯柯 iT邦新手 5 級 ‧ 2020-07-30 16:17:54 檢舉
我上面的程式是範例 你要call function $p的值才會因為function改變

而你有return 所以你一開始應該就會call
$test = db_error_handler($params);
這樣子 所以你只是差全域變數去設定你要在function裡修改的值而已
https://ithelp.ithome.com.tw/questions/10188886
我懷疑您穿越了但我沒有證據 (X
哇靠!!2018就問過這問題了。現在還不知道?我還有回答過。我靠。
你不是小a吧。還是小k
松松 iT邦研究生 2 級 ‧ 2020-07-30 16:46:36 檢舉
這次不同
我是使用 meekro 他本身的 handle error
DB::$error_handler = 'db_error_handler';
$params 我沒辦法帶給這個 function
0
海綿寶寶
iT邦大神 1 級 ‧ 2020-07-30 16:27:00

若看書上的說明

We use a special error-handling function for DB errors rather than only relying onour regular error_handler()function. We do this so that we can roll back anyopen transaction (if we still have an active database connection) and then trigger afatal error that will exit the page and stop any other queries from running. This iskey  to  the  concept  of  atomic  transactions,  which  are  multi-stage  procedures  inwhich, by rule, either all of the steps must occur, or none of them. This preventssuch problems as, in the case of a bank, money being credited to one account with-out being subtracted from another one.

沒有什麼必要把$params['error']傳出來給下面的function用
因為在 db_error_handler function 裡就可以寫你想做的事

如果你堅持的話
那就

$myerror = "";

function db_error_handler($params) {
    global $myerror;
    $myerror = $params['error'];
}

echo $myerror; // 'error'

連 return 都可以省了

1
浩瀚星空
iT邦超人 1 級 ‧ 2020-07-30 16:29:41

php有一種變數傳送的寫法。
一般我很少教人。但在一些特殊情況下可以使用。

<?php
function test1($var){
    $var++;
    echo 'func='.$var;
}
function test2(&$var){
    $var++;
    echo 'func='.$var;
}
function test3(){
    global $var;
    $var++;
    echo 'func='.$var;
}

$var = 1;
test1($var); 
echo 'test1='.$var; 

$var = 1;
test2($var); 
echo 'test2='.$var; 

$var = 1;
test3(); 
echo 'test3='.$var; 
?>

以上試著跑看看就知道該怎麼做了。
&變數作法要小心用就是了。

0
apex_wu
iT邦新手 5 級 ‧ 2020-07-30 17:44:58

不然你可以用神奇 redis

2
淺水員
iT邦研究生 5 級 ‧ 2020-07-30 19:28:18

看了一下meekro文件
那個 function 是被套件直接呼叫的
所以傳入參數無法自訂
要設定最外層變數可以透過 $GLOBALS 來做

function db_error_handler($params) {
    $GLOBALS['p']=$params['error'];
}
DB::$error_handler = 'db_error_handler';
DB::query('select * from tb1'); //假設發生錯誤
var_dump($p);

後續補充:
其實不用自己去設外部變數也可以拿到錯誤訊息。

//發生錯誤之後
$sqliObject = DB::get(); //這回傳 mysqli object
echo $sqliObject->error; //直接拿 mysqli 的錯誤訊息

參考:https://meekro.com/docs.php/misc-methods

淺水員 iT邦研究生 5 級 ‧ 2020-07-30 22:44:48 檢舉

再補一個,有時候套件接受 Callable 這類作為 callback
(這個套件就有)
所以可以這樣寫

class MyError
{
    public static $errorInfo='';
    
    public static function setInfo($param) {
        self::$errorInfo = $param['error'];
    }
}
DB::$error_handler = ['MyError', 'setInfo'];
DB::query('select * from tb1'); //假設發生錯誤
var_dump(MyError::$errorInfo);

我要發表回答

立即登入回答