php动物书总结01-06
最近看了PHP編程動物書,在此記錄下1-6章內容要點。
1.PHP介紹
* PHP可以做服務端編程、命令行編程(寫腳本)、客戶端圖形界面
* PHP使用GD擴展處理圖像
* PHP配置文件php.ini文檔:https://php.net/manual/zh/configuration.file.php
* PHP關鍵字(關鍵字不區分大小寫):
1. __CLASS__、__DIR__、__FILE__、__FUNCTION__、__LINE__、__METHOD__、__TRAIT__、__holt_compiler()__
2. and、array、as、echo、enddeclare、endfor、endforeach、endif、endswitch、endwhile、eval、exit、interface、insteadof、list、or、print、callable、instanceof、trait、var、xor
* PHP內置函數
2.PHP數據類型
* 數據類型
1. PHP數據類型共八種:四種標量型(整型、浮點型、字符串、布爾型),兩種復合型(數組、對象),兩種特殊類型(資源、NULL)
2. 整型范圍通常是:-2^31 ~ 2^31-1 (4字節)
3. 浮點型和C語音雙精度浮點型范圍一樣,通常是:1.7E-308 ~ 1.7E+308之間(8字節),精確到15位數字
4. 如果需要更高精度或更寬范圍,可以使用BC或GM擴展
5. 浮點值只是數的近似表示,例如在許多系統中,3.5實際上表示未3.49999...。這意味著寫代碼的時候要盡量避免假定浮點數是準確的,例如直接使用==比較兩個浮點數,一般的方法是比較前幾位:
6. 變量在雙引號中會被解析,在單引號中不解析
7. 轉義符號在雙引號中可以解析,單引號中只有和'會解析
8. PHP中以下值的計算結果為false:
false、0、0.0、空字符串和字符串'0'、空數組、空對象、null值。
一個值不是真的就是假的,包括所有資源類型的值(所以可以用if直接判斷)
9. 數組分為普通數組和關聯數組,遍歷數組方法很多,最常用的是foreach
10. 資源:數據庫連接、文件連接都是資源,is_resource()判斷一個變量是否是資源
11. 回調(callable):一些函數被另一些函數調用,如call_user_func()。回調函數可以通過函數聲明和閉包方式創建。
12. NULL,不區分大小寫,表示變量沒有值,可以通過is_null()判斷是否為null。
* 變量
1. 變量以$開頭,$$表示變量的變量:
$foo = "bar"; $$foo = "aaa"; echo $bar; //打印"aaa"2. 變量的引用:引用是變量的別名,和原變量指向相同的變量地址,銷毀(unset)其中一個不影響另一個的值。函數可以通過&引用返回值(可以避免大字符串和數組的拷貝)
function &retRef() {$var = "php";return $var; } $v = &retRef(); // 函數聲明和調用的時候都需要帶上引用符號& 3. PHP變量有四種作用域:全局、局部、靜態、和函數參數
與其它語言不同,PHP只能在函數中提供局部作用域(只有在函數中聲明的變量才是局部變量),不能在循環、嵌套、條件分支或其它塊類型中創建局部變量。函數參數局部有效。
在函數中可以使用全局變量相同名稱的局部變量,可以按如下方式使用全局變量:
* 垃圾收集
PHP使用引用計數和寫時復制來管理內存。PHP中,符號表將變量名映射到內存中變量地址,當一個變量賦值到另一個變量時,PHP不會復制值使用更多的內存,只是更改符號表說明另一個變量指向同樣的變量地址,并且使變量的引用計數加1。此時,修改其中一個變量的值,PHP會分配一塊內存來保存值,并且把原變量地址引用計數減1。引用計數就是指向一個變量地址的變量數目,當引用計數值為0時,變量內存地址被釋放。
* 表達式和操作符
1. clone/new(創建新對象)
2. ~(按位取反)、<<(左移)、>>(右移)
3. !=/<>(不等于)、===(類型和值都相等)、!==(類型或值不等)、&(按位與)、^(按位異或)、|(按位或)
4. +=、*=、/=、%=、&=、|=、~=、^=、<<=、>>=、.=
5. and(&&)、or(||)、xor(異或)、!(非),PS:優先級與比或高
* 隱式轉換
需要的數據類型與實際數據類型不符時,會對實際類型進行隱式類型轉換
1. 字符串與數字算術操作時會轉為數字。字符串轉數字必須在字符串開頭有數字,如果數字中有.或e/E會轉為浮點數,否則轉為0。
2. 字符串連接操作,會把數字轉為字符串。
3. 比較操作符會根據操作類型按照數字大小或字典序進行比較。需要注意的是,如果兩個字符串都是數字,會當作數字進行比較。*PS:字典序指的是ASCLL序,數字<大寫字母<小寫字母。*
4. 位操作符使用時,會用操作數的二進制形式進行操作,返回值與操作數類型一致。對字符串二進制進行操作,結果返回字符串,如~返回對字符串每一位取反后對應的字符串,&返回字符串長度與較短的字符串相同,|返回的字符串與較長的字符串相同。
5. <<、>>操作數不是整數會先轉為整數,左移N位相當于乘以2^N ,移位時最右邊用0補充,右移操作類似,最左邊用0補充。
* 顯示類型轉換(強制類型轉換)
1. (object)轉為對象、(array)轉為數組、(unset)轉為NULL。
2. 類型轉換只會影響其他操作符解析變量的方式,不會改變變量本身的值。不是所有轉換都可以正常進行,把數組轉為整數類型會變成1,轉成字符串類型會變為"Array"。
3. 對象轉為數組,會建立一個對象公開屬性的關聯數組。數組轉為對象則相反(不合法的屬性名,不能訪問到)
* 其它操作符
1.@ //屏蔽操作
2.`...` //執行shell命令,并返回輸出結果,如:```echo `ls /tmp`;```
3.instanceof //對象類型測試
4.insteadof //用于指定trait
5.break
break可以指定跳出的層數,所以可以從內層退出外層循環
break跳出本層循環,continue跳過本次循環,跳到下一次循環條件判斷
6.可以使用do...while保證循環至少執行一次
7.require加載一個文件不存在時會產生致命錯誤,腳本停止執行,include產生一個警告,腳本不停止執行。所以用include包含一些html頁頭頁腳,require包含一些庫文件。
8.exit退出程序,腳本停止執行,die是exit的別名
3.函數
* 函數參數傳遞方式
1.按值傳遞和按引用傳遞,大多數情況按值傳遞,對大字符串、數組、對象,按值傳遞是一個昂貴的操作。
2.參數按引用傳遞時,傳遞的是實際值而不是值的拷貝,函數內部可以直接修改變量值。
3.數組做函數參數默認按值傳遞,對象做參數默認按引用傳遞?
* 函數參數?
1.函數可以有多個帶默認值的參數,但必須放在不帶默認值參數后面。
2.PHP函數可以使用可變參數,聲明方式是不帶任何參數。
3.可以使用func_get_args()、func_num_args()、func_get_arg()獲取函數參數信息(可變參數只能通過這種方式獲取參數值)。
4.調用參數時,遺漏參數會報一個warning,遺漏的參數會設置為NULL在函數中運行,多余參數則會忽略沒有提示。
* 類型提示
定義函數時,可以限制參數類型為NULL、類或類的子類、數組或回調,調用時必須按指定類型傳參,不然會報可捕獲的致命錯誤。
* 返回引用
1.函數聲明時必須要顯示聲明返回引用,調用時也必須在函數前加&。
2.這個技術有時被用于高效從函數中返回大字符串和數組,然而PHP的寫時復制通常意味著很多時候返回引用是不必要的,返回引用比返回值慢。
* 可變函數
$func_name(); //調用名為$func_name()值的函數* 匿名函數(也稱為閉包)
//usort參數可以是callable類型(閉包)usort($array, function($a, $b) use ($sortOption) {...} );?
4.字符串
* 定義
1.雙引號和heredoc定義的字符串可以解析變量,為了將變量與字符串分隔開,可以使用大括號{}。
2.單引號定義的變量,可以生效的轉義字符只有和'。
3.printf() //字符串格式化輸出 sprintf() //字符串格式化返回
4.調試時使用echo、print、print_r、var_dump(echo是語言結構,其他是函數)
5.訪問字符串單個字符:$string{$i} //$i是字符串偏移量
*編碼和轉義
- HTML:htmlentities()、htmlspecialchars() //html特殊字符轉為html實體。strip_tags() //刪除html標簽 ,get_meta_tags() //提取元標簽
- URL:有兩種方式對url進行編碼,區別在于如何處理空格。rawurlencode() rawurldecode() //空格->%20,urlencode() urldecode() //空格->+?PS:使用這些函數應該只編碼域名后邊的部分,不然域名中的:與/也會被編碼。
- SQL:查詢條件中需要對字符進行轉義,轉義方法很簡單,就是在單引號、雙引號、空字符和反斜杠前面加一個反斜杠。addslashes() //添加反斜杠 stripslashes() //刪除反斜線
*字符串比較
1.==、===、>、<、>=、<=
2.按字典序排序:strcmp、strcasecmp;按自然序(字母和數字分開排序)排序:strnatcmp、strnatcasecmp 。
自然排序:pic1.jpg?pic5.jpg?pic10.jpg?pic50.jpg
字典排序(按ASCLL碼排序):pic1.jpg?pic10.jpg?pic5.jpg?pic50.jpg
* 字符串截取與分割
substr //取字串 substr_replace //替換字串 sscanf($string, $template) //按模板分解字符串parse_url() //解析url
正則表達式:使用正則表達式是處理字符串匹配和分割的一種思路,比如解析某種格式的日志,但比較復雜,用到的時候再研究下。 $string="FredtFlineStone(35)"; $a = sscanf($string, "%st%s(%d)"); print_r($a); //=>Array(0=>Fred,1=>FlintStone,2=>35)
?
5.數組
* PHP內部將所有數組都存儲為關聯數組
* count()、sizeof()、range(2,5)、range(5,2)、range('a','z')
* array本身實現了list與hashmap的功能,此外使用array可以實現集合交集并集差集,隊列,堆棧等功能
6.對象
*用變量值作為標識符(變量名、類名、函數名等)
$object = new Person; // 等同于 $class = "Person"; $object = new $class;$account = new Account(); $object = "account"; ${$object}->init(5000, 100);?
*對象引用
對象一旦被創建,就會通過引用傳遞,不會復制整個對象(既耗時又耗內存)
* 淺拷貝對象,可以使用clone
$p = new Person(); $p2 = clone $p;當使用clone時,如果對象的類定義中有一個名為__clone()的方法,這個類方法可以在對象被復制后立即被調用(clone的鉤子函數)。當一個對象帶有外部資源(如文件句柄、數據庫連接)時,可以使用這個功能來建立新的連接,而不是復制已有的連接(可以使用此功能實現深拷貝)。
*類
1.PHP類名區分大小寫
類和方法可訪問性默認都是public,聲明屬性時必須加上public等訪問標識符。
2.訪問父類中被重寫的方法
3.判斷一個對象是否屬于某個類
if ($obj instanceof Class) {...}?
* 特征trait
在不需要創建父類的情況下,復用類外部的代碼。
trait Logger {public log($logString) {$class_name = __CLASS__;echo date('Y-m-d H:i:s'.":[$class_name] [$log_string]" );} } class User {use Logger;public $name;function __construct($name='') {$this->name = $name;$this->log("create user $name");} } trait First {function doFirst() {...} } trait Second {function doSecnod() {...} } trait All {use First, Second;function doAll() {$this->doFirst();$this->doSecond();} } class Combined {use All; } $obj = new Combined(); $obj->doAll();use多個trait方法名沖突時,可以指定使用哪個trait的方法,或給方法起別名。
class Person {use Command,Marathon {Command::run as runCommand;Marathon::run insteadof Command;} } $p = new Person(); $p->run(); //Marathon run $p->runCommand(); //Command run?
* 自省introspection(相當于Java中的反射)
class_exists() //判斷類是否存在?get_declared_classes() //獲取已聲明的類列表?get_class_methods() //獲取類方法名列表?get_class_vars() //獲取類屬性數組
* 對象檢驗
is_object() //判斷是否為對象?get_class() //得到類名?method_exists() //判斷是否存在某方法?get_object_vars() //獲取對象屬性關聯數組?get_parent_class() //獲取父類名
* 對象序列化
將對象轉換為字節流以方便存儲和傳輸。
$bytes = serialize($obj); //序列化 $obj = unserialize($bytes); //反序列化序列化可用在session存儲上。在序列化和反序列化過程中,PHP有兩個用于對象的鉤子函數(hook)__sleep()和__wakeup()。序列化之前被調用的__sleep,它能執行一些清理工作,如關閉數據庫連接,輸出未保存的持久化數據,該方法返回寫入字節流的數據成員的名稱數組,如果返回空數組,說明沒有任何數據寫入字節流。反序列化之后被調用的是__wakeup(),它可以執行一些初始化操作,如重建數據庫連接或打開文件等。
?
這個代碼塊刪不掉。。。?
轉載于:https://www.cnblogs.com/livepeace/p/8125931.html
總結
以上是生活随笔為你收集整理的php动物书总结01-06的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FPGA在各行业的应用分析
- 下一篇: 014PHP基础知识——流程控制(二)