PHP 命名空間 Namespace

  • 每支PHP建議都需要有 namespace,避免與其他檔案衝突。
  • PHP namepace 可以將相關的檔案和類別(classes, interfaces, functions and constants.)做很好的管理。
  • 原生的PHP對於 namespace 並沒有強制的要求,但強烈建議遵循PSR-4 autoloader的規範
  • 命名原則:
    \<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
    
    • NamespaceName: 第一層是 vendor name. Ex: EHS
    • SubNamespaceNames: 可以有多層,通常以模組\功能來劃分。 EX: Log\Writer, Core\, or Web\
    • 最後為 ClassName
Fully Qualified Class Name Namespace Prefix Base Directory Resulting File Path
\Acme\Log\Writer\File_Writer Acme\Log\Writer ./acme-log-writer/lib/ ./acme-log-writer/lib/File_Writer.php
\Aura\Web\Response\Status Aura\Web /path/to/aura-web/src/ /path/to/aura-web/src/Response/Status.php
\Symfony\Core\Request Symfony\Core ./vendor/Symfony/Core/ ./vendor/Symfony/Core/Request.php
\Zend\Acl Zend /usr/includes/Zend/ /usr/includes/Zend/Acl.php

Namespace 範例 - Hello World

  • 檔案目錄的結構

    • Project folder name: PHP7StudyGroup
    • src: 程式碼
    • vendor: 共用的 PHP packages 自己的或是第三方套件。

    https://gyazo.com/285ecbad2fefae6a08933ad90b752f95

  • 可以參考檔案 Say.php

    <?php
    namespace StudyGroup\LanguageFeatures\Say;
    require_once('SayHi.php');
    require_once('SayHello.php');
    $sayHi = new SayHi;
    $sayHello = new SayHello;
    echo $sayHi->sayHi() . "\n";
    echo $sayHello->sayHello() . "\n";
    
  • 注意: Say.php 檔案中還是需要使用 require() or include() 的指令,因為 namespace 只是宣告工作空間,但是相關的實體檔案,還是需要載入,這樣 PHP 才會正確執行。
  • 注意: SayHi.php SayHello.php and SayWorld.php 遵循SPR-1規範,就是單純的 classes 宣告,沒有 side-effects (like echo output).
  • 注意: 遵從SRP-4規範,ClassName和PHP檔案名稱相通。檔案放置位置和folder命名,也與Namespace相通。

Composer

  • composer 並不是什麼特殊的黑魔法,他只是減少程式中使用 require() or include()
  • 可以閱讀這篇 如何使用 composer autoloading簡易 composer 和 namespace 對應

    • 第一步: 需要編寫 composer.json

      {
      "autoload": {
        "psr-4": {
            "StudyGroup\\": "src/"
        }
      }
      }
      
    • 第二步: 執行composer 將PHP modules做更新

      composer dump-autoload -o
      
    • 第三步: include 產生的 vendor/autoload.php,並且加上 use statement,請參考 HelloWorld.php

      <?php
      require __DIR__ . '/../vendor/autoload.php';
      // name space alias
      use StudyGroup\LanguageFeatures\Say as Say;
      // the same as use StudyGroup\LanguageFeatures\Say\SayHi as SayHi;
      use StudyGroup\LanguageFeatures\Say\SayHi;
      use StudyGroup\LanguageFeatures\Say\SayHello;
      $sayHi = new SayHi;
      $sayHello = new SayHello;
      $sayWorld = new Say\SayWorld;
      echo $sayHi->sayHi() . "\n";
      echo $sayHello->sayHello() . "\n";
      echo $sayWorld->sayWorld() . "\n";
      
    • composer.json schedma 相關的說明特別注意:

results matching ""

    No results matching ""