空閑時(shí)間學(xué)習(xí)學(xué)習(xí)php的知識(shí),長期記錄博客。知識(shí)點(diǎn)比較零散,只是對(duì)感覺有必要注意的知識(shí)點(diǎn)做個(gè)記錄。
- 雙引號(hào)和單引號(hào)的區(qū)別
雙引號(hào)會(huì)解析變量,而單引號(hào)不會(huì)解析變量,單引號(hào)中的變量將會(huì)被當(dāng)做字符串處理 - 較長字符串的處理
Heretic格式:我們可以使用Heredoc結(jié)構(gòu)形式的方法來解決該問題,首先使用定界符表示字符串(<<<),接著在“<<<“之后提供一個(gè)標(biāo)識(shí)符GOD,然后是字符串,最后以提供的這個(gè)標(biāo)識(shí)符結(jié)束字符串。如:
$string1 = <<<GOD
我有一只小毛驢,我從來也不騎。
有一天我心血來潮,騎著去趕集。
我手里拿著小皮鞭,我心里正得意。
不知怎么嘩啦啦啦啦,我摔了一身泥.
GOD;
echo $string1;
NULL
NULL(NULL):NULL是空類型,對(duì)大小寫不敏感,NULL類型只有一個(gè)取值,表示一個(gè)變量沒有值,當(dāng)被賦值為NULL,或者尚未被賦值,或者被unset(),這三種情況下變量被認(rèn)為為NULL。常量的定義
define("PI",3.14);
判斷常量是否被定義過用defiend()函數(shù)賦值運(yùn)算符
=和&:=和其他語言一樣。&類似于指針,指向同一個(gè)數(shù)據(jù),公用一塊內(nèi)存,某一個(gè)變量的值發(fā)生變化時(shí),另外一個(gè)值也會(huì)相應(yīng)改變。比較運(yùn)算符
=== : 全等,$a === $b ,如果a等于b它們的類型也相同,返回true
<> : 不等, 等同于!= ,值不等時(shí)返回true
!== :非全等,$a!==$b,當(dāng)a不等于b或者類型不同時(shí),返回true邏輯運(yùn)算符

- 字符串連接運(yùn)算符
"." 并不改變?cè)址?br> ".=" 改變?cè)址?br>$a = $a."呵呵";等價(jià)于a.="呵呵" - 錯(cuò)誤控制運(yùn)算符
PHP中提供了一個(gè)錯(cuò)誤控制運(yùn)算符“@”,對(duì)于一些可能會(huì)在運(yùn)行過程中出錯(cuò)的表達(dá)式時(shí),我們不希望出錯(cuò)的時(shí)候給客戶顯示錯(cuò)誤信息,這樣對(duì)用戶不友好。于是,可以將@放置在一個(gè)PHP表達(dá)式之前,該表達(dá)式可能產(chǎn)生的任何錯(cuò)誤信息都被忽略掉;
如果激活了track_error(這個(gè)玩意在php.ini中設(shè)置)特性,表達(dá)式所產(chǎn)生的任何錯(cuò)誤信息都被存放在變量$php_errormsg中,此變量在每次出錯(cuò)時(shí)都會(huì)被覆蓋,所以如果想用它的話必須盡早檢查。
需要注意的是:錯(cuò)誤控制前綴“@”不會(huì)屏蔽解析錯(cuò)誤的信息,不能把它放在函數(shù)或類的定義之前,也不能用于條件結(jié)構(gòu)例如if和foreach等。 - foreach循環(huán)語句
常用語遍歷數(shù)組,類似于OC中的 for-in
//不取下標(biāo)的情況
<?php
$students = array(
'2010'=>'令狐沖',
'2011'=>'林平之',
'2012'=>'曲洋',
'2013'=>'任盈盈',
'2014'=>'向問天',
'2015'=>'任我行',
'2016'=>'沖虛',
'2017'=>'方正',
'2018'=>'岳不群',
'2019'=>'寧中則',
);//10個(gè)學(xué)生的學(xué)號(hào)和姓名,用數(shù)組存儲(chǔ)
//使用循環(huán)結(jié)構(gòu)遍歷數(shù)組,獲取學(xué)號(hào)和姓名
foreach($students as $v){
echo $v;//輸出(打?。┬彰? echo "<br />";
}
?>
//取下標(biāo)的情況
foreach($students as $key => $v){
echo $key.":".$v;//輸出(打?。W(xué)號(hào):姓名
echo "<br />";
}
- 數(shù)組賦值的三中方式
1)$array[0] = "蘋果";
2)$arr = array("0"=>"蘋果");
3)$arr = array("蘋果");
2和3等價(jià) - 類和屬性
在類中定義的變量稱之為屬性,通常屬性跟數(shù)據(jù)庫中的字段有一定的關(guān)聯(lián),因此也可以稱作“字段”。屬性聲明是由關(guān)鍵字 public,protected 或者 private 開頭,后面跟一個(gè)普通的變量聲明來組成。屬性的變量可以設(shè)置初始化的默認(rèn)值,默認(rèn)值必須是常量。
訪問控制的關(guān)鍵字代表的意義為:
public:公開的
protected:受保護(hù)的
private:私有的
class Car {
//定義公共屬性
public $name = '汽車';
//定義受保護(hù)的屬性
protected $corlor = '白色';
//定義私有屬性
private $price = '100000';
}
默認(rèn)都為public,外部可以訪問。一般通過->對(duì)象操作符來訪問對(duì)象的屬性或者方法,對(duì)于靜態(tài)屬性則使用::雙冒號(hào)進(jìn)行訪問。當(dāng)在類成員方法內(nèi)部調(diào)用的時(shí)候,可以使用$this(類似于OC的self)偽變量調(diào)用當(dāng)前對(duì)象的屬性。
$car = new Car();
echo $car->name; //調(diào)用對(duì)象的屬性
echo $car->color; //錯(cuò)誤 受保護(hù)的屬性不允許外部調(diào)用
echo $car->price; //錯(cuò)誤 私有屬性不允許外部調(diào)用
受保護(hù)的屬性與私有屬性不允許外部調(diào)用,在類的成員方法內(nèi)部是可以調(diào)用的。
class Car{
private $price = '1000';
public function getPrice() {
return $this->price; //內(nèi)部訪問私有屬性
? }
}
- 定義類的方法
方法就是在類中的function,很多時(shí)候我們分不清方法與函數(shù)有什么差別,在面向過程的程序設(shè)計(jì)中function叫做函數(shù),在面向?qū)ο笾衒unction則被稱之為方法。
同屬性一樣,類的方法也具有public,protected 以及 private 的訪問控制。
訪問控制的關(guān)鍵字代表的意義為:
public:公開的
protected:受保護(hù)的
private:私有的
我們可以這樣定義方法:
class Car {
public function getName() {
return '汽車';
}
?}
$car = new Car();
echo $car->getName();
- static靜態(tài)關(guān)鍵字
使用關(guān)鍵字static修飾的,稱之為靜態(tài)方法,靜態(tài)方法不需要實(shí)例化對(duì)象,可以通過類名直接調(diào)用(類似于OC中的類方法),操作符為雙冒號(hào)::。
class Car {
public static function getName() {
return '汽車';
}
?}
echo Car::getName(); //結(jié)果為“汽車”
靜態(tài)屬性與方法可以在不實(shí)例化類的情況下調(diào)用,直接使用類名::方法名的方式進(jìn)行調(diào)用。靜態(tài)屬性不允許對(duì)象使用->操作符調(diào)用。
class Car {
private static $speed = 10;
public static function getSpeed() {
return self::$speed;
}
}
echo Car::getSpeed(); //調(diào)用靜態(tài)方法
靜態(tài)方法也可以通過變量來進(jìn)行動(dòng)態(tài)調(diào)用
$func = 'getSpeed';
$className = 'Car';
echo $className::$func(); //動(dòng)態(tài)調(diào)用靜態(tài)方法
靜態(tài)方法中,$this偽變量不允許使用。可以使用self,parent,static在內(nèi)部調(diào)用靜態(tài)方法與屬性。
class Car {
private static $speed = 10;
public static function getSpeed() {
return self::$speed;
}
public static function speedUp() {
return self::$speed+=10;
}
}
class BigCar extends Car {
public static function start() {
parent::speedUp();
}
}
BigCar::start();
echo BigCar::getSpeed();
- 對(duì)象繼承
類的繼承用extends關(guān)鍵字
<?php
class Car {
public $speed = 0; //汽車的起始速度是0
public function speedUp() {
$this->speed += 10;
return $this->speed;
}
}
//定義繼承于Car的Truck類
class Truck extends Car{
//重寫speedUp方法
public function speedUp(){
$this->speed += 50;
return $this->speed;
}
}
$car = new Truck();
$car->speedUp();
echo $car->speed;
-
重載
- php的重載和其他語言中的重載意義不一樣,php中的重載指的是動(dòng)態(tài)的創(chuàng)建屬性與方法,是通過魔術(shù)方法實(shí)現(xiàn)的。屬性的重載通過__set、__get 、__isset 、__unset來分別實(shí)現(xiàn)對(duì)不存在屬性的賦值、讀取、判斷屬性是否設(shè)置、銷毀屬性。
class Car {
private $ary = array();
public function __set($key, $val) {
$this->ary[$key] = $val;
}
public function __get($key) {
if (isset($this->ary[$key])) {
return $this->ary[$key];
}
return null;
}
public function __isset($key) {
if (isset($this->ary[$key])) {
return true;
}
return false;
}
public function __unset($key) {
unset($this->ary[$key]);
}
}
$car = new Car();
$car->name = '汽車'; //name屬性動(dòng)態(tài)創(chuàng)建并賦值
echo $car->name;
在上面的例子中我們可以看到,本來的Car類中是沒有name屬性的,通過屬性的重載可以動(dòng)態(tài)的創(chuàng)建name屬性并進(jìn)行相應(yīng)操作。
- 同理,也可以實(shí)現(xiàn)方法的重載,方法的重載是通過__call來實(shí)現(xiàn)的,當(dāng)調(diào)用不存在的方法的時(shí)候,將會(huì)轉(zhuǎn)為參數(shù)調(diào)用__call方法,當(dāng)調(diào)用不存在的靜態(tài)方法時(shí)會(huì)使用__callStatic重載。
class Car {
public $speed = 0;
public function __call($name, $args) {
if ($name == 'speedUp') {
$this->speed += 10;
}
}
}
$car = new Car();
$car->speedUp(); //調(diào)用不存在的方法會(huì)使用重載
echo $car->speed;
- 字符串操作
- 去除字符串的空格
trim去除一個(gè)字符串兩端空格。
rtrim是去除一個(gè)字符串右部空格,其中的r是right的縮寫。
ltrim是去除一個(gè)字符串左部空格,其中的l是left的縮寫。
echo trim(" 空格 ")."<br>";
echo rtrim(" 空格 ")."<br>";
echo ltrim(" 空格 ")."<br>";
- 獲取字符串長度
$str = 'hello';
$len = strlen($str);
echo $len;//輸出結(jié)果是5
//中文情況
$str = "我愛你";
echo mb_strlen($str,"UTF8");//結(jié)果:3,此處的UTF8表示中文編碼是UTF8格式,中文一般采用UTF8編碼
3)字符串截取
$str='i love you';
//截取love這幾個(gè)字母
echo substr($str, 2, 4);//為什么開始位置是2呢,因?yàn)閟ubstr函數(shù)計(jì)算字符串位置是從0開始的,也就是0的位置是i,1的位置是空格,l的位置是2。從位置2開始取4個(gè)字符,就是love。
$str='我愛你,中國';
//截取中國兩個(gè)字
echo mb_substr($str, 4, 2, 'utf8');//為什么開始位置是4呢,和上一個(gè)例子一樣,因?yàn)閙b_substr函數(shù)計(jì)算漢字位置是從0開始的,也就是0的位置是我,1的位置是愛,4的位置是中。從位置4開始取2個(gè)漢字,就是中國。中文編碼一般是utf8格式
- 字符串查找
$str = 'I want to study at imooc';
$pos = strpos($str, 'imooc');
echo $pos;//結(jié)果顯示19,表示從位置0開始,imooc在第19個(gè)位置開始出現(xiàn)
- 字符串替換
$str = 'I want to learn js';
$replace = str_replace('js', 'php', $str);
echo $replace;//結(jié)果顯示I want to learn php
- 字符串合并與分割
$arr = array('Hello', 'World!');
$result = implode('', $arr);
print_r($result);//結(jié)果顯示Hello World!
$str = 'apple,banana';
$result = explode(',', $str);
print_r($result);//結(jié)果顯示array('apple','banana')
- 字符串的反義
反義的目的主要是保證數(shù)據(jù)傳輸?shù)陌踩?/li>
$str = "what's your name?";
echo addslashes($str);//輸出:what\'s your name?