PHP 设计模式 笔记与总结(1)命名空间 与 类的自动载入
① PHP 面向對象高級特性
② 11 種 PHP 設計模式
③ PSR-0,Composer,Phar 等最流行的技術
目標是掌握 PHP 各類設計模式,以及具備設計純面向對象框架和系統的能力
?
【命名空間】
早期 php 沒有命名空間的概念,所有的代碼可以被認為是在同一個命名空間內運行,因此不能出現名稱相同的類或函數:
代碼 a ---- 類 a
代碼 b ---- 類 b
代碼 c ---- 函數 d
代碼 d --- 函數 d
以上都是不允許的情況。
?
php 5.3 增加了命名空間的概念。
例:加入一個項目下有 3 個文件:
test1.php:
<?php function test(){echo __FILE__; }test2.php:
<?php function test(){echo __FILE__; }test.php:
<?php require 'test1.php'; require 'test2.php';?
運行 test.php,報錯:Fatal error: Cannot redeclare test() (previously declared in D:\practise\php\design\test1.php:4) in D:\practise\php\design\test2.php on line (函數重命名導致致命錯誤)
?
當 test1.php 改為:
<?php namespace Test1;function test(){echo __FILE__; }test2.php 改為:
<?php namespace Test2;function test(){echo __FILE__; }運行 test.php ,不會報錯。
?
【引用命名空間中的方法】
命名空間名稱\方法名
如:
test.php
<?php require 'Test1.php'; require 'Test2.php';Test1\test();頁面輸出:D:\practise\php\design\Test1.php
?
【類的自動載入】
當項目越來越大時,文件越來越多,如果一個文件要依賴幾十個php 類,那么就要在該文件的代碼之前寫幾十行的 require 語句,開發和管理起來非常不便。在php 5.2 之后的版本提供了類的自動載入功能。早起 php 使用 __autoload() 方法。
例如,一個項目中有 3 個文件
Test1.php:
<?php class Test1{static function test(){echo __METHOD__;} }Test2.php:
<?php class Test2{static function test(){echo __METHOD__;} }test.php:
<?php Test1::test(); Test2::test();function __autoload($class){require __DIR__.'/'.$class.'.php'; }運行 test.php,頁面輸出:
Test1::testTest2::test?
后來__autoload() 方法被廢棄了,原因是一個 php 工程可能會依賴于多個框架,如果每一個框架都有這個函數,就會報函數重復定義的致命錯誤。在php 5.3 版本之后,官方提供了spl_autoload_register(); 方法取代 __aotoload() 方法。?
spl_autoload_register() 的特點是允許存在多個?spl_autoload_register() 方法。
?修改 test.php:
<?php spl_autoload_register('autoload1');Test1::test(); Test2::test();function autoload1($class){require __DIR__.'/'.$class.'.php'; }頁面輸出結果不變。
此時如果多個框架都有自己的類自動載入,只需要調用多次?spl_autoload_register() 即可,每個類都會分別完成自己的類自動載入,而且不會沖突:
<?php spl_autoload_register('autoload1'); spl_autoload_register('autoload2');Test1::test(); Test2::test();function autoload1($class){require __DIR__.'/'.$class.'.php'; }function autoload2($class){require __DIR__.'/'.$class.'.php'; }頁面輸出結果不變。
?
?
?
?
【開發工具】:PHPStorm
【編程字體】:使用等寬字體(常見的有Courier View,Consolas),推薦使用Source Code Pro(Adobe 公司專為程序員設計,免費開源)
【運行環境】:EasyPHP,集成了Apache,MySQL,PHPMyAdmin
轉載于:https://www.cnblogs.com/dee0912/p/4396988.html
總結
以上是生活随笔為你收集整理的PHP 设计模式 笔记与总结(1)命名空间 与 类的自动载入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: StringBuffer类和String
- 下一篇: 设定自动获得DNS服务器地址