-
preg_match用來執行一個匹配,可以簡單的用來判斷模式是否匹配成功,或者取得一個匹配結果,他的返回值是匹配成功的次數0或者1,在匹配到1次以后就會停止搜索。
$subject = "abcdef";
$pattern = '/a(.*?)d/';
preg_match($pattern, $subject, $matches);
print_r($matches); //結果為:Array ( [0] => abcd [1] => bc )匹配email的方法:
$subject = "my email is [email protected]";
$pattern = '/[\w\-]+@\w+\.\w+/';
preg_match($pattern, $subject, $matches);
echo $matches[0];//matches指存入的容器查看全部 -
貪婪模式:在可匹配與可不匹配的時候,優先匹配
//下面的\d表示匹配數字
$p = '/\d+\-\d+/';$str = "我的電話是010-12345678";preg_match($p, $str, $match);echo $match[0]; //結果為:010-12345678懶惰模式:在可匹配與可不匹配的時候,優先不匹配
$p = '/\d?\-\d?/';
$str = "我的電話是010-12345678";
preg_match($p, $str, $match);
echo $match[0]; ?//結果為:0-1當我們確切的知道所匹配的字符長度的時候,可以使用{}指定匹配字符數
$p = '/\d{3}\-\d{8}/';
$str = "我的電話是010-12345678";
preg_match($p, $str, $match);
echo $match[0]; //結果為:010-12345678查看全部 -
常用的元字符有:
\ 一般用于轉義字符
^ 斷言目標的開始位置(或在多行模式下是行首)
$ 斷言目標的結束位置(或在多行模式下是行尾)
. 匹配除換行符外的任何字符(默認)
[ 開始字符類定義
] 結束字符類定義
| 開始一個可選分支
( 子組的開始標記
) 子組的結束標記
? 作為量詞,表示 0 次或 1 次匹配。位于量詞后面用于改變量詞的貪婪特性。 (查閱量詞)
* 量詞,0 次或多次匹配
+ 量詞,1 次或多次匹配
{ 自定義量詞開始標記
} 自定義量詞結束標記方括號內使用的有:
\ 轉義字符
^ 僅在作為第一個字符(方括號內)時,表明字符類取反
- 標記字符范圍其中^在反括號外面,表示斷言目標的開始位置,但在方括號內部則代表字符類取反,方括號內的減號-可以標記字符范圍,例如0-9表示0到9之間的所有數字。
查看全部 -
如果模式中包含分隔符,則分隔符需要使用反斜杠(\)進行轉義。
/http:\/\//
如果模式中包含較多的分割字符,建議更換其他的字符作為分隔符,也可以采用preg_quote進行轉義。
$p = 'http://';
$p = '/'.preg_quote($p, '/').'/';
echo $p;分隔符后面可以使用模式修飾符,模式修飾符包括:i, m, s, x等,例如使用i修飾符可以忽略大小寫匹配:
$str = "Http://www.xianlaiwan.cn/";
if (preg_match('/http/i', $str)) {
? ?echo '匹配成功';
}查看全部 -
$p = '/apple/';//注意不要少了兩個‘/’
$str = "apple banna";
if (preg_match($p, $str)) {
? ?echo 'matched';
}其中字符串'/apple/'就是一個正則表達式,他用來匹配源字符串中是否存在apple字符串。
PHP中使用PCRE庫函數進行正則匹配,比如上例中的preg_match用于執行一個正則匹配,常用來判斷一類字符模式是否存在。
查看全部 -
對象比較,當同一個類的兩個實例的所有屬性都相等時,可以使用比較運算符==進行判斷,當需要判斷兩個變量是否為同一個對象的引用時,可以使用全等運算符===進行判斷。
class Car {
}
$a = new Car();
$b = new Car();
if ($a == $b) echo '=='; ? //true
if ($a === $b) echo '==='; //false對象復制,在一些特殊情況下,可以通過關鍵字clone來復制一個對象,這時__clone方法會被調用,通過這個魔術方法來設置屬性的值。
class Car {
? ?public $name = 'car';
? ?
? ?public function __clone() {
? ? ? ?$obj = new Car();
? ? ? ?$obj->name = $this->name;
? ?}
}
$a = new Car();
$a->name = 'new car';
$b = clone $a;
var_dump($b);對象序列化,可以通過serialize方法將對象序列化為字符串,用于存儲或者傳遞數據,然后在需要的時候通過unserialize將字符串反序列化成對象進行使用。
class Car {
? ?public $name = 'car';
}
$a = new Car();
$str = serialize($a); //對象序列化成字符串
echo $str.'<br>';
$b = unserialize($str); //反序列化為對象
var_dump($b);查看全部 -
屬性的重載通過__set,__get,__isset,__unset來分別實現對不存在屬性的賦值、讀取、判斷屬性是否設置、銷毀屬性。
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屬性動態創建并賦值
echo $car->name;方法的重載通過__call來實現,當調用不存在的方法的時候,將會轉為參數調用__call方法,當調用不存在的靜態方法時會使用__callStatic重載。
class Car {
? ?public $speed = 0;
? ?
? ?public function __call($name, $args) {
? ? ? ?if ($name == 'speedUp') {
? ? ? ? ? ?$this->speed += 10;
? ? ? ?}
? ?}
}
$car = new Car();
$car->speedUp(); //調用不存在的方法會使用重載
echo $car->speed;查看全部 -
class Car {
? ? public $speed = 0; //汽車的起始速度是0
? ??
? ? public function speedUp() {
? ? ? ? $this->speed += 10;
? ? ? ? return $this->speed;
? ? }
}
//定義繼承于Car的Truck類
class Truck extends Car//注意沒有()
{
? ? public function speedUp(){
? ? ? ? $this->speed=parent::speedUp()+50;
? ? }
}
$car = new Truck();
$car->speedUp();
echo $car->speed;
查看全部 -
類屬性必須定義為公有、受保護、私有之一。為兼容PHP5以前的版本,如果采用 var 定義,則被視為公有。
class Car {
? ?$speed = 10; //錯誤 屬性必須定義訪問控制
? ?public $name; ? //定義共有屬性
}類中的方法可以被定義為公有、私有或受保護。如果沒有設置這些關鍵字,則該方法默認為公有。
class Car {
? ?//默認為共有方法
? ?function turnLeft() {
? ?}
}如果構造函數定義成了私有方法,則不允許直接實例化對象了,這時候一般通過靜態方法進行實例化,在設計模式中會經常使用這樣的方法來控制對象的創建,比如單例模式只允許有一個全局唯一的對象。
class Car {
? ?private function __construct() {
? ? ? ?echo 'object create';
? ?}
? ?private static $_object = null;
? ?public static function getInstance() {
? ? ? ?if (empty(self::$_object)) {
? ? ? ? ? ?self::$_object = new Car(); //內部方法可以調用私有方法,因此這里可以創建對象
? ? ? ?}
? ? ? ?return self::$_object;
? ?}
}
//$car = new Car(); //這里不允許直接實例化對象
$car = Car::getInstance(); //通過靜態方法來獲得一個實例查看全部 -
靜態屬性與方法可以在不實例化類的情況下調用,直接使用類名::方法名的方式進行調用。靜態屬性不允許對象使用->操作符調用。
class Car {
? ?private static $speed = 10;
? ?
? ?public static function getSpeed() {
? ? ? ?return self::$speed;
? ?}
}
echo Car::getSpeed(); ?//調用靜態方法靜態方法也可以通過變量來進行動態調用
$func = 'getSpeed';
$className = 'Car';
echo $className::$func(); ?//動態調用靜態方法靜態方法中,$this偽變量不允許使用??梢允褂胹elf,parent,static在內部調用靜態方法與屬性。
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();查看全部 -
使用__construct()定義一個構造函數,具有構造函數的類,會在每次對象創建的時候調用該函數,因此常用來在對象創建的時候進行一些初始化工作。
class Car {
? function __construct() {
? ? ? print "構造函數被調用\n";
? }
}
$car = new Car(); //實例化的時候 會自動調用構造函數__construct,這里會輸出一個字符串在子類中如果定義了__construct則不會調用父類的__construct,如果需要同時調用父類的構造函數,需要使用parent::__construct()顯式的調用。
class Car {
? function __construct() {
? ? ? print "父類構造函數被調用\n";
? }
}
class Truck extends Car {
? ?function __construct() {
? ? ? ?print "子類構造函數被調用\n";
? ? ? ?parent::__construct();
? ?}
}
$car = new Truck();同樣,PHP5支持析構函數,使用__destruct()進行定義,析構函數指的是當某個對象的所有引用被刪除,或者對象被顯式的銷毀時會執行的函數。
class Car {
? function __construct() {
? ? ? print "構造函數被調用 \n";
? }
? function __destruct() {
? ? ? print "析構函數被調用 \n";
? }
}
$car = new Car(); //實例化時會調用構造函數
echo '使用后,準備銷毀car對象 \n';
unset($car); //銷毀時會調用析構函數注意:construct前有兩個_
查看全部 -
同屬性一樣,類的方法也具有public,protected 以及?private 的訪問控制。
訪問控制的關鍵字代表的意義為:
public:公開的
protected:受保護的
private:私有的我們可以這樣定義方法:
class Car {
? ?public function getName() {
? ? ? ?return '汽車';
? ?}
}
$car = new Car();
echo $car->getName();使用關鍵字static修飾的,稱之為靜態方法,靜態方法不需要實例化對象,可以通過類名直接調用,操作符為雙冒號::。
class Car {
? ?public static function getName() {
? ? ? ?return '汽車';
? ?}
}
echo Car::getName(); //結果為“汽車”查看全部 -
//定義一個類
class Car {
? ?//定義屬性
? ?public $name = '汽車';
? ?//定義方法
? ?public function getName() {
? ? ? ?//方法內部可以使用$this偽變量調用對象的屬性或者方法
? ? ? ?return $this->name;
? ?}
}要創建一個類的實例,可以使用new關鍵字創建一個對象。
$car = new Car();
//也可以采用變量來創建
$className = 'Car';
$car = new $className();查看全部 -
常定義一個汽車類的方法為:
class Car {
? ?$name = '汽車';
? ?function getName() {
? ? ? ?return $this->name;
? ?}}類是一類東西的結構描述,而對象則是一類東西的一個具體實例,例如汽車這個名詞可以理解為汽車的總類,但這輛汽車則是一個具體的汽車對象。
對象通過new關鍵字進行實例化:
$car = new Car();
echo $car->getName();查看全部 -
用數組變量的名字后跟中括號+鍵的方式來訪問數組中的值,鍵使用單引號或者雙引號括起來。
比如:
$fruit = array('apple'=>"蘋果",'banana'=>"香蕉",'pineapple'=>"菠蘿");
$fruit0 = $fruit['banana'];
print_r($fruit0);查看全部
舉報