鍍金池/ 問答/ PHP問答
旖襯 回答

你只是想返回一個結(jié)果,但使用 throw 一般是拋出異常。
很多時候返回 status 為0,其實并不是異常。
我覺得這些時候使用 throw 是不合適的。
所謂的異常,應(yīng)該是“它本來應(yīng)該是這樣的,但結(jié)果卻不是”,才需要拋出異常。
比如你要處理一張圖片,傳的參數(shù)指向的文件存在,文件后綴也存在,但讀取數(shù)據(jù)后卻不能正確處理,這時拋個異常是可以理解的,但我個人覺得這還不夠好。

因為我就遇到過,使用 thinkPHP 3.2 的圖片處理類,遇到不能處理的圖片,直接拋出了異常,但其實對我來說,如果處理圖片有問題 ,是可以直接跳過去的。

也就是說:只有“這一步如果出錯,后面的代碼執(zhí)行就完全沒有意義或者完全不能執(zhí)行”的時候才去拋出異常,否則只需要返回結(jié)果,給使用者(可能是控制器)去處理就好了。

對于樓主的需求,ThinkPHP 是有內(nèi)置的方法的,比如控制器中有 success() 和 error() 兩種方法來滿足樓主的需要,當然,我個人比較喜歡 ThinkPHP 3.2的處理方式,比如簡潔,ThinkPHP 5中的這兩個方法添加了不必要的參數(shù),寫起來倒挺麻煩的。
但這兩個方法只在控制器中有,模型中默認是沒有的,當然,如果你喜歡的話,也可以加到模型中去。
但我個人同樣不太推薦。處理返回結(jié)果或頁面跳轉(zhuǎn)的任務(wù)還是交給控制器會比較好。

模型中,其實可以自己定義個類似的方法,比如:

function succ($data="",$status=1){
      return array(
       'status'=>$status,
       'info'=>$data,
    );
}

function error($msg=""){
  return succ($msg,0);
}

你在模型中直接 return succ($data);或 return error($msg);即可。

控制器中根據(jù)返回的數(shù)組,再使用$this->success()或$this->error();當然,如果你在使用ThinkPHP 5,也像我一樣比較喜歡 ThinkPHP 3.2 的風格,這兩個方法你是可以改成3.2的風格的。

說回樓主和你看到的大神的代碼,基本思想都差不多,只不過你直接返回一個數(shù)組,而“大神”卻直接拋出異常,我不喜歡這位大神的風格。
但你和“大神”都喜歡寫重復(fù)的 "status'=>1,"msg"=>......,我則比較喜歡把它裝進函數(shù)或方法中,畢竟這兩個操作是使用非常頻繁的。

關(guān)于代碼中較多 if/else 的情況,我一般使用兩種方法解決:

  1. 短的判斷可以用三目運算符代替;
  2. 很多時候 if 時使用了return ,后面就可以不寫 else 了 。

補充:

概括一下:

  1. 模型中建議使用 return ,而不是拋出異常,return 的數(shù)據(jù)可以自己封裝個函數(shù)或方法;(當然,要結(jié)合業(yè)務(wù)的具體需求!)
  2. 拋出異常意味著程序的終止,在非必須的情況下不要這樣做;
  3. 控制器中直接使用 success 和 error 或 ajaxReturn 方法即可。

但如果把樓主看到的“大神”的代碼從模型中移到控制器的話,應(yīng)該是合理的(除了重復(fù)的代碼有點多外)。
我個人是不太喜歡使用 throw,但我查看了一下 ThinkPHP 5 和 ThinkPHP 3.2 的源碼,其中的 success和 error 方法除了使用參數(shù)復(fù)雜性不同外,還有一點區(qū)別就是 3.2直接使用 exit()結(jié)束程序,而 5.0 版本中使用的是 throw 一個異常類。

應(yīng)該有理由相信,使用 throw 可能會比如說 exit 更好。
于是,我找到一種說法:

PHP調(diào)用exit退出腳本執(zhí)行不會導致PHP服務(wù)退出。
https://segmentfault.com/q/10...

我不了解底層的機制,但我覺得這種說法是比較可信的。

葬憶 回答

你已經(jīng)在 app.js 里示例化過 Vue 了,為什么還要在 balde 模板里再次進行示例化呢?

直接在 blade 模板中引入編譯后的 app.js,就可以使用 Vux 提供的組件了

PS: Vue 是個好框架 :)

孤島 回答

return 0;
改為
return -1;

空痕 回答

Vue基于Object.defineProperty()實現(xiàn)的雙向綁定,只能在IE8以上跑

解夏 回答

啟用CURLOPT_FOLLOWLOCATION 的選項需要設(shè)置PHP.ini中的open_basedir選項,主要是安全問題。

詆毀你 回答

這樣的 json 結(jié)果,需要你用 Python 的數(shù)據(jù)庫類里設(shè)置好相應(yīng)的輸出 json 函數(shù)。


不敢再發(fā)我的項目鏈接,老是被那些不認真,不仔細,或者說一知半解的人舉報。

如果你想學習 sql to sqlalchemy,你可以查看我的資料,然后找到相關(guān) github 項目的鏈接。

小眼睛 回答

謝邀!

  1. 對隨機的五位數(shù)排序,最小在前最大在后的依次增大
  2. 前4次是隨機值
  3. 第5次是總數(shù)減去前四次隨機值
  4. 重要的就是前四次隨機值的范圍,就是其中的最小值和最大值。這時候如果最小值和最大值限制越多到后面越容易產(chǎn)生隨機值,并且要保證最小值要大于前一個隨機值的100以上。而關(guān)于最大值就簡單多了,盡可能小,但是不會比最小值小。并且不會比我下面例子中使用的最大值( $rand_max )大。(至于為什么你可以思考下)
  5. 如果產(chǎn)生的隨機值中差值產(chǎn)生重復(fù),那么就重新產(chǎn)生隨機值
    <?php
    
    $sum  = 10000;
    $diff = 100;
    $count = 5;
    
    $return = array();
    $min    = 0;
    $i         = 1; 
    while($i < $count) {
    
        // 隨機數(shù)不符合要求時的結(jié)果初始化
        if(isset($return[$i]) || isset($return[$i+1])) {
            unset($return[$i]);
            unset($return[$i+1]);
        }
    
        // 剩余數(shù)
        $remain_sum = $sum - array_sum($return);
        // 剩余需要隨機的個數(shù)
        $remain_count = intval($count - count($return));
        // 高斯求最小差值和,分兩部分:S = n(n+1)(2n+4)/12 + $diff * ((n-1)(n-2)/2)
        $min_diff = $remain_count * ($remain_count - 1) * (2 * ($remain_count - 1) + 4) / 12 + ($remain_count * ($remain_count - 1) / 2) * $diff;
        // 隨機范圍的最小值
        $min = $i == 1 ? 1 : $return[$i-1] + $diff + 1;
        
        // 在范圍內(nèi)獲取隨機數(shù)
        mt_srand((double)microtime() * 1000000);
        // 隨機范圍的最大值
        $rand_max   = intval(($remain_sum - $min_diff) / $remain_count);
        // 產(chǎn)生隨機數(shù)
        $min        = mt_rand($min, $rand_max);
        // 放入返回的數(shù)組
        $return[$i] = $min;
        if($i == $count - 1) {
            // 最后一個隨機數(shù)直接取總數(shù)減去前面的隨機數(shù)
            $return[$i+1] = $remain_sum - $min;
        }
        
        if(check_diff($return) === false) {
            $i--;
            continue;
        }
    
        $i++;
    }
    
    var_dump($return);die;
    
    // 判斷數(shù)組內(nèi)是否有差值相等
    function check_diff($arr) {
        if(empty($arr)) {
            return false;
        }
        
        $arr = array_map('intval', $arr);
        sort($arr);
        
        $count = count($arr);
        $diff_arr = array();
        for($i = $count - 1; $i >= 0; $i --) {
            for ($j = 0; $j < $count; $j ++) {
                if($arr[$i] <= $arr[$j]) {
                    continue 2;
                }
                $diff_arr[] = $arr[$i] - $arr[$j];
            }    
        }
        
        if(count($diff_arr) === count(array_unique($diff_arr))) {
            return true;
        }
        
        return false;
    }
骨殘心 回答

我也覺得文檔講的挺清楚,你要的例子我順手搜了個,其實就是Cache-control,具體用法我覺得你可以直接看HTTP的相關(guān)東西。

有點壞 回答

php獲取不到,這個是錨點,只有js可以拿到

悶騷型 回答

原有數(shù)據(jù)表是否需要保留?
如果不需要,按照樓上的答案,通過手機號查找userid,更新對應(yīng)的openid即可;
如果需要,通過手機號查找數(shù)據(jù),復(fù)制該條到新表中,使用全新的openid也可以。

囍槑 回答

就是做一個判斷,是否已經(jīng)卸載啦

夢囈 回答

因為php自身的局限性,所用協(xié)程下載并沒有什么意義,因為你即使開多個協(xié)程也只是在同一個進程(線程)內(nèi)執(zhí)行,cpu時間片還是一樣的量,并沒有質(zhì)的變化,如果非得使用php,你可以考慮多進程,這樣起碼可以使用多cpu,比如把一個下載文件,分段下載,最后再拼接到一起。

網(wǎng)妓 回答

$appends 刪除后不能在讀取到username屬性,刪除后可以清理下緩存:php artisan cache:clear(執(zhí)行命令清除緩存)

情已空 回答

js可能如下處理:

const array = [1, 2, 4, 5, 6, 7, 8, 9, 3, 10];

const arrayMoveTo = (arr, start, end) => {
  if(start > arr.length || end > arr.length || start < 1 || end < 1) {
    throw new Error('');
  }
  const temp = arr.splice(start - 1, 1)[0];
  arr.splice(end - 1, 0, temp);
  return arr;
};

console.log(arrayMoveTo(array, 9, 3));
//[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
醉淸風 回答

ios的虛擬支付被官方禁用了,電商和游戲不受影響

眼雜 回答

$str = '{"aa":" [[123123,123123123],[123123123,123123],[123,123123]]"}';
// 先轉(zhuǎn)一次碼農(nóng)宅
$arr = json_decode($str,true);

print_r(trim($arr['aa']));

款爺 回答

React 里面除了原生 HTML 元素之外,你自己的組件是不會自動觸發(fā)什么 onClick 之類的事件的,需要你自己手動調(diào)用父組件通過 props 傳入的方法。