<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] ## 概述 **使用示例:** 生成器模式是 PHP 世界中的一個著名模式。當你需要創建一個可能有許多配置選項的對象時,該模式會特別有用。 **識別方法:** 生成器模式可以通過類來識別, 它擁有一個構建方法和多個配置結果對象的方法。 生成器方法通常支持方法鏈 (例如 `someBuilder->setValueA(1)->setValueB(2)->create()` ) ## 概念示例 <details> <summary>main.php</summary> ``` <?php // 生成器 (Builder) 接口聲明在所有類型生成器中通用的產品構造步驟 interface Builder { public function producePartA(): void; public function producePartB(): void; public function producePartC(): void; } // 具體生成器 (Concrete Builders) 提供構造過程的不同實現。 具體生成器也可以構造不遵循通用接口的產品。 class ConcreteBuilder1 implements Builder { private $product; public function __construct() { $this->reset(); } public function reset(): void { $this->product = new Product1(); } public function producePartA(): void { $this->product->parts[] = "PartA1"; } public function producePartB(): void { $this->product->parts[] = "PartB1"; } public function producePartC(): void { $this->product->parts[] = "PartC1"; } public function getProduct(): Product1 { $result = $this->product; $this->reset(); return $result; } } // 產品 (Products) 是最終生成的對象。 由不同生成器構造的產品無需屬于同一類層次結構或接口。 class Product1 { public $parts = []; public function listParts(): void { echo "Product parts: " . implode(', ', $this->parts) . "\n\n"; } } // 主管 (Director) 類定義調用構造步驟的順序, 這樣你就可以創建和復用特定的產品配置。 class Director { /** * @var Builder */ private $builder; public function setBuilder(Builder $builder): void { $this->builder = $builder; } public function buildMinimalViableProduct(): void { $this->builder->producePartA(); } public function buildFullFeaturedProduct(): void { $this->builder->producePartA(); $this->builder->producePartB(); $this->builder->producePartC(); } } // 客戶端 (Client) 必須將某個生成器對象與主管類關聯。 function clientCode(Director $director) { $builder = new ConcreteBuilder1(); $director->setBuilder($builder); echo "構造標準基礎產品:\n"; $director->buildMinimalViableProduct(); $builder->getProduct()->listParts(); echo "構造標準全功能產品:\n"; $director->buildFullFeaturedProduct(); $builder->getProduct()->listParts(); // 記住,Builder模式可以在沒有主任類的情況下使用。 echo "自定義產品:\n"; $builder->producePartA(); $builder->producePartC(); $builder->getProduct()->listParts(); } $director = new Director(); clientCode($director); ``` </details> <br /> 輸出 ``` 構造標準基礎產品: Product parts: PartA1 構造標準全功能產品: Product parts: PartA1, PartB1, PartC1 自定義產品: Product parts: PartA1, PartC1 ``` ## 真實世界示例 生成器模式最好的應用方式之一是 SQL 查詢生成器,生成器接口定義了生成一般 SQL 查詢所需的通用步驟。 另一方面, 對應不同 SQL 語言的具體生成器會去實現這些步驟, 返回能在特定數據庫引擎中執行的 SQL 查詢語句 <details> <summary>main.php</summary> ``` <?php interface SQLQueryBuilder { public function select(string $table, array $fields): SQLQueryBuilder; public function where(string $field, string $value, string $operator = '='): SQLQueryBuilder; public function limit(int $start, int $offset): SQLQueryBuilder; //100種其他SQL語法方法。。。 public function getSQL(): string; } class MysqlQueryBuilder implements SQLQueryBuilder { protected $query; protected function reset(): void { $this->query = new stdClass(); } /** * Build a base SELECT query. */ public function select(string $table, array $fields): SQLQueryBuilder { $this->reset(); $this->query->base = "SELECT " . implode(", ", $fields) . " FROM " . $table; $this->query->type = 'select'; return $this; } public function where(string $field, string $value, string $operator = '='): SQLQueryBuilder { if (!in_array($this->query->type, ['select', 'update', 'delete'])) { throw new Exception("WHERE can only be added to SELECT, UPDATE OR DELETE"); } $this->query->where[] = "$field $operator '$value'"; return $this; } public function limit(int $start, int $offset): SQLQueryBuilder { if (!in_array($this->query->type, ['select'])) { throw new \Exception("LIMIT can only be added to SELECT"); } $this->query->limit = " LIMIT " . $start . ", " . $offset; return $this; } public function getSQL(): string { $query = $this->query; $sql = $query->base; if (!empty($query->where)) { $sql .= " WHERE " . implode(' AND ', $query->where); } if (isset($query->limit)) { $sql .= $query->limit; } $sql .= ";"; return $sql; } } class PostgresQueryBuilder extends MysqlQueryBuilder { public function limit(int $start, int $offset): SQLQueryBuilder { parent::limit($start, $offset); $this->query->limit = " LIMIT " . $start . " OFFSET " . $offset; return $this; } // + tons of other overrides... } function clientCode(SQLQueryBuilder $queryBuilder) { // ... $query = $queryBuilder ->select("users", ["name", "email", "password"]) ->where("age", 18, ">") ->where("age", 30, "<") ->limit(10, 20) ->getSQL(); echo $query; // ... } if (isset($_ENV['database_type']) && $_ENV['database_type'] == 'postgres') { $builder = new PostgresQueryBuilder(); } else { $builder = new MysqlQueryBuilder(); } clientCode($builder); ``` </details> <br /> 輸出 ``` SELECT name, email, password FROM users WHERE age > '18' AND age < '30' LIMIT 10, 20;% ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看