1. 程式人生 > 其它 >php的載入方式和設計模式

php的載入方式和設計模式

目錄

PHP的載入方式

手動載入

載入指定具體的某一個檔案

主要載入的關鍵詞 : include require require_once

示例 : require 'Test.php';

自動載入

__autoload

格式 : void __autoload ( string $class )

只可定義一次載入未定義的類。此函式將會在 PHP 7.2.0 中棄用。

遇到未包含的類,會觸發 __autoload 進行載入,如果所有載入規則中沒有此類,則 Fatal error。

示例 :

function __autoload($classname){
    require $classname.'.php';
}

$test = new Test();

echo $test->index();

spl_autoload_register

格式 :

function spl_autoload_register ($autoload_function = null, $throw = true, $prepend = false) {}

將函式註冊到SPL __autoload函式佇列中。如果該佇列中的函式尚未啟用,則啟用它們。

如果在你的程式中已經實現了__autoload()函式,它必須顯式註冊到__autoload()佇列中。

示例 :

function loadRes($classname)
{
    require $classname.'.php';
}

spl_autoload_register('loadRes');

$load = new Load();

echo '<br/>';

echo $load->load();

設計模式

什麼是設計模式

設計模式是一套被反覆使用的、多數人知曉的、經過分類編目的、程式碼設計經驗的總結。

使用設計模式是為了重用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性。

設計模式的分類

建立型模式(Creational Patterns)

該設計模式提供了一種在建立物件的同時隱藏建立邏輯的方式,而不是使用 new 運算子直接例項化物件。程式在判斷針對某個給定例項需要建立哪些物件。

建立型模式的分類

工廠模式(Factory Pattern)

抽象工廠模式(Abstract Factory Pattern)

單例模式(Singleton Pattern)

建造者模式(Builder Pattern)

原型模式(Prototype Pattern)

結構型模式(Structural Patterns)

該設計模式關注類和物件的組合,繼承的概念被用來組合介面和定義組合物件。

結構型模式的分類

介面卡模式(Adapter Pattern)

橋接模式(Bridge Pattern)

過濾器模式(Filter、Criteria Pattern)

組合模式(Composite Pattern)

裝飾器模式(Decorator Pattern)

外觀模式(Facade Pattern)

享元模式(Flyweight Pattern)

代理模式(Proxy Pattern)

行為型模式(Behavioral Patterns)

該設計模式特別關注物件之間的通訊。

行為型模式的分類

責任鏈模式(Chain of Responsibility Pattern)

命令模式(Command Pattern)

直譯器模式(Interpreter Pattern)

迭代器模式(Iterator Pattern)

中介者模式(Mediator Pattern)

備忘錄模式(Memento Pattern)

觀察者模式(Observer Pattern)

狀態模式(State Pattern)

空物件模式(Null Object Pattern)

J2EE 模式

該設計模式特別關注表示層

J2EE 模式分類

MVC 模式(MVC Pattern)

業務代表模式(Business Delegate Pattern)

組合實體模式(Composite Entity Pattern)

資料訪問物件模式(Data Access Object Pattern)

前端控制器模式(Front Controller Pattern)

攔截過濾器模式(Intercepting Filter Pattern)

服務定位器模式(Service Locator Pattern)

傳輸物件模式(Transfer Object Pattern)

各種分類的工廠模式的程式碼案例

簡單工廠模式的案例

簡單工廠模式又稱為靜態模式,是因為簡單工廠模式是通過一個靜態方法來建立物件

程式碼 :


/**
 * Interface People
 * 建立一個人的介面類 並定義一個方法 注意:介面中的方法只定義,不實現
 */
interface People
{
    public function say();
}


/**
 * Class Man
 * 建立一個男人類 來實現 人的介面類 中 所定義的方法
 */
class Man implements People{

    public function say()
    {
        echo '這是男人的方法<br/>';
    }
}

/**
 * Class Woman
 * 建立一個女人類 來實現 人的介面類 中 所定義的方法
 */
class Woman implements People
{

    public function say()
    {
        echo '這是女人的方法';
    }
}

/**
 * Class SimpleFactory
 * 通過簡單工廠模式生產對應的男人與女人的物件
 */
class SimpleFactory
{
    public static function createMan()
    {
        return new Man();
    }

    public static function createWoman()
    {
        return new Woman();
    }
}

//--------------[實現]-------------
$man = SimpleFactory::createMan();
$man->say();

$woman = SimpleFactory::createWoman();
$woman->say();
//--------------[實現]-------------

工廠模式

定義一個用於建立物件的介面,讓子類決定哪個類例項化。 他可以解決簡單工廠模式中的封閉開放原則問題。

程式碼 :

//工廠方法模式

/**
 * Interface People
 *
 */
interface People{
    public function say();
}

class Man implements People{

    public function say()
    {
        echo 'I am Male <br/>';
    }
}

class Woman implements People{

    public function say()
    {
        echo 'I am female';
    }
}

/**
 * Interface CreatePeople
 * 建立物件介面
 */
interface CreatePeople{
    public function create();
}

/**
 * Class ManFactory
 * 實現男人建立物件工廠介面
 */
class ManFactory implements CreatePeople{

    public function create()
    {
        return new Man();
    }
}

/**
 * Class WomanFactory
 * 實現女人建立物件工廠介面
 */
class WomanFactory implements CreatePeople{

    public function create()
    {
        return new Woman();
    }
}

/**
 * Class Client
 * 客戶端
 */
class Client{
    public function testF()
    {
        $manFactory = new ManFactory();
        $man = $manFactory->create();
        $man->say();
        $womanFactory = new WomanFactory();
        $woman = $womanFactory->create();
        $woman->say();
    }
}

//--------[測試]--------
$client = new Client();
$client->testF();
//--------[測試]--------

抽象工廠模式

提供一個建立一系列(多個)相關或相互依賴物件的介面。而工廠方法是一個

程式碼 :

//抽象工廠模式  與方法工廠模式  區別在於  方法只有一個(實現工廠),抽象有多個(實現工廠)
/**
 * Interface people
 * 人類
 */
interface people
{
    public function say();
}

/**
 * Class OneMan
 * 第一個男人類
 */
class OneMan implements people
{
    public function say()
    {
        echo '我是第一個帥哥<br>';
    }
}

/**
 * Class TwoMan
 * 第二個男人類
 */
class  TwoMan implements people
{
    public  function say()
    {
        echo '我 是第二個老實人<br>';
    }
}

/**
 * Class OneWoman
 * 第一個型別的女人類
 */
class OneWoman implements people
{
    public function say()
    {
        echo '我是高冷美女<br>';
    }
}

/**
 * Class TwoWoman
 * 第二個女人類
 */
class  TwoWoman implements people
{
    public function say()
    {
        echo '我是小清新女人<br>';
    }
}

interface createPeoples
{
    #建立第一個型別
    public function createOne();
    #建立第二個型別
    public function  createTwo();
}
#建立男人的物件
class FactoryMan implements createPeoples
{
    public function createOne()
    {
        return new OneMan();
    }
    public function createTwo()
    {
        return new TwoMan();
    }
}

/**
 * Class FactoryWoman
 * 建立女人類的
 */
class  FactoryWoman implements createPeoples
{
    public function createOne()
    {
        return new OneWoman();
    }
    public function createTwo()
    {
        return new TwoWoman();
    }
}

class  Client
{
    public function test()
    {
        $factory = new FactorYMan();
        $man = $factory->createOne();
        $man->say();
        $factory = new FactoryWoman();
        $man =  $factory->createOne();
        $man->say();
    }
}

$test = new Client();
$test->test();

簡單工廠模式、工廠模式和抽象工廠模式的區別

簡單工廠模式(靜態方法工廠模式) : 用來生產同一等級結構中的任意產品。(不能增加新的產品)

工廠模式 :用來生產同一等級結構中的固定產品。(支援增加任意產品)

抽象工廠 :用來生產不同產品種類的全部產品。(不能增加新的產品,支援增加產品種類)

單利模式的程式碼案例

單例模式,屬於建立型模式,它提供了一種建立物件的最佳方式

這種模式涉及到一個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。

建立的方法

它們必須擁有一個建構函式,並且必須被標記為private
它們擁有一個儲存類的例項的靜態成員變數
它們擁有一個訪問這個例項的公共的靜態方法

程式碼案例 :

/**
 * 單例模式   只能產生一個物件
 * 單利模式特點:三私一公
 * 1、私有建構函式:防止例項化
 * 2、私有克隆方法:防止克隆
 * 3、私有靜態屬性:儲存物件
 * 4、共有有化靜態方法: 獲取物件
 */
class Singleton
{
    private static $obj;//私有化靜態屬性

    /**
     * Singleton constructor.
     * 私有建構函式
     */
    private function __construct()
    {

    }

    /**
     * 私有克隆方法
     */
    private function __clone()
    {
        // TODO: Implement __clone() method.
    }

    /**
     *
     */
    public static function getInstance()
    {
        if (!is_object(self::$obj))
        {
            self::$obj = new self();
        }
        return self::$obj;
    }
}
// 例項化
/*$obj1 = new Singleton();
var_dump($obj1);*/
$obj2 = Singleton::getInstance();
var_dump($obj2);
#克隆一下
/*$obj3 = clone $obj2;
var_dump($obj3);*/
$obj3 = Singleton::getInstance();
var_dump($obj3);
class  test
{

}
$test = new test();
var_dump($test);
$test1 = new test();
var_dump($test1);
$test2 = new test();
var_dump($test2);
$test3 = new test();
var_dump($test3);

介面卡模式的程式碼案例

將某個物件的介面適配為另一個物件所期望的介面。它結合了兩個獨立介面的功能。

程式碼 :

//介面卡模式  規定的介面被適配的物件實現

/**
 * Interface Db
 *建立資料庫連結查詢的介面
 */
interface Db{
    /**
     * 資料庫的連結
     * @param $host
     * @param $username
     * @param $password
     * @param $database
     * @return mixed
     */
    public function connect($host,$username,$password,$database);

    /**
     * sql查詢
     * @param $sql
     * @return mixed
     */
    public function query($sql);

    /**
     * 資料庫關閉
     * @return mixed
     */
    public function close();
}

/**
 * Class MySql
 * MySQL實現資料庫介面類中的方法
 */
class MySql implements Db{

    protected $connect;

    public function connect($host, $username, $password, $database)
    {
       $connect = mysqli_connect($host,$username,$password,$database);
       $this->connect = $connect;
    }

    public function query($sql)
    {
        return mysqli_query($this->connect,$sql);
    }

    public function close()
    {
       mysqli_close($this->connect);
    }
}

/**
 * Class Client
 * 客戶端
 */
class DbClient
{
    public function dao()
    {
        $host = '127.0.0.1';
        $username = 'www.blogs.test';
        $password = '123456';
        $database = 'www.blogs.test';
        $sql = 'select * from login';
        $mysql = new MySql();
        $mysql->connect($host,$username,$password,$database);
        $res = $mysql->query($sql);
        while ($rows = mysqli_fetch_array($res)){
            var_dump($rows);
        }
        $mysql->close();
    }
}

$demo = new DbClient();

echo $demo->dao();

MVC模式的程式碼案例

將某個物件的介面適配為另一個物件所期望的介面。

它結合了兩個獨MVC 模式代表 Model-View-Controller(模型-檢視-控制器) 模式。

這種模式用於應用程式的分層開發。

Model(模型)

模型代表一個存取資料的物件。它也可以帶有邏輯,在資料變化時更新控制器。

View(檢視)

檢視代表模型包含的資料的視覺化。

Controller(控制器)

控制器作用於模型和檢視上。它控制資料流向模型物件,並在資料變化時更新檢視。它使檢視與模型分離開。