iT邦幫忙

2021 iThome 鐵人賽

DAY 4
0
自我挑戰組

PHP 與 Laravel 雜記系列 第 4

PHP 一些概念

匯入

  • require: 可匯入多次, 如果出現錯誤, 會出現提醒, 並停止代碼運行
  • include: 可匯入多次, 如果出現錯誤, 會出現提醒, 並繼續運行下面代碼
  • require_once: 與 require 唯一的差別在於 require_once 會先檢查要匯入的檔案是不是已經在該程式中的其它地方被匯入過了,如果有的話就不會再次重複匯入該檔案
  • include_once: 與 include 唯一的差別在於 include_once 會先檢查要匯入的檔案是不是已經在該程式中的其它地方被匯入過了,如果有的話就不會再次重複匯入該檔案

模擬方法重載

重載是一種很多程式語言的特性, 只允許存在同一名稱但不同簽章的方法, 簽章指的是參數的類型與個數, 但 PHP 不支持這特性, 但可以通過 PHP 提供的魔術方法 /_/call //_callStatic 來模擬方法重載

<?php
// public __call(string $name, array $arguments): mixed
// 當調用物件裡面不可訪問的方法時會調用 __call, 並將方法名當第一個參數傳入, 
// 方法的參數全部變成array 當第二個參數傳入
class Math
{
  public function __call($fnName, $fnArgs)
  {
    if ($fnName === 'add') {
      $sum = 0;
      foreach($fnArgs as $arg)
      {
        $sum += $arg;
      }
      echo implode(',', $fnArgs).'總和是: '.$sum."\n";
    }
  }
}
$math = new Math();
$math->add(1, 2);
$math->add(1, 2, 3);
// 1,2總和是: 3
// 1,2,3總和是: 6

命名空間(namespace)

當整個專案愈來愈大時, 可能會遇到同類名, 同名函數, 同名常數, 從 PHP 5.3 開始提供命名空間讓我們可以將他們分別放到不同的命名空間中, 使用 namespace 關鍵字來聲明命名空間, 命名空間只能存放類, 函數, 常數, 第一個 namespace 前面不能有任何代碼, 引入檔案不影響當前的命名空間

<?php
namespace SolarSystem;
function getInfo()
{
  echo "我在太陽系\n";
}

namespace Earth;
function getInfo()
{
  echo "我在地球\n";
}

getInfo();
\SolarSystem\getInfo();
\Earth\getInfo();

// 結果
// 我在地球
// 我在太陽系
// 我在地球

Trait(特性)

trait 是 PHP 5.4 開始提供的特性, 減少單繼承語言的限制, 可以在不同層次結構內獨立出覆用的代碼, 多個 trait 可以組成一個 trait, trait 可以定義抽象成員, 可以定義靜態成員

<?php
trait A
{
  public function readPoem()
  {
    echo "會讀唐詩三白首\n";
  }
}

class Student
{
  use A;  // 代碼覆用
}

class Coder
{
  use A;
}

$student1 = new Student;
$student1->readPoem();

上一篇
PHP 基礎複習
下一篇
PHP 一些特性
系列文
PHP 與 Laravel 雜記14
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言