---
title: 詞彙
description: 程式設計有關的詞彙清單
cover: ../../../assets/images/vocabulary.png
---

## FQCN

FQCN (Fully Qualified Class Name) 是類別的**完整**名稱，因此命名空間在類別名稱的前面。

例如 : `Symfony\Component\HttpFoundation\Request`

以上的類別名稱是 `Request` ，結合起來就變成 FQCN。

## MVC

MVC 的意思是 **模型 - 視圖 - 控制器**。

這是一個組織應用程式的方法，把應用程式分為三個部分：

- 模型，代表資料（資料庫）
- 視圖，為了顯示資訊（範本）
- 控制器，包含商業邏輯（程式碼）

## Type-hint

在 Symfony 的應用程式裡面，type-hint 可在控制器或類別建構函式的參數裡宣告。

宣告後，由 Symfony 分析並找到相對應的服務，且為控制器或服務提供實例。

### 控制器

例如，在控制器的參數中：

```php
#[Route('/new', name: 'app_article_crud_new', methods: ['GET', 'POST'])]
public function new(
    Request $request, // <-- 特別的 Type-hint : 提供進入要求
    EntityManagerInterface $entityManager, // <-- Type-hint
    SluggerInterface $slugger // <-- Type-hint
): Response
{
    //...
}
```

### 服務

```php
class NewsletterService
{
    public function __construct(
        private MailerInterface $mailer, // <-- Type-hint
        private string $adminEmail
    ) {
    }

    //...
}
```

> 可使用 **autowired** 類型之 type-hint

## Slug

Slug 是個沒有空間、重音符號、特殊字母的字串，可在網址或檔案名稱裡使用。

比如說文章的標題是：

`Découvrez l'injection de dépendances dans Symfony`

那相對應的 slug 可能是：

`decouvrez-l-injection-de-dependances-dans-symfony`

也可瀏覽以下的網址：

`https://domain.com/articles/decouvrez-l-injection-de-dependances-dans-symfony`

## Recipe（設定範本）

在 Symfony 應用程式中，設定範本用於在安裝套件時，預先完成相關設定，並由 Symfony Flex 工具自動執行。

Symfony Flex 是一個 **Composer 外掛程式**：當用 `composer require XXX` 安裝套件時，Symfony Flex 會尋找套件有沒有相對應的**設定範本**。設定範本可包含組態檔案，或專案內需建立的檔案，目的是讓 Symfony 應用程式的套件整合更容易。

## 介面類型

在物件導向程式設計中，介面類型是一種**抽象**的類型：裡面只有函式的簽章。因此，所有實作的類別必須提供函式的定義。

### 例子

我想開發一個通知系統。當事件被觸發時，我想通知使用者或管理員。

但傳送通知的方法有多種：簡訊、郵件、手機通知等等。

所以我會先定義一個**抽象的**介面類型，以描述通知系統的行為：

```php
<?php

interface AlertInterface
{
    /**
     * 傳送通知
     */
    public function sendAlert();
}
```

接下來，如果我想定義怎麼傳送簡訊通知，可以建立一個類別，並宣告它**實作** `AlertInterface`：

```php
<?php

class SmsAlert implements AlertInterface
{
    public function sendAlert()
    {
        // 傳送簡訊
    }
}
```

或者也可以定義郵件通知：

```php
<?php

class EmailAlert implements AlertInterface
{
    public function sendAlert()
    {
        // 傳送郵件
    }
}
```

因此，`AlertInterface` 裡面只會描述通知系統的行為，也可定義**實作**這個介面類型的類別，以達成不同通知的方式。

:::note

一個介面類型可以繼承另一個介面類型

:::

## Polyfill

polyfill 可在特定的版本中，使用較新的版本中出現的功能，並模擬它們。

例如，在 PHP 7 中，無法使用 PHP 8 中的功能。

但若用 Symfony 的 [PHP 8.0 Polyfill](https://symfony.com/packages/Polyfill%20PHP%208.0) 套件，就可使用 [`str_contains`](https://www.php.net/manual/en/function.str-contains.php) 函式，因為這個函式出現在 PHP 8.0 中，所以 Symfony 中已有一個 **polyfill** 來模擬它。
