PHP新鮮乾貨
# Java List太多行了用Python舉例
arr = []
for i in range(0, 10):
dict = {"a":"b"}
arr.append(dict)
<?php
$arr = array();
// 迴圈內
$temp = array("a" => "b");
array_push($arr , $temp);
// 20240424更新:以下作用相同
$arr[] = array("a" => "b");
dd() vs dump()
前者程式會斷在那邊,後者會跑完
取多層有key Array中的內容
<?php
$data = [
'level1' => [
'level2' => [
'level3' => 'value'
]
]
];
$value = $data['level1']['level2']['level3'];
💡取出前先做檢查避免ErrorException: Undefined index: profiles
使用array_key_exists()
丟一個情境請Copilot解釋下,我們得知:
- PHP的
isset()函數可以檢查變數是否設定,也可以檢查陣列的索引是否存在。但請注意,isset()會返回false如果變數已設定但值為NULL。 - 如果你想檢查一個變數是否設定,即使它的值為NULL,你應該使用
array_key_exists()函數
另外isset()目前貌似流行搭配三元運算式的寫法
<?php
$var = isset($arr['name'])? $arr['name']: '沒名字旯';
PHP三元運算子 NULL運算子
如何執行PHPUnit
./vendor/phpunit/phpunit/phpunit tests/Feature/SumArrayTest.php --group Feature/SumArrayTest # Linux
.\vendor\bin\phpunit.bat tests/Feature/SumArrayTest.php --group Feature/SumArrayTest # Windows phpunit.bat的路徑斜線是反的
運行PHPUnit時echo怎麼沒東西!
Copilot的科普時間:
...請注意,PHPUnit 預設會捕獲所有輸出,所以你可能需要禁用輸出緩衝(
@outputBuffering disabled)才能看到輸出。此外,這些方法應該只在調試時使用,並在提交代碼前移除...
- 關於解決方法的討論<-幾年前的回答似乎大部分都失效了
@@|||
人生苦短,我選dump()...?
列印有幾種?!
print_r():印出更易讀的樣子,尤適合印出Array
PHP寫檔
<?php
$file = '檔名.txt';
$content = '內容';
file_put_contents($file, $content, FILE_APPEND); // 檔案不存在則創建;檔案存在,新內容出現在尾巴
// file_put_contents傳入值內也可以用$content."\n"實現每筆換行
我不擔心NullPoint ?!
Copilot給我們科普下...
在 PHP 中,當你使用 != 來比較兩個字串時,如果其中一個是 null,不會導致類似 Java 的 NullPointException 問題。在 PHP 中,null 被視為空值,所以如果你比較一個字串和 null,結果會是 true,除非該字串也是 null。
至於你的第二個問題,如果你將 null 寫入檔案,它會被視為空字串。這是因為在寫入檔案時,PHP 會將資料轉換為字串,而 null 在這種情況下會被轉換為空字串。所以,如果你讀取該檔案,你將得到一個空字串,而不是 null。以下是一個範例:
<?php
$file = 'example.txt';
$nullValue = null;
// 寫入檔案
file_put_contents($file, $nullValue);
// 讀取檔案
$content = file_get_contents($file);
// 輸出內容
echo $content; // 輸出為空字串
在這個範例中,我們將 null 寫入一個檔案,然後讀取該檔案的內容。你會看到,當我們輸出內容時,結果是一個空字串,而不是 null。希望這能回答你的問題!
(上面範例打開就是一個空的txt檔案)
需要留意PHPUnit Try-Catch問題
遇到再討論..
陣列轉字串(嚴格來說大部分是拼接)
一維,鳴謝Copilot提供程式碼(毆)
<?php
// 你的資料
$data = ["A", "B", "C", "D", "E"];
// 使用 join()
echo join(',', $data); // 執行結果 : A,B,C,D,E
echo join('-', $data); // 執行結果 : A-B-C-D-E
echo join('|', $data); // 執行結果 : A|B|C|D|E
echo join('', $data); // 執行結果 : ABCDE
// 使用 implode()
echo implode(',', $data); // 執行結果 : A,B,C,D,E
echo implode('-', $data); // 執行結果 : A-B-C-D-E
echo implode('|', $data); // 執行結果 : A|B|C|D|E
echo implode('', $data); // 執行結果 : ABCDE
問個老半天好像沒有類似Java toString()那種東西...就是[1, 2, 3]要改成"[1, 2, 3]",都要自己拼接後加符號@@
另外多維陣列就是迴圈遊戲了@@
然後帶key的倒是可以用json_encode();如果真的純列舉用implode(),但結構複雜可能需要遞迴..
計算陣列長度
用count($arr)或sizeof($arr)
呼叫同個class內的函數
跟Java不一樣不能直接呼叫,得$this->函數()這樣呼叫
Array找最大
用array_column收集欄位,再用max('key')找出
(Laravel Colletion可以少第一個步驟)
我可以像Python一樣「處理自己」嗎?
<?php
$collection = $collection->toArray();
運行後型態變為Array,答案是可以
嚴格來說並不是處理自己,而是賦值本身就是由右至左的過程,但PHP跟Python都是弱型別,不用經過複雜的型態轉換操作就能改變變數型別,這也是會什麼Java直接這樣寫會報錯的原因
安裝擴充元件的方式Win vs Linux
Win基本上是去php.ini打開註釋,Linux基本上是用安裝的
*基本上*
不用phpinfo()看設定檔的方法
在主機上下
# 記得在自己有權限的地方操作
php -i > phpinfo.txt
vi phpinfo.txt
安全又迅速
建構子注入變數使用
就算宣告受保護的變數,還是得加$this引用
直接use的物件就可以直接使用物件名稱
arr str混用問題
如果你想知道關於請求得更多事情...$_SERVER
它是一個內建的陣列,你可以對照文件對$_SERVER["key"]代入想要的key取得你要的資料~
常見的取ip、domain都是這樣做的
- 目前遇到一個問題是使用
$_SERVER["HTTPS"]不是很順利@@<-根據這則討論,要用它還挺複雜的..- 使用不當可能把程式搞壞,尤其用在
route.php,請求可能都不如預期
- 使用不當可能把程式搞壞,尤其用在
跟Node.js還有Java的大不同
沒有多執行緒,一行一行執行 可參考
或是愛用佇列
@@
匿名函數裡可以用啥
作用域Uhmm...
- 當前類下的方法,不過要用另個變數賦值
$this
<?php
class A {
public function funA () {
$call = $this;
FackClass::fakeStaticFunc(function () use ($call) {
$call->funB();
});
}
public function funB () {
return 'Haha!';
}
}
- 當前類Use的類
<?php
use App\Model\User
class A {
public function funA () {
FackClass::fakeStaticFunc(function () {
$query = User::find(1);
// 以下略
});
}
}