$ ls crystal_folder

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解釋下,我們得知:

另外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()...?

列印有幾種?!


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混用問題

stackoverflow的討論


如果你想知道關於請求得更多事情...$_SERVER

它是一個內建的陣列,你可以對照文件對$_SERVER["key"]代入想要的key取得你要的資料~

常見的取ip、domain都是這樣做的


跟Node.js還有Java的大不同

沒有多執行緒,一行一行執行 可參考

有人說你可以安裝套件

或是愛用佇列

@@


匿名函數裡可以用啥

作用域Uhmm...

<?php
class A {
  public function funA () {
    $call = $this;
    FackClass::fakeStaticFunc(function () use ($call) {
      $call->funB();
    });
  }

  public function funB () {
    return 'Haha!';
  }
}
<?php
use App\Model\User

class A {
  public function funA () {
    FackClass::fakeStaticFunc(function () {
      $query = User::find(1);
      // 以下略
    });
  }

}

#php