php设计模式 工厂、单例、注册树模式,php设计模式_PHP教程
php设计模式 工厂、单例、注册树模式,php设计模式
Source Code Pro字体 easyphp
命名空间:隔离类和函数,php5.3以后
//test5.php<br /><?<span>php namespace Test5;<span>//命名空间必须是程序脚本的第一条语句,除了declare <span>function<span> test(){ <span>echo <span>__FILE__<span>; }</span></span></span></span></span></span></span>
//test6.php<br /><?<span>php namespace Test6; <span>function<span> test(){ <span>echo <span>__FILE__<span>; }</span></span></span></span></span></span>
<span><span><?php<br />require 'test5.php'<span>; <span>require 'test6.php'<span>; Test5\test(); Test6\test();</span></span></span></span></span>
类自动载入:php5.2以后
spl_autoload_register('autoload1'<span>); Test5::<span>test(); Test6::<span>test(); <span>function autoload1(<span>$class<span>){ <span>require __DIR__.'/'.<span>$class.'.php'<span>; }</span></span></span></span></span></span></span></span></span>
PSR-0规范:
- 命名空间必须与绝对路径一致
- 类名首字母必须大写
- 除入口文件外,其他“.php” 必须只有一个类。
开发符合PSR-0规范的基础框架
spl标准库:
PHP链式操作:
<?<span>php namespace Baobab; </span><span>class</span><span> Database{ </span><span>function</span> where(<span>$where</span><span>){ </span><span>return</span> <span>$this</span><span>; } </span><span>function</span> order(<span>$order</span><span>) { </span><span>return</span> <span>$this</span><span>; } </span><span>function</span> limit(<span>$limit</span><span>){ </span><span>return</span> <span>$this</span><span>; } } </span>?><br /><br />//index.php<br />$db = new Baobab\Database();<br />$db->where('id = 1')->order('order by id')->limit(1);
魔术方法:
- __get/__set:接管对象属性。在给不可访问属性赋值时,__set() 会被调用;读取不可访问属性的值时,__get() 会被调用。
- __call/__callStatic:在对象中调用一个不可访问方法时,__call() 会被调用;用静态方式中调用一个不可访问方法时,__callStatic() 会被调用。
- __toString:一个类转化成字符串
- __invoke:以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
object.php
<?<span>php namespace Baobab; </span><span>class</span> <span>Object</span><span>{ </span><span>protected</span> <span>$array</span> = <span>array</span><span>(); </span><span>function</span> __set(<span>$key</span>, <span>$value</span><span>){ </span><span>$this</span>-><span>array</span>[<span>$key</span>] = <span>$value</span><span>; } </span><span>function</span> __get(<span>$key</span><span>){ </span><span>//</span><span>echo __METHOD__;</span> <span>return</span> <span>$this</span>-><span>array</span>[<span>$key</span><span>]; } </span><span>function</span> __call(<span>$func</span>, <span>$param</span><span>){ </span><span>//</span><span>var_dump($func,$param);</span> <span>return</span> 'magic function'<span>; } </span><span>static</span> <span>function</span> __callstatic(<span>$func</span>, <span>$param</span><span>) { <span>//</span></span><span>var_dump($func, $param); </span><span>return</span> 'magic static function'<span>; } </span><span>function</span><span> __toString(){ </span><span>return</span> <span>__CLASS__</span><span>; } </span><span>function</span> __invoke(<span>$param</span><span>) { </span><span>return</span> <span>var_dump</span>(<span>$param</span><span>); } }</span>
index.php
<span>$obj</span> = <span>new</span> baobab\<span>Object</span><span>(); </span><span>$obj</span>->title = 'hello'<span>; </span><span>echo</span> <span>$obj</span>-><span>title; </span><span>echo</span> <span>$obj</span>->test1('hello', 123<span>); </span><span>echo</span> <span>$obj</span>::test1('hello1', 1234<span>); </span><span>echo</span> <span>$obj</span><span>; </span><span>echo</span> <span>$obj</span>('test1');
1、三种基本设计模式
- 工厂模式:使用工厂方法或类生产对象,而不是在代码中直接new
Factory.php
<?<span>php namespace Baobab; </span><span>class</span><span> Factory{ </span><span>static</span> <span>function</span><span> createDatabase(){ </span><span>$db</span> = <span>new</span><span> Database(); </span><span>return</span> <span>$db</span><span>; } }</span>
index.php
<span>$db = Baobab\Factory::<span>createDatabase();<br /></span>$db1 = Baobab\Factory::<span>createDatabase();</span></span>
<span><span><span>$db->limit(<span>$limit);</span></span></span></span>
- 单例模式:使某个类的对象仅允许创建一个
Database.php
<?<span>php namespace Baobab; </span><span>class</span><span> Database{ </span><span>protected</span> <span>static</span> <span>$db</span><span>; </span><span>private</span> <span>function</span><span> __construct(){ } </span><span>static</span> <span>function</span><span> getInstance(){ </span><span>if</span> (self::<span>$db</span><span>){ </span><span>return</span> self::<span>$db</span><span>; }</span><span>else</span><span>{ </span><span>//</span><span>self是指向类本身,也就是self是不指向任何已经实例化的对象(::域运算符号)</span> self::<span>$db</span> = <span>new</span><span> self(); </span><span>return</span> self::<span>$db</span><span>; } }</span>
index.php
<span>$db</span> = Baobab\Database::getInstance();
- 注册模式:解决全局共享和交换对象,将对象注册到全局树上,可以在任何地方被直接访问
Register.php
<?<span>php namespace Baobab; </span><span>class</span><span> Register{ </span><span>protected</span> <span>static</span> <span>$objects</span><span>; </span><span>static</span> <span>function</span> set(<span>$alias</span>, <span>$object</span><span>){ self</span>::<span>$objects</span>[<span>$alias</span>] = <span>$object</span><span>; } </span><span>static</span> <span>function</span> _unset(<span>$alias</span><span>) { </span><span>unset</span>(self::<span>$objects</span>[<span>$alias</span><span>]); } </span><span>static</span> <span>function</span> get(<span>$name</span><span>) { </span><span>return</span> self::<span>$objects</span>[<span>$name</span><span>]; } }</span>
<span>//将db注册到注册树上</span> Register::set('db1', <span>$db</span><span>); </span>
index.php
<span>$db</span> = Baobab\Register::get('db1');

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

php5和php8的差異在效能、語言結構、型別系統、錯誤處理、非同步程式設計、標準函式庫函數和安全性等方面。詳細介紹:1、效能提升,PHP8相對於PHP5來說在效能方面有了巨大的提升,PHP8引入了JIT編譯器,可以對一些高頻執行的程式碼進行編譯和最佳化,從而提高運行速度;2、語言結構改進,PHP8引入了一些新的語言結構和功能,PHP8支援命名參數,允許開發者透過參數名稱而不是參數順序等等。

php5改80埠的方法:1.編輯Apache伺服器的設定檔中的連接埠號碼;2、輯PHP的設定檔以確保PHP在新連接埠上運作;3、重新啟動Apache伺服器,PHP應用程式將開始在新的連接埠上運行。

php5沒有監聽9000埠解決方法步驟:1、檢查PHP-FPM設定檔;2、重啟PHP-FPM服務;3、關閉防火牆或設定埠轉送;4、檢查其他程序是否佔用9000埠。

php7和php5語法區別有:1、PHP7引入了嚴格的類型聲明,而PHP5變量的類型是隱式的;2、PHP7引入了對標量類型聲明的支持,而PHP5並沒有;3、PHP7引入了NULL合併運算符,而PHP5檢查一個變數是否存在且不為null,需要使用條件語句;4、PHP7加入了新的比較運算子“<=>”,而PHP5並沒有;5、PHP7引入新特性匿名類,而PHP5並沒有。

在使用PHP5時,有些使用者可能會遇到無法監聽連接埠9000的情況。這時,我們需要進行一些配置和排查工作來解決這個問題。

如果你是網站管理員,你可能會碰到需要將 PHP5 的連接埠從預設的 80 連接埠進行修改的情況。這個過程可能會稍有進急,但是只要跟著以下步驟操作,一定會很容易地完成。

php7的版本和5的不同有性能提升、标量类型声明、返回值类型声明、异常处理改进、匿名类、语法改进、新的运算符、增强的错误处理和移除了一些旧特性等。详细介绍:1、性能提升,PHP7引入了全新的Zend引擎,名为Zend Engine 3.0,带来了显著的性能提升,PHP7的性能比PHP5提高了大约两倍,这主要是通过改进了内存管理、优化了函数调用和异常处理、增强了垃圾回收等等。

PHP是一種廣泛使用的伺服器端程式語言,被用於開發動態網站和應用程式。近些年,PHP7的發布引起了一些關注。 PHP7比之前的版本(如PHP5)有許多改進和最佳化。在本文中,我們將探討PHP7和PHP5在語法上的差異。
