Time of Update: 2018-12-04
我們使用MVC架構,例如CI、YII、cakePHP,原因之一就是:能夠使代碼便於維護。但當商務邏輯不斷複雜時,在控制器中調用模型中的方法會越來越臃腫。面向切面編程的思路,是解決不斷變化的商務邏輯與寫出便於維護代碼的解決方案之一。下面是向切面式組件源碼,是根據AOP的思路設計的。<?phpif (function_exists('__autoload')) {trigger_error("Extension: It looks like your code is using an
Time of Update: 2018-12-04
文章目錄 那麼,問題一、Zend引擎是如何用C實現這種弱類型的呢?問題二、Zend引擎是如何判別、儲存PHP中的多種資料類型的呢? PHP是弱類型,動態語言指令碼。在申明一個變數的時候,並不需要指明它儲存的資料類型。例如:<?php$var = 1;$var = "variable";$var = 1.00;$var = array();$var = new
Time of Update: 2018-12-04
PHP中經常使用數組,使用數組最大的好處便是速度!讀寫都可以在O(1)內完成,因為它每個元素的大小都是一致的,只要知道下標,便可以瞬間計算出其對應的元素在記憶體中的位置,從而直接取出或者寫入。那麼核心中是如何?的呢?PHP大部分功能,都是通過HashTable來實現,其中就包括數組。HashTable即具有雙向鏈表的優點,同時具有能與資料匹敵的操作效能。PHP中的定義的變數儲存在一個符號表裡,而這個符號表其實就是一個HashTable,它的每一個元素都是一個zval*類型的變數。不僅如此,儲存使
Time of Update: 2018-12-04
PHP文法中有兩種賦值方式:引用賦值、非引用賦值。<?php$a = 1;$b = $a; // 非引用賦值$c = &$b; // 引用賦值從表面看,通常會這樣認為:“引用賦值就是兩個變數對應同一個變數(在C中其實就是一個zval),非引用賦值則是直接產生的一個新的變數(zval),同時將值copy過來”。這種認為在大部分情況下都是可以想通的。(#1)但有些情況下則會顯得非常低效,例如:(#2)<?phpfunction
Time of Update: 2018-12-04
一、核心中擷取$_GET\$_POST\$_SERVER\$_FILES\$_COOKIE等全域變數HashTable是PHP很多實現的基礎,例如$_GET\$_POST等全域變數實現。那麼,在擴充中讀取這些全域變數,當然還是操作HashTable。核心中初始化環境變數的通過main/php_variables.c中php_hash_environment(TSRMLS_D)PHP在初始化環境變數的同時,考慮到對大變數的讀效能,會通過main/php_variables.c的php_startu
Time of Update: 2018-12-04
PHP中的變數類型和值是通過C語言實現的,核心具體是如何組織使用者在PHP中定義的變數呢?HashTable在ZE核心中被廣泛使用,PHP變數也正是儲存在一個HashTable實現的符號表裡。當在PHP中調用一個函數或者類時,核心會建立一個新的符號表,這也是為什麼在函數中無法使用函數外部定義的變數的原因。(因為他們分屬兩個符號表,一個當前範圍,一個全域範圍)現在來看核心中是如何定義範圍的:struct _zend_executor_globals { //略 HashTable
Time of Update: 2018-12-04
一、提前準備下載並安裝VS2008下載PHP5.4.5程式:NTS下載TS下載其中php二進位包分為VC6、VC8、VC9及TS和NTS版本。VC6、VC8、VC9分別對應VC6、VC2005、VC2008TS表示(Thread Safe),當以ISAPI(IIS
Time of Update: 2018-12-04
一、使用命令列編譯VS項目無需再用VS來進行開發PHP擴充。這樣可以配合任意你喜歡的開發工具。使用VS_ROOT\Common7\IDE\devenv.exe進行編譯具體使用方法可以使用devenv /?,輸出協助查看@VS_ROOT:表示VS安裝路徑二、在擴充目錄中建立build.bat,並輸入devenv EXTENSION_NAME.sln
Time of Update: 2018-12-04
網路通訊、檔案儲存體中經常需要交換資料,為了減少網路通訊流量、檔案儲存體大小以及加密通訊規則,經常需要對資料進行雙向加解密以保證資料的安全。PHP中實現此功能主要需要使用的函數主要是pack及unpack函數pack壓縮資料到位字串之中。文法: string pack(string format, mixed [args]...);傳回值: 字串本函數用來將資料壓縮打包到位的字串之中。a - NUL- 字串填滿[padded string] 將字串空白以 NULL 字元填滿A - SPACE-
Time of Update: 2018-12-04
一、建立HashTableint zend_hash_init(HashTable *ht,//指向一個HashTableuint nSize,//nSize是指這個HashTable可以擁有的元素的最大數量。在我們添加新的元素時,這個值會根據情況決定是否自動成長,這個值永遠都是2的次方,如果你給它的值不是一個2的次方//的形式,那它將自動調整成大於它的最小的2的次方值。它的計算方法就像這樣:nSize = pow(2, ceil(log(nSize,
Time of Update: 2018-12-04
這個擴充是將Tokyo Cabinet的部分API提供給PHP用戶端調用。下面是來自百度百科的一段對Tokyo Cabinet的介紹:Tokyo Cabinet 是一個DBM的實現。這裡的資料庫由一系列key-value對的記錄構成。key和value都可以是任意長度的位元組序 列,既可以是二進位也可以是字串。這裡沒有資料類型和資料表的概念。當 做為Hash表資料庫使用時,每個key必須是不同的,因此無法儲存兩個key相同的值。提供了以下存取方法:提供key,value參數來儲存,按
Time of Update: 2018-12-04
在PHP中,物件導向與Class是密切相關的,來看看在核心中如何?Class的介面、繼承、私人、受保護、公開等特性。一、建立類zend_class_entry是核心中定義的一個結構體,是PHP中類與對象的基礎結構類型。如何在擴充中定義myclass類,並能夠在PHP中能夠執行個體化?PHP中看起來像這樣:<?php$obj = new myclass();?>核心中:zend_class_entry *myclass;//定義全域指標變數,指向myclass類。static
Time of Update: 2018-12-04
機器只能理解機器語言,而PHP作為解釋型指令碼到底是如何被機器執行的呢?實際上PHP在執行過程中,分為 詞法分析、文法分析、編譯PHP指令碼為opcode,最後Zend引擎會執行這些opcode。在上述執行過程中,經常被人提起的解釋型語言效能問題也就是因為每次執行指令碼,上述過程都會重複執行。因此,也就出現了APC, xcache,
Time of Update: 2018-12-04
在應用中經常使用define來定義一些常用的參數資訊,來增加程式的可讀性和可靠性。在PHP中,常量的名字是一個簡單的標識符,執行循環中不能改變,並且預設情況下是大小寫敏感的。通常常量總是大寫的。註:define中的第三個參數可以設定是否常量名大小寫敏感一、常量的內部結構typedef struct _zend_constant { zval value; /* zval結構,PHP內部變數的儲存結構 */ int flags; /* 常量的標記如 CONST_PERSISTENT
Time of Update: 2018-12-04
在PHP中,我們經常使用到資源類型變數。例如:mysql串連、檔案控制代碼等。這些變數無法使用標量來表示,那麼在Zend核心中是如何將PHP中的資源變數與C語言中的資源銜接的呢?一、資源變數在PHP中的使用$fp = fopen("test.txt", "rw");var_dump($fp);fclose($fp);列印結果:resource(5) of type
Time of Update: 2018-12-04
所有PHP擴充遵循一個共同的結構1、標頭檔包含(包括所有需要的宏、API)2、C聲明匯出函數3、聲明Zend函數塊一、標頭檔包含通過ext_seketon建立的擴充,預設都會建立一個php_extname.h的標頭檔。其中包含了php.h,該檔案匯入Zend基本的宏和API。二、聲明匯出函數ZEND_FUNCTION(my_function),提供PHP中調用的函數。展開此宏:void zif_my_function(INTERNAL_FUNCTION_PARAMETERS)void
Time of Update: 2018-12-04
$str=preg_replace("/s+/", " ", $str); //過濾多餘斷行符號$str=preg_replace("/<[ ]+/si","<",$str); //過濾<__("<"號後面帶空格) $str=preg_replace("/<!--.*?-->/si","",$str); //注釋$str=preg_replace("/<(!.*?)>/si","",$str);
Time of Update: 2018-12-04
用php抓取頁面的內容在實際的開發當中是非常有用的,如作一個簡單的內容採集器,提取網頁中的部分內容等等,抓取到的內容在通過Regex做一下過濾就得到了你想要的內容,至於如何用Regex過濾,在這裡就不做介紹了,有興趣的同學可以參考本站的《Regex》板塊:http://phpzixue.cn/articles11.shtml,以下就是幾種常用的用php抓取網頁中的內容的方法。1.file_get_contents PHP代碼<?php $url =
Time of Update: 2018-12-04
mssql_connect() [function.mssql-connect]: message: 使用者 '(null)' 登入失敗。原因: 未與信任 SQL Server 串連相關。 (severity 14 ) 一台windows伺服器跑了php和mssql,php需要串連本地的mssql 寫了個test頁面<?php$conn=mssql_connect("127.0.0.1","sa","xxxx"); //測試連接 if($conn)
Time of Update: 2018-12-04
StatusNet設定檔config.php(安裝參考) StatusNet安裝配置。以下是config.php刷屏,O(∩_∩)O~//使用URL Rewrite$config['site']['fancy'] = true;//對手機瀏覽友好$config['site']['mobile'] = true;//Settings$config ['location']['share'] = false; // 設定是否顯示“地理共用”選擇框(checkbox);$config