Ⅰ 請問下php如何進入CLI模式
開始-運行-cmd-找到你的php.exe所在的目錄
比如我的php.exe所在的目錄就是E:wampinphpphp5.3.10
Ⅱ PHP模式、映射
1.這三種是面向對象的軟體設計模式,好像和具體的語言沒有關系吧
2.正確應該稱為「單例模式」,在整個應用系統范圍內只有一個實例對象,例子:
class Temple{
private static $ins;
private function __construct(){
}
public static function instance(){
if(Temple::$ins == null){
Temple::$ins = new Temple();
}
return Temple::$ins;
}
public function add($a,$b){
return $a + $b;
}
}
$tp = Temple::instance();
//$tp就是通過單例模式得到的對象,任何地方用到這個對象都是同一個
//解釋一下代碼吧
//構造函數使用的是private修飾,即私有,所以外部無法新建新對象,只能通過該類的類方法接觸
//$ins使用private+static修飾,private使得外部無法改變該屬性,static則保證在應用程序在用時
不會銷毀對象
//綜合instance()類方法,獲取到了Temp的實例對象,而該對象一經創建,在應用范圍內不會銷毀,即所有外部文件使用的都是同一個對象,這就是所謂的 單例模式
3.至於映射,沒用過,也講不清楚,具體用在哪裡不清楚 php的實現函數是
get_class_methods($classname) //獲取一個類的方法,返回方法名數組
get_class_vars($classname)//獲取一個類的屬性,返回屬性名數組
//就這些了,單例模式還是很清楚的,具體分數怎麼給,看你自己了
Ⅲ php有幾種開發模式php分幾個方面
PHP還能從事哪方面?你朋友也搞笑
不要把問題想的那麼復雜,
下面講的很詳細,大部分都用不到,只要熟悉OO模式跟MVC就好了
Ⅳ php有哪幾種運行模式
php一共分為五大運行模式:包括cgi 、fast-cgi、cli、isapi、apache 模塊的 DLLCGI
,經常接觸的應該是:apache 模塊的 DLLCGI,另外就是cli命令行模式
Ⅳ php插件模式如何實現
(1)建立一個數組,這個數組專門用於保存鉤子標識
* (2)建立一個函數,該函數可以把要執行的插件函數名稱放到鉤子上
* (3)建立一個函數,該函數可以執行鉤子上的所有插件函數以及可以傳入插件函數的參數
* (4)所謂的鉤子是什麼?這是一個很蛋疼的東西, 就是一個名稱而已,
* 這個名稱就用來做標識用的,就像人的姓名一樣,沒有什麼特別,你可以隨便起,但是執行的時候就要用它,
* 就好像你叫我去做事,就得叫我名字一樣
* (5)什麼是插件函數?把函數的名稱掛在上面所說的鉤子上面,然後執行的時候,只需把鉤子的函數名稱全部遍歷出來,並執行這些函數就可以實現插件的功能了
* (6)怎麼才能更加明白?把下面的代碼看懂,分解實現,自己一小步一小步的寫一遍。如果看不懂,想想為什麼?是有些系統函數卡住了,還是邏輯有問題
Ⅵ php中,什麼是單一模式優缺點
php單一入口模式可謂是現在一種比較流行的大型web應用開發模式,比如當前比較流行的一些php開發框架,zend,thinkphp,qeephp,還有cakephp
等他們都是採用的單一入口模式的。本文將就什麼是單一入口模式,單一入口模式有哪些優點以缺點做一下研究。
什麼是單一入口?
在解釋什麼是單一入口之前,先說說與之對應的多入口。多入口即通過訪問不同的 php 文件運行對應的功能。比如剛開始學習 php
的時候,我們做一個項目通常都會如下這樣做:
index.php - 網站首頁
list.php?page=5 - 內容列表頁
info.php?id=12 - 內容詳細頁
login.php - 用戶登錄頁
對於這個項目來說,這其實就是一個多入口。
那麼單一入口的應用程序就是說用一個文件處理所有的HTTP請求,例如不管是內容列表頁,用戶登錄頁還是內容詳細頁,都是通過從瀏覽器訪問 index.php
文件來進行處理的,這里這個 index.php 文件就是這個應用程序的單一入口。
php 是如何實現單一入口的呢?
很簡單,一般單一入口程序都是在訪問index.php時附帶一個特定的參數。例如:index.php?action=list 就可以定義為訪問內容列表頁,而
index.php?action=info 則可以定義為訪問內容詳細頁等,具體實現代碼如下:
//從url中取出action參數,如果沒有提供action參數,就設置一個默認的'index'作為參數
$action=$_GET['action']==''?'index':$_GET['action'];
//根據$action參數調用不同的代碼文件,從而滿足單一入口實現對應的不同的功能
include('files/'.$action.'.php');
以上這個就實現了一個最簡單的單一入口模式程序,當然真正的單一入口模式會比這個要復雜很多。但只要懂得如何合理組織各個功能的處理代碼並遵循一定的步驟,也可以輕松的解決掉這個難題,下面就一個後台的例子來做一下說明:
比如我們現在要做一個新聞管理的後台。那麼首先,對於應用程序的功能要做出一個合理的分解。例如後台的新聞欄目可能包含「添加新聞」、「編輯新聞」、「刪除新聞」等多個功能。這時我們就可以將這一組邏輯上關聯的功能組合到一個功能模塊中,稱為「新聞管理」模塊。
按照上面的方法整理完應用程序的功能,我們就會得到多個功能模塊,而每個模塊又是由多個功能組成(實際上,即便不是單一入口應用程序,功能的整理也是必須的步驟)。
整理完功能後,我們就需要確定如何存放各個功能的代碼。這里我推薦兩種方式:
1、每個功能模塊一個子目錄,目錄里的每一個文件就是一個功能的實現代碼。
這
種方式的好處是每個功能的代碼都互相隔離,非常便於多人協作。缺點是每個功能之間共享代碼和數據不那麼方便。例如新聞管理模塊中的所有功能都需要一個「取
出新聞欄目記錄」的功能,那麼採用這種多個獨立文件的組織方式,「取出新聞欄目記錄」就只能寫在另一個文件中,然後由需要該功能的文件include
進去。
2、每個模塊一個文件,模塊中的每個功能寫成一個函數或者一個類方法。
好處不用多說了,非常便於共享代碼和數據。缺點就是如果幾個人同時改,容易發生沖突。不過藉助版本控制軟體和差異比較合並工具,沖突還是很容易解決的。
單一入口應用程序對應多入口有哪些優勢呢?
單
一入口應用程序的所有http請求都是通過index.php接收並轉發到功能代碼中去的,所以在index.php裡面就能完成許多實際工作(所有頁面
都需要做的且都一樣的工作)。比如進行集中的安全性檢查,訪問統計等等,如果不是單一入口,那麼開發者就必須記得在每一個文件的開始加上安全性檢查代碼,
當然,你也許會說,多入口的安全性檢查可以寫到另一個文件中,然後include一下就可以了。但實際針對一個相對較大型一點的應用項目,在幾十個文件中
保持頭部的幾個include都一致可不是一件讓人省心的事。
與安全性檢查類似。在入口裡,我們還可以對url參數和post進行必要的檢查和特殊字元過濾、記錄日誌、訪問統計等等各種可以集中處理的任務。這樣就可以看出,由於這些工作都被集中到了index.php來完成,可以減輕我們維護其他功能代碼的難度。
單一入口應用程序的缺點?
任何事情都有兩面性,單一入口應用程序也不例外。由於所有http請求都是訪問 index.php ,所以程序的 url
看起來不那麼美觀,特別是對搜索引擎來說不太友好。比如下面這個 url:
http://www.phperhome.ocm/index.php?controller=posts&action=index
我們知道這種URl不太方便記憶,而且搜索引擎不認它是一個正常的 URL,當然是相比下面這種 URl 來說的:
http://www.phperhome.ocm/index.php/posts/index/
不過這個也不是什麼大問題,可以採用url重寫、PATHINFO等方式就可以輕松解決這個問題。
OK,單一入口模式就寫這么多了,當然要想深刻理解單一模式,最好的辦法還是自己嘗試著用單一入口模式寫一個小應用出來深刻體會一下。
本文地址:http://www.phperhome.com/php/400.html
Ⅶ PHP有哪幾種設計模式
PHP 一般有五種常見的設計模式
工廠模式
工廠模式 是一種類,它具有為您創建對象的某些方法。您可以使用工廠類創建對象,而不直接使用 new。這樣,如果您想要更改所創建的對象類型,只需更改該工廠即可。使用該工廠的所有代碼會自動更改。
例如:
<?php
interface IUser
{
function getName();
}
class User implements IUser
{
public function __construct( $id ) { }
public function getName()
{
return "Jack";
}
}
class UserFactory
{
public static function Create( $id )
{
return new User( $id );
}
}
$uo = UserFactory::Create( 1 );
echo( $uo->getName()."\n" );
?>
單元素模式
某些應用程序資源是獨占的,因為有且只有一個此類型的資源。例如,通過資料庫句柄到資料庫的連接是獨占的。您希望在應用程序中共享資料庫句柄,因為在保持連接打開或關閉時,它是一種開銷,在獲取單個頁面的過程中更是如此。
單元素模式可以滿足此要求。如果應用程序每次包含且僅包含一個對象,那麼這個對象就是一個單元素(Singleton)。
例如:
<?php
require_once("DB.php");
class DatabaseConnection
{
public static function get()
{
static $db = null;
if ( $db == null )
$db = new DatabaseConnection();
return $db;
}
private $_handle = null;
private function __construct()
{
$dsn = 'mysql://root:password@localhost/photos';
$this->_handle =& DB::Connect( $dsn, array() );
}
public function handle()
{
return $this->_handle;
}
}
print( "Handle = ".DatabaseConnection::get()->handle()."\n" );
print( "Handle = ".DatabaseConnection::get()->handle()."\n" );
?>
觀察者模式
觀察者模式為您提供了避免組件之間緊密耦合的另一種方法。該模式非常簡單:一個對象通過添加一個方法(該方法允許另一個對象,即觀察者 注冊自己)使本身變得可觀察。當可觀察的對象更改時,它會將消息發送到已注冊的觀察者。這些觀察者使用該信息執行的操作與可觀察的對象無關。結果是對象可以相互對話,而不必了解原因。
例如:
<?php
interface IObserver
{
function onChanged( $sender, $args );
}
interface IObservable
{
function addObserver( $observer );
}
class UserList implements IObservable
{
private $_observers = array();
public function addCustomer( $name )
{
foreach( $this->_observers as $obs )
$obs->onChanged( $this, $name );
}
public function addObserver( $observer )
{
$this->_observers []= $observer;
}
}
class UserListLogger implements IObserver
{
public function onChanged( $sender, $args )
{
echo( "'$args' added to user list\n" );
}
}
$ul = new UserList();
$ul->addObserver( new UserListLogger() );
$ul->addCustomer( "Jack" );
?>
命令鏈模式
命令鏈 模式以鬆散耦合主題為基礎,發送消息、命令和請求,或通過一組處理程序發送任意內容。每個處理程序都會自行判斷自己能否處理請求。如果可以,該請求被處理,進程停止。您可以為系統添加或移除處理程序,而不影響其他處理程序。
例如:
<?php
interface ICommand
{
function onCommand( $name, $args );
}
class CommandChain
{
private $_commands = array();
public function addCommand( $cmd )
{
$this->_commands []= $cmd;
}
public function runCommand( $name, $args )
{
foreach( $this->_commands as $cmd )
{
if ( $cmd->onCommand( $name, $args ) )
return;
}
}
}
class UserCommand implements ICommand
{
public function onCommand( $name, $args )
{
if ( $name != 'addUser' ) return false;
echo( "UserCommand handling 'addUser'\n" );
return true;
}
}
class MailCommand implements ICommand
{
public function onCommand( $name, $args )
{
if ( $name != 'mail' ) return false;
echo( "MailCommand handling 'mail'\n" );
return true;
}
}
$cc = new CommandChain();
$cc->addCommand( new UserCommand() );
$cc->addCommand( new MailCommand() );
$cc->runCommand( 'addUser', null );
$cc->runCommand( 'mail', null );
?>
策略模式
我們講述的最後一個設計模式是策略 模式。在此模式中,演算法是從復雜類提取的,因而可以方便地替換。例如,如果要更改搜索引擎中排列頁的方法,則策略模式是一個不錯的選擇。思考一下搜索引擎的幾個部分 —— 一部分遍歷頁面,一部分對每頁排列,另一部分基於排列的結果排序。在復雜的示例中,這些部分都在同一個類中。通過使用策略模式,您可將排列部分放入另一個類中,以便更改頁排列的方式,而不影響搜索引擎的其餘代碼。
例如:
<?php
interface IStrategy
{
function filter( $record );
}
class FindAfterStrategy implements IStrategy
{
private $_name;
public function __construct( $name )
{
$this->_name = $name;
}
public function filter( $record )
{
return strcmp( $this->_name, $record ) <= 0;
}
}
class RandomStrategy implements IStrategy
{
public function filter( $record )
{
return rand( 0, 1 ) >= 0.5;
}
}
class UserList
{
private $_list = array();
public function __construct( $names )
{
if ( $names != null )
{
foreach( $names as $name )
{
$this->_list []= $name;
}
}
}
public function add( $name )
{
$this->_list []= $name;
}
public function find( $filter )
{
$recs = array();
foreach( $this->_list as $user )
{
if ( $filter->filter( $user ) )
$recs []= $user;
}
return $recs;
}
}
$ul = new UserList( array( "Andy", "Jack", "Lori", "Megan" ) );
$f1 = $ul->find( new FindAfterStrategy( "J" ) );
print_r( $f1 );
$f2 = $ul->find( new RandomStrategy() );
print_r( $f2 );
?>
Ⅷ PHP中幾種常見的開發模式
單例模式
$_instance必須聲明為靜態的私有變數
構造函數和析構函數必須聲明為私有,防止外部程序new 類從而失去單例模式的意義
getInstance()方法必須設置為公有的,必須調用此方法 以返回實例的一個引用
::操作符只能訪問靜態變數和靜態函數
new對象都會消耗內存
使用場景:最常用的地方是資料庫連接。
使用單例模式生成一個對象後, 該對象可以被其它眾多對象所使用。
私有的__clone()方法防止克隆對象
單例模式,使某個類的對象僅允許創建一個。構造函數private修飾,
申明一個static getInstance方法,在該方法里創建該對象的實例。如果該實例已經存在,則不創建。比如只需要創建一個資料庫連接。
工廠模式
工廠模式,工廠方法或者類生成對象,而不是在代碼中直接new。
使用工廠模式,可以避免當改變某個類的名字或者方法之後,在調用這個類的所有的代碼中都修改它的名字或者參數。
注冊模式
注冊模式,解決全局共享和交換對象。已經創建好的對象,掛在到某個全局可以使用的數組上,在需要使用的時候,直接從該數組上獲取即可。將對象注冊到全局的樹上。任何地方直接去訪問。
策略模式
策略模式,將一組特定的行為和演算法封裝成類,以適應某些特定的上下文環境。
eg:假如有一個電商網站系統,針對男性女性用戶要各自跳轉到不同的商品類目,並且所有的廣告位展示不同的廣告。在傳統的代碼中,都是在系統中加入各種if else的判斷,硬編碼的方式。如果有一天增加了一種用戶,就需要改寫代碼。使用策略模式,如果新增加一種用戶類型,只需要增加一種策略就可以。其他所有的地方只需要使用不同的策略就可以。
首先聲明策略的介面文件,約定了策略的包含的行為。然後,定義各個具體的策略實現類。
執行結果圖:
總結:
通過以上方式,可以發現,在不同用戶登錄時顯示不同的內容,但是解決了在顯示時的硬編碼的問題。如果要增加一種策略,只需要增加一種策略實現類,然後在入口文件中執行判斷,傳入這個類即可。實現了解耦。
實現依賴倒置和控制反轉(有待理解)
通過介面的方式,使得類和類之間不直接依賴。在使用該類的時候,才動態的傳入該介面的一個實現類。如果要替換某個類,只需要提供一個實現了該介面的實現類,通過修改一行代碼即可完成替換。
觀察者模式
1:觀察者模式(Observer),當一個對象狀態發生變化時,依賴它的對象全部會收到通知,並自動更新。
2:場景:一個事件發生後,要執行一連串更新操作。傳統的編程方式,就是在事件的代碼之後直接加入處理的邏輯。當更新的邏輯增多之後,代碼會變得難以維護。這種方式是耦合的,侵入式的,增加新的邏輯需要修改事件的主體代碼。
3:觀察者模式實現了低耦合,非侵入式的通知與更新機制。
定義一個事件觸發抽象類。
當某個事件發生後,需要執行的邏輯增多時,可以以松耦合的方式去增刪邏輯。也就是代碼中的紅色部分,只需要定義一個實現了觀察者介面的類,實現復雜的邏輯,然後在紅色的部分加上一行代碼即可。這樣實現了低耦合。
裝飾器模式
1:裝飾器模式,可以動態的添加修改類的功能
2:一個類提供了一項功能,如果要在修改並添加額外的功能,傳統的編程模式,需要寫一個子類繼承它,並重寫實現類的方法
3:使用裝飾器模式,僅需要在運行時添加一個裝飾器對象即可實現,可以實現最大額靈活性。
Ⅸ PHP的幾種運行模式
php一共分為五大運行模式:包括cgi 、fast-cgi、cli、isapi、apache 模塊的 DLLCGI
CGI即通用網關介面(Common Gateway Interface),它是一段程序,通俗的講CGI就象是一座橋,把網頁和WEB伺服器中的執行程序連接起來,它把HTML接收的指令傳遞給伺服器的執 行程序,再把伺服器執行程序的結果返還給HTML頁。CGI 的跨平台性能極佳,幾乎可以在任何操作系統上實現。
CGI方式在遇到連接請求(用戶 請求)先要創建cgi的子進程,激活一個CGI進程,然後處理請求,處理完後結束這個子進程。這就是fork-and-execute模式。所以用cgi 方式的伺服器有多少連接請求就會有多少cgi子進程,子進程反復載入是cgi性能低下的主要原因。都會當用戶請求數量非常多時,會大量擠占系統的資源如內 存,CPU時間等,造成效能低下。CGI-FCGI
fast-cgi 是cgi的升級版本,FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行著,只要激活後,不會每次都要花費時間去fork一 次。PHP使用PHP-FPM(FastCGI Process Manager),全稱PHP FastCGI進程管理器進行管理。FastCGI的工作原理
1、Web Server啟動時載入FastCGI進程管理器(IIS ISAPI或Apache Mole)
2、FastCGI進程管理器自身初始化,啟動多個CGI解釋器進程(可見多個php-cgi)並等待來自Web Server的連接。
3、當客戶端請求到達Web Server時,FastCGI進程管理器選擇並連接到一個CGI解釋器。Web server將CGI環境變數和標准輸入發送到FastCGI子進程php-cgi。
4、 FastCGI子進程完成處理後將標准輸出和錯誤信息從同一連接返回Web Server。當FastCGI子進程關閉連接時,請求便告處理完成。FastCGI子進程接著等待並處理來自FastCGI進程管理器(運行在Web Server中)的下一個連接。 在CGI模式中,php-cgi在此便退出了。在上述情況中,你可以想像CGI通常有多慢。每一個Web 請求PHP都必須重新解析php.ini、重新載入全部擴展並重初始化全部數據結構。使用FastCGI,所有這些都只在進程啟動時發生一次。一個額外的 好處是,持續資料庫連接(Persistent database connection)可以工作。APACHE2HANDLER
PHP作為Apache模塊,Apache伺服器在系統啟動後,預先生成多個進程副本駐留在內存中,一旦有請求出 現,就立即使用這些空餘的子進程進行處理,這樣就不存在生成子進程造成的延遲了。這些伺服器副本在處理完一次HTTP請求之後並不立即退出,而是停留在計 算機中等待下次請求。對於客戶瀏覽器的請求反應更快,性能較高。
apache模塊的DLL:
該運行模式是我們以前在windows環境下使用apache伺服器經常使用的,而在模塊化(DLL)中,PHP是與Web伺服器一起啟動並運行的。(是apache在CGI的基礎上進行的一種擴展,加快PHP的運行效率)ISAPI:
ISAPI即Internet Server Application Program Interface,是微軟提供的一套面向Internet服務的API介面
一個ISAPI的DLL,可以在被用戶請求激活後長駐內存,等待用戶的另一個請求,還可以在一個DLL里設置多個用戶請求處理函數,此外,
ISAPI的DLL應用程序和WWW伺服器處於同一個進程中,效率要顯著高於CGI。(由於微軟的排他性,只能運行於windows環境)cli:
cli是php的命令行運行模式,大家經常會使用它,但是可能並沒有注意到(例如:我們在linux下經常使用 「php -m」查找PHP安裝了那些擴展就是PHP命令行運行模式;有興趣的同學可以輸入php -h去深入研究該運行模式)總結:
每種運行模式都有自己的優缺點,沒有絕對的好與壞,主要是看大家處理何種環境。
Ⅹ 請問php在apache下運行有幾種模式,區別是什麼該怎樣設置,謝謝
Windows 下有兩種方法使 PHP 工作於 Apache 2.0.x 之中。一種是 使用 CGI 可執行程序,另一種是適用 Apache 模塊的 DLL。不管哪種都需要編輯 httpd.conf 來配置 Apache 支持 PHP 並重新啟動伺服器。
注: 記住在 Windows 下給 Apache 的配置文件中加入路徑值的時候,所有的反斜線例如 c:\directory\file.ext 必須轉換成正斜線,如 c:/directory/file.ext。
以 CGI 方式安裝
需要將以下三行加入到 Apache 的 httpd.conf 配置文件中以設定 CGI: 例子 6-5. PHP 在 Apache 2.0 中的 CGI 方式
ScriptAlias /php/ "c:/php/"
AddType application/x-httpd-php .php
# 對 PHP 4 用這行
Action application/x-httpd-php "/php/php.exe"
# 對 PHP 5 用這行
Action application/x-httpd-php "/php/php-cgi.exe"
警告
如果使用 CGI 方式安裝,則伺服器對於某些可能的攻擊是開放的。請閱讀 CGI 安全一章以學習如何防禦這些攻擊。
以 Apache 模塊方式安裝
需要將以下兩行加入到 Apache 的 httpd.conf 配置文件中以設定 Apache 2.0 的 PHP 模塊: 例子 6-6. PHP 在 Apache 2.0 中的模塊方式
# 對 PHP 4 用這兩行:
LoadMole php4_mole "c:/php/php4apache2.dll"
# 別忘了從 sapi 目錄中把 php4apache2.dll 拷貝出來!
AddType application/x-httpd-php .php
# 對 PHP 5 用這兩行:
LoadMole php5_mole "c:/php/php5apache2.dll"
AddType application/x-httpd-php .php
# 配置 php.ini 的路徑
PHPIniDir "C:/php"
注: 記得用自己 PHP 實際所在的路徑替換掉上例中的 c:/php/。要留意在 LoadMole 指令中用的是 php4apache2.dll 或 php5apache2.dll,而不是 php4apache.dll 或 php5apache.dll,後者是設計用於 Apache 1.3.x 的。
注: 如果要使用內容協商機制,請閱讀有關 FAQ。
警告
不要在安裝中混合使用來自不同 PHP 版本的 DLL。使用下載回來的 PHP 版本中所提供的 DLL 和擴展庫是唯一選擇。