PHP進階知識總結

周末梳理了下這段時間看書的一些知識點,進步的過程不僅要實踐,還要安排多看書、思考、總結。

只針對知識點進行了羅列和簡單說明,很多細節還未整理好,待后面再專門詳細寫。

 

基礎易忽略概念


 

PHP是一個支持面向對象開發的語言,而不是一個純面向對象的語言
PHP5中保留了對var的支持,但會將var自動轉換為public

類型檢查函數:

is_bool() is_integer() is_double() is_string() is_object() is_array() is_resource() is_null()

PHP魔術方法:

__call()
__callStatic()     (必須是static屬性)
__set()
__get()
__isset()
__clone()
__toString()

字符串”false”在比較操作時會解析為true,因為PHP在測試變量時會轉換一個非空字符串值為bool值true
 
靜態方法是以類作用域的函數。靜態方法不能訪問這個類中的普通屬性,因為那些屬性屬于一個對象,但可以訪問靜態屬性(不能在靜態方法中使用偽變量$this)
 
常量屬性只包含基本數據類型的值,不能將一個對象指派給常量
抽象類(abstract class)不能被直接實例化,只定義(或部分實現)子類需要的方法
抽象類至少包含一個抽象方法
static類似于self,但它指的是被調用的類而不是包含類
return new static()
 

復制對象(設計模式中的原型模式):

$first = new ClassName();$second = $first;//在php5以后的版本中,$second 和 $fitst指向同一個對象 $third = clone $first;          //使用clone進行"值復制"http://在php5以后的版本中,$third和$first是兩個不同的對象/*控制復制什么:          可以實現一個__clone()方法          比如待復制的對象中有個$id=1,可我們希望此id唯一,不希望clone此id,可以在類中自己實現clone方法*/

回調、匿名函數:

is_callable();
call_user_func($funcName,$param);     //單個參數
call_user_func_array($funcName,$arrParam);     //參數是數組的形式 

 
命名空間Namespace:

命名空間是一個容器,在命名空間之外,必須導入或引用命名空間才能訪問它所包含的項。

namespace com\name\test1;
class Debug{
    static function test();
}

  

namespace test2;//調用test1命名空間中的test方法\com\name\test1\Debug::test();     //最前面必須加上 / 否則會在test2下尋找此命名空間 use com\name\test1;test1\Debug::test();  

解決類命名沖突:

use com\name\test1\Debug as uDebug;class Debug{...}uDebug::test(); __NAMESPACE__     //輸出當前的命名空間

命名空間加大括號形式:

namespace com\name\test1{    class Debug1{...}    class Debug2{...}}

require()調用文件發生錯誤時,將會停止整個程序,

調用include()時遇到相同的錯誤,會生成警告并停止執行包含文件,跳出調用代碼然后繼續執行。
 
require()和require_once()用于包含庫文件時更加安全,include()和include_once()適用于加載模板等操作
相對require()函數,require_once()需要額外的開銷
 
自動加載autoload:
當PHP引擎遇到試圖實例化未知類的操作時,會調用__autoload()方法(需提前定義),并將類名當作字符串參數傳遞

例如:

function __autoload($className){
    //將$className中的下劃線轉換為目錄分割
    $path = str_replace('_',DIRECTORY_SEPARATOR,$className);
    require_once("$path.php");
}


__autoload方法是一種根據類和文件的結構,管理類庫文件包含的有效方法。

 
類函數:
class_exists();
get_declared_classes();     //獲得腳本進程中定義的所有類的數組
get_class($obj);     //檢查對象的類,檢查對象所屬的類
$obj instalceof className;     //檢查對象
 
get_class_methods();     //獲取一個類中所有的方法列表
 
is_callable()、method_exists()     //檢查類方法是否存在且可被調用
#一個方法存在并不以為著可調用,對private、protected、public方法,method_exists()都返回true
 
get_class_vars($className);     //獲取類中定義的屬性
get_parent_class($classNa,e);     //獲取一個類的父類
is_subclass_of($className , 'classStrName');     //檢查類是否是另一個類的派生類
class_implements($className);      //返回一個由接口名組成的數組 
反射API
根據到達地找到出發地和來源,反射指在PHP運行狀態中擴展分析PHP程序,導出或提取出關于類、方法、屬性、參數等的詳細信息,包括注釋。這種動態獲取信息以及動態調用對象方法的功能稱為反射API
使用反射API可以對文件里的類進行掃描,逐個生成描述文件
 
面向對象設計的五大原則:
  1. 單一職責原則
  2. 接口隔離原則
  3. 開放-封閉原則
  4. 替換原則
  5. 依賴-倒置原則
 
sql優化的10個原則:
  1. 不要在列上進行函數運算,導致索引失敗
  2. 使用JOIN時,應用小結果集驅動大結果集。把復雜的JOIN查詢拆分為多條sql
  3. 使用like模糊查詢時,避免%%,可替換為<= 、 >=
  4. select后僅列出需要的字段,對速度不會有明顯影響,主要考慮節省內存
  5. 使用批量插入語句,比依次執行單個插入節省交互
  6. limit的技術比較大時考慮使用between
  7. 不要使用rand函數獲取多條隨機記錄
  8. 避免使用NULL
  9. 不要使用count(id),而是count(*)
  10. 盡可能在索引中完成排序
緩存的三個要素:
  1. 命中率
  2. 緩存更新策略
  3. 緩存最大數據量
通常緩存更新策略有:
  1. FIFO(先進先出)
  2. LRU(最近最少淘汰策略)
  3. LFU(最少使用淘汰策略)
MySQL 的 Query Cache使用的是FIFO策略
緩存的最大數據量是在緩存中能夠處理元素的最大數或所能使用的最大存儲空間
 
超過緩存機制允許的最大數據量系統會進行相應的處理,一般處理方式有:
  1. 停止緩存服務器,清空所有緩存數據
  2. 拒絕寫入,不再對緩存數據進行更新
  3. 根據緩存更新策略清除舊數據
  4. 基于3的方式,對淘汰的數據進行備份
Opcode緩存:
    虛擬機把PHP代碼編譯成一種中間碼的結果緩存起來,下次PHP運行此頁面時,只要直接解釋這些代碼就行了。
eAccelerator工具能起到常駐內存的作用
 
客戶端緩存、http緩存(待記錄)
H5中的Application Cache:
用來處理離線應用中的問題,用戶不能聯網時依然能瀏覽整個站點
需要在html中指定頁面是否需要此緩存:
<html manifest=”cacheName.mf”>
 
Memcached

使用Memcached:
  1. 對數據庫的高并發讀寫
  2. 對海量數據處理
Memcached是高性能的分布式內存緩存服務器,通過緩存數據庫查詢結果,減少數據庫訪問次數。
Memcached特點:
  1. 協議簡單
  2. 基于libevent的事件處理
  3. 內置內存存儲方式
  4. 采用不互相通信的分布式
  5. 守護進程方式運行與一個或多個服務器中
  6. Memcached使用LRU算法淘汰數據緩存
  7. 不支持數據持久化
Memcached把數據存儲在內存中,所以重啟Memcached或者操作系統會導致數據全部消失
 
安裝memcached:
apt-get install memcached
啟動memcached:
memcached -d -m 128 -u root -p 11211
-d:守護進程方式運行
-m:設置Memcached可使用的內存大小,單位是MB
-l:設置監聽的IP地址,本機可默認不設置
-u:指定用戶
-p:設置監聽的端口,默認為11211
 
安裝PHP的memcached擴展:
 sudo apt-get install php5-memcache
 
memcached擴展的一些方法:
  • Memcache::connect(string $host [, int $port [ , int $timeout]]);     //連接mem服務器
    $timeout為連接持續時間,默認為1秒。過長的時間會倒置失去所有緩存的優勢
  • Memcache::addServer(string $host [ , $port [ , $bool $persistent [ , $weight [, int $timeout [, int $retry_interval [ , bool $status [ , callback $failure_callback]]]]]]]);     //向對象添加一個服務器
  • Memcache::add(string $key,$mixed $var [, int $flag[ , int $expire]]);    //添加緩存數據

    • key長度不能超過250字節,
    • var 值最大為1MB
    • $flag 是否使用ZLib壓縮,設置為MEMACHE_COMPRESSED使用壓縮
    • $expire緩存過期時間,0表示不過期。設置不能大于2592000(30天)
  • Memcache::replace(string $key, mixed $var [ , int $flag [, int $expire]]);    //替換一個已存在的key
  • Memcache::set(string $key ,mixed $vsar [ , $flag [ , $expire]])    //add和replace的集合體
  • Memcache::get(string $key [ , int &flags]);    //獲取key的緩存內容

    • $flags 如果給定此參數(引用方式傳遞),該參數會被寫入一些與key對應的信息
  • Memcache::delete(string $key [ , $timeout]);    //刪除key的緩存
  • Memcache::flush(void);    //立即使所有已經存在的緩存失效

    • 不真正釋放任何資源,僅標記為失效
  • Memcache::getServerStatus(string $host [ , $port]);    //獲取一個服務器的在線/離線狀態
  • Memcache::getStats([ string $type [ , $slabid [ , int $limit = 100]]]);    //獲取服務器的統計信息
  • Memcache::close(void);    //關閉與Memcache服務器的連接
Memcached使用多路復用I/O模型(如epoll、select),傳統阻塞IO中 系統可能會因為某個用戶連接還沒做好IO準備而一直等待,直到這個連接做好準備,如果此時游其他用戶連接到服務器,可能會因為系統阻塞而得不到相應。
多路復用I/O是一種消息通知模式,用戶連接做好IO準備后,系統會通知這個連接可進行IO操作,這樣就不會阻塞在某個用戶連接。
Memcached使用Slab分配算法保存數據
Slab分配算法的原理是,把固定大小(mem默認為1M)的內存劃分為n塊,每1M大小的內存塊稱為一個slab頁,每次向系統申請一個slab頁,然后通過分割算法把這個slab頁分成若個小塊的chunk,然后把這些chunk分配給用戶使用。
Memcached多線程模型:
  • 主線程:接受客戶端連接,并把連接分配給工作線程處理
  • 工作線程:處理客戶端連接的請求
Memcached分布式布置方案:
  • 普通Hash分布
  • 一致性Hash分布
Redis


Redis把整個數據庫全加載到內存中進行操作,通過異步操作定期把數據庫數據flush到硬盤保存
Reids特點:
  1. 支持豐富的數據類型:String、List、Sort、Sorted Set、Hash
  2. 支持數據持久化方式:內存快照、日志追加
  3. 支持主從復制
安裝Redis:
安裝php擴展redis:
sudo apt-get install php5-redis
redis默認端口為:6379
 
redis配置文件(待整理)
 
redis key相關命令:
exits key     //key是否存在,返回0/1
del key1 key2..     //刪除指定key,返回刪除key的數目,0表示key都不存在
type key     //返回給定key的value類型,none表示不存在key
types pattern     //返回匹配指定模式的所有key
expire key seconds     //設置指定key的過期時間
randomkey     //返回當前數據庫中隨機的一個key,如果數據庫為空,返回空字符串
rename oldkey newkey     //重命名key
renamenx oldkey newkey     //重命名key,如果newkey存在返回失敗
ttl key     //返回設置過期時間key的剩余秒數,-1表示key不存在或沒有設置過期時間
move key db-index     //將key從當前數據庫移動到指定的數據庫,返回1成功,0表示不存在或已在指定數據庫
 
未完待續……

轉自 http://www.cnblogs.com/fanchangfa/p/4325451.html

原創文章,作者:stanley,如若轉載,請注明出處:http://www.www58058.com/807

(0)
stanleystanley
上一篇 2015-03-10
下一篇 2015-03-10

相關推薦

  • 設計模式 ( 十八 ) 策略模式Strategy(對象行為型)

    設計模式 ( 十八 ) 策略模式Strategy(對象行為型) 1.概述         在軟件開發中也常常遇到類似的情況,實現某一個功能有多種算法或者策略,我們可以根據環境或者條件的不同選擇不同的算法或者策略來完成該功能。如查找、排序等,一種常用的方法是硬編碼(Hard Coding)在一個類中,如需要提供多種查找算…

    Linux干貨 2015-07-28
  • Python函數式編程指南(二):函數

    這是此系列的第二篇,試圖說明在Python中如何更好地使用函數并引導諸位使用函數式的思維進行思考。掌握并應用這些內容,就已經是至少形似的函數式風格的代碼了,至于思維么,這個真靠自己。 作者水平有限,如有錯漏之處還請指出;轉載請注明原作者和原地址:) 2. 從函數開始 2.1. 定義一個函數 如下定義了一個求和函數: def add(x, y): return…

    Linux干貨 2015-03-11
  • 馬哥教育網絡班20期+第二周課程練習

    1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。  答:文件管理類命令有: touch :創建一個新文件 示例:在/tmp/目錄下創建一個1.log文件 touch /tmp/1.log mv:移動文件  示例:將/etc/fstab文件移至/tmp/目錄中。  mv /etc/fstab /tmp/…

    Linux干貨 2016-06-23
  • CentOS 6的開機流程及root密碼破解

    一、CentOS 6的開機流程詳解 啟動流程詳解 1、POST:    Power-On-Self-Test,加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、串并行接口、鍵盤、CD-ROM光驅等硬件情況的檢測。 2、BootSequence(BIOS):    決定那個磁盤…

    Linux干貨 2016-09-13
  • 非交互式添加分區

    非交互式添加分區 方法一 添加/deb/sdb 下的分區,其實位置為1到1000M,第二個分區位置為1001至3000M,位置千萬不能指定錯誤 parted /dev/sdb mkpart primary 1 1000M parted /dev/sdb mkpart primary 1001 3000M 方法二 (1)將你要在parted命令行輸入的命令實現…

    Linux干貨 2017-04-24
  • LVM邏輯卷管理

    LVM邏輯卷管理 LVM全稱為Logical VolumeManager邏輯卷管理器,LVM是Linux環境中對磁盤分區進行管理的一種機制,是建立在硬盤和分區之上、文件系統之下的一個邏輯層,可提高磁盤分區管理的靈活性。 其中 PV:Physical Volume 物理卷 VG:volume Group 卷組 LV:Logincal Volume 邏輯卷 實驗…

    2017-08-14
欧美性久久久久