PHP 基础复习

目录:

——数组

——函数

——字符串操作

——面向对象特征

——正则表达式

——cookies


一.数组

PHP 中的数组分为索引数组和关联数组

索引数组初始化和输出

$a=array("abc","def","ghi");
print_r($a);
赋值方式:
$a=array("a","b","c");
$a[0]=a;
$a=array('0'=>'a','1'=>'b','2'=>'c');
取值方式:
$a0=$a['0'];
for循环取值:
for($i=0;$i<3;$i++){
     echo 'a'.$i.'='.$a[$i];
}
foreach循环取值:
foreach($a as $k=>$v){
    each 'a'.$key.'='.$v;
}
关联数组的初始化和输出

<?PHP
$fruit=array('apple'=>"APPLE",'banana'=>"BANANA",'pineapple'=>"APINEAPPLE");
print_r($fruit);

输出结果:Array ( [apple] => APPLE [banana] => BANANA [pineapple] => APINEAPPLE )

赋值方式:
$furit=array('apple'=>'APPLE');
$furit['apple']='APPLE';

取值方式:
$furit0=$furit['apple']

foreach循环访问关联数组:
foreach($furit as $k=>$v){
    echo 'key['.$key.']='.$v;
}


二.函数

自定义函数
<?php
function say()
{
    echo 'hello world';
}

有返回值的函数
function add($a) {
    return $a+1;
}
返回多值的函数:
function numbers() {
    return array(1, 2, 3);
}
list ($one, $two, $three) = numbers();

调用可变函数,规则:变量名+();
<?php
function func() {
    echo 'my function called.';
}
$name = 'func';
$name();//调用可变函数

class book {
    function getName() {
        return 'bookname';
    }
}
$func = 'getName';
$book = new book();
$book->$func();

字符串替换函数str_replace
<?php
$str = 'I am jobs';
$str=str_replace('jobs','steven jobs',$str);
echo $str;

判断函数是否存在:
<?php
function func() {
    echo 'exists';
}
$name = 'func';
if (function_exists('func')) { //判断函数是否存在
    $name();
}

判断类是否存在:
class MyClass{
}
// 使用前检查类是否存在
if (class_exists('MyClass')) {
    $myclass = new MyClass();
}

判断文件是否存在:
$filename = 'test.txt';
if (!file_exists($filename)) {
    echo $filename . ' not exists.';
}


三.字符串操作

<?php
//使用双/单引号/定义一个字符串
$hello="hello world1";
$hello='hello world2';
//heredoc语法结构
$hello=<<<TAG
hello world3
TAG;
echo $hello;

单/双引号的区别:双引号允许包含 字符串变量
<?php
$str='hello';
echo "str is $str"; //运行结果: str is hello
echo 'str is $str'; //运行结果: str is $str

字符串链接:用“.”链接字符串
$hello='hello';
$world=' world';
$hi = $hello.$world;

除去首位空格:
trim去除一个字符串两端空格。
rtrim是去除一个字符串右部空格,其中的r是right的缩写。
ltrim是去除一个字符串左部空格,其中的l是left的缩写。
echo trim(" 空格 ")."<br>";
echo rtrim(" 空格 ")."<br>";
echo ltrim(" 空格 ")."<br>";

字符串长度:
$str = 'hello';
$len = strlen($str);
echo $len;//输出结果是5

中文字符串长度:
$str = "我爱你";
echo mb_strlen($str,"UTF8");//结果:3

字符串截取:
函数说明:substr(字符串变量,开始截取的位置,截取个数)
$str='i love you';
//截取love这几个字母
echo substr($str, 2, 4);

中文字符串截取:
$str='我爱你,中国';
//截取中国两个字
echo mb_substr($str, 4, 2, 'utf8');

字符串查找:
函数说明:strpos(要处理的字符串, 要定位的字符串, 定位的起始位置[可选])
$str = 'I want to study at imooc';
$pos = strpos($str, 'imooc');
echo $pos;//结果显示19,表示从位置0开始,imooc在第19个位置开始出现

字符串替换:
函数说明:str_replace(要查找的字符串, 要替换的字符串, 被搜索的字符串, 替换进行计数[可选])
$str = 'I want to learn js';
$replace = str_replace('js', 'php', $str);
echo $replace;//结果显示I want to learn php

格式化字符串:
函数说明:sprintf(格式, 要转化的字符串)
$str = '99.9';
$result = sprintf('%01.2f', $str);
echo $result;//结果显示99.90
说明:1、这个 % 符号是开始的意思,写在最前面表示指定格式开始了。 也就是 "起始字符", 直到出现 "转换字符" 为止,就算格式终止。
2、跟在 % 符号后面的是 0, 是 "填空字元" ,表示如果位置空着就用0来填满。
3、在 0 后面的是1,这个 1 是规定整个所有的字符串占位要有1位以上(小数点也算一个占位)。
    如果把 1 改成 6,则 $result的值将为 099.90
    因为,在小数点后面必须是两位,99.90一共5个占位,现在需要6个占位,所以用0来填满。
4、在 %01 后面的 .2 (点2) 就很好理解了,它的意思是,小数点后的数字必须占2位。 如果这时候,$str 的值为9.234,则 $result的值将为9.23.
    为什么4 不见了呢? 因为在小数点后面,按照上面的规定,必须且仅能占2位。 可是 $str 的值中,小数点后面占了3位,所以,尾数4被去掉了,只剩下 23。
5、最后,以 f "转换字符" 结尾。

字符串合并和分割:
合并函数说明:implode(分隔符[可选], 数组)
$arr = array('Hello', 'World!');
$result = implode('', $arr);
print_r($result);//结果显示Hello World!
分割函数说明:explode(分隔符[可选], 字符串)
$str = 'apple,banana';
$result = explode(',', $str);
print_r($result);//结果显示array('apple','banana')

字符串转义:
函数说明:用于对特殊字符加上转义字符,返回一个字符串
$str = "what's your name?";
echo addslashes($str);//输出:what\'s your name?



四.面向对象特征

类、类属性、类方法
class Car {
    public $name='Car01';
    public function getName() {
        return '汽车';
    }
    public static function getType(){
        return 'Car';
    }
​}
$car = new Car();
echo $car->getName();
echo Car::getType();
说明:
使用关键字static修饰的,称之为静态方法,静态方法不需要实例化对象,可以通过类名直接调用,操作符为双冒号::。

构造器的使用:
class Car{
    public $name='Car01';
    public $color='Red';
    private $price='12800';
	//构造方法
	function __construct(){
	    echo 'new Car';
	}
    public function getName(){
	    return $this->name;
    }
	public static function getTypeName(){
	    return 'Car';
	}
}
$car=new Car();
$car01=$car->getName();
$carType=Car::getTypeName();
echo $car01,$carType;
打印结果:
new Car
Car01
Car
可以给构造方法添加参数:
function __construct($name,$color){
	    echo 'new Car';
	}
调用:
$car=new Car('Car02','Black');

析构函数:释放不用的对象
function __destruct(){
	    echo 'destory object';
	}
$car=NULL;时自动调用。

php单例模式:
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(); //通过静态方法来获得一个实例

static 关键字:
class Car {
    private static $speed = 10;
    
    public static function getSpeed() {
        return self::$speed;
    }
}
echo Car::getSpeed();  //调用静态方法

$func = 'getSpeed';
$className = 'Car';
echo $className::$func();  //动态调用静态方法

class BigCar extends Car {
    public static function start() {
        parent::speedUp();//调用父类的方法
    }
}

BigCar::start();
echo BigCar::getSpeed();

继承:
class Car {
    public $speed = 0; //汽车的起始速度是0
    function __construct(){
        echo 'parent_construct';
    }
    public function speedUp() {
        $this->speed += 10;
        return $this->speed;
    }
}
//定义继承于Car的Truck类
class Truck extends Car{
    public function speedUp(){
        $this->speed = parent::speedUp() + 50;
    }
    function __construct(){  
        parent::__construct();//调用父类的构造器
        echo 'child_construct____';
        
    }
}

$car = new Truck();
$car->speedUp();
echo $car->speed;

重载:
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();调用不存在的方法时调用
__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 {
}
$a = new Car();
$b = new Car();
if ($a == $b) echo '==';   //true 两个实例是否完全相同
if ($a === $b) echo '==='; //false 两个变量是否来自同一个引用

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);

序列化和反序列化:
class Car {
    public $name = 'car';
}
$a = new Car();
$str = serialize($a); //对象序列化成字符串
echo $str.'<br>';
$b = unserialize($str); //反序列化为对象
var_dump($b);

五.正则表达式

$p='/苹果/';//PCRE库函数preg_match用于执行一个正则匹配
$str = "我喜欢吃苹果";
if (preg_match($p, $str)) {
    echo '匹配成功';
}
PCRE库函数中,正则匹配模式使用分隔符与元字符组成,分隔符可以是非数字、非反斜线、非空格的任意字符。经常使用的分隔符是正斜线(/)、hash符号(#) 以及取反符号(~):
转义:
/http:\/\//
函数批量转义:
$p = 'http://';
$p = '/'.preg_quote($p, '/').'/';
echo $p;
/http\:\/\//

元字符:
正则表达式中具有特殊含义的字符称之为元字符,常用的元字符有:
\ 一般用于转义字符
^ 断言目标的开始位置(或在多行模式下是行首)
$ 断言目标的结束位置(或在多行模式下是行尾)
. 匹配除换行符外的任何字符(默认)
[ 开始字符类定义
] 结束字符类定义
| 开始一个可选分支
( 子组的开始标记
) 子组的结束标记
? 作为量词,表示 0 次或 1 次匹配。位于量词后面用于改变量词的贪婪特性。 (查阅量词)
* 量词,0 次或多次匹配
+ 量词,1 次或多次匹配
{ 自定义量词开始标记
} 自定义量词结束标记

例1:匹配邮箱
//下面的\w匹配字母或数字或下划线。
$p = '/[\w\.\-]+@[a-z0-9\-]+\.(com|cn)/';
$str = "我的邮箱是Spark.eric@imooc.com";
preg_match($p, $str, $match);
echo $match[0];
例2:匹配电话
$p = '/\w+\-\d+/';  // \d匹配数字
$str = "我的电话是010-12345678哈哈11-22";
preg_match($p, $str, $match);
echo $match[0];

贪婪模式(匹配字符+):在可匹配与可不匹配的时
候,优先匹配
$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

preg_match_all匹配所有:
<?php
$p = "/<tr><td>(.*?)<\/td>\s*<td>(.*?)<\/td>\s*<\/tr>/i";
$str = "<table> <tr><td>Eric</td><td>25</td></tr> <tr><td>John</td><td>26</td></tr> </table>";
preg_match_all($p, $str, $matches);
print_r($matches);

搜索和替换:
$string = 'April 15, 2014';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '$3, ${1} $2';
echo preg_replace($pattern, $replacement, $string); //结果为:2014, April 15

替换多余的空格:
$str = 'one     two';
$str = preg_replace('/\s+/', ' ', $str);
echo $str; // 结果改变为'one two'

六.Cookies

设置Cookie:
<?php
setcookie('test', time());
ob_start();
print_r($_COOKIE); 
$content = ob_get_contents();
$content = str_replace(" ", ' ', $content);
ob_clean();
header("content-type:text/html; charset=utf-8");
echo 'current Cookie =';
echo nl2br($content);

删除Cookie:
setcookie('test', '', time()-1); 

Cookie路径:
cookie中的路径用来控制设置的cookie在哪个路径下有效,默认为'/',在所有路径下都有,当设定了其他路径之后,则只在设定的路径以及子路径下有效,例如:setcookie('test', time(), 0, '/path');
上面的设置会使test在/path以及子路径/path/abc下都有效,但是在根目录下就读取不到test的cookie值。

Session:
<?php
//开始使用session
session_start();
//设置一个session
$_SESSION['test'] = time();
//显示当前的session_id
echo "session_id:".session_id();
echo "<br>";

//读取session值
echo $_SESSION['test'];

//销毁一个session
unset($_SESSION['test']);
echo "<br>";
var_dump($_SESSION);
打印结果:
session_id:s1uhfu4egnef47gc0jennpuhr2
1423131115
array
  empty

设置Session:
<?php
//在这里设置name的session值为jobs
session_start();
$_SESSION['name'] = 'jobs';
echo $_SESSION['name'];

删除Session:
删除当前:
session_start();
$_SESSION['name'] = 'jobs';
unset($_SESSION['name']);
echo $_SESSION['name']; //提示name不存在
删除所有:
session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
session_destroy();

值得注意的是,session_destroy并不会立即的销毁全局变量$_SESSION中的值,只有当下次再访问的时候,$_SESSION才为空,因此如果需要立即销毁$_SESSION,可以使用unset函数。
session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
unset($_SESSION);
session_destroy(); 
var_dump($_SESSION); //此时已为空


posted @ 2015-02-03 01:01  顾明伟  阅读(189)  评论(0编辑  收藏  举报