php进阶篇

1.php数组

//索引数组
$arr1=array('苹果''香蕉');
echo $arr1[0];                  //苹果

//关联数组
$arr2=array('2010'=>'苹果','2011'=>'香蕉');    
echo $arr2[2010];              //苹果

//索引数组的赋值
$arr3=array();
$arr3[2010]='桔子桑';


//关联数组的赋值
$arr3=array();
$arr3['2010']='桔子桑';

2.数组foreach遍历(主要是关联数组)

$stu = array("2010"=>"桔子桑""2011"=>"慕课",);

foreach($stu as $k => $v){
       echo $k.$v;   //遍历并打印出键、值。
};

foreach($stu as $k){
       echo $k;      //遍历打印出key值
};

3.php类

这里是一个类似于javaBean的phpBean

//定义类
class Car{
    //成员变量私有
    private $name;
    //getter、setter
    public function setName($str){
        $this->name=$str;
    }
    public function getName(){
        return $this->name;
    }
}

//实例化对象
$car = new Car();
//setter给成员变量赋值
$car->setName("Porsche 911");
//getter获得该成员变量的值
echo $car->getName();

除了写法不一样,其余的和java无异。

4.构造函数和析构函数

析构函数这种说法我依稀记得以前看ECMAScript的时候有提到,

class Car {
    //构造函数
    function __construct(){
        print "构造函数调用 
";
    }
    //析构函数、销毁函数
    function __destruct(){
        print "析构函数调用 
";
    }
}
$car = new Car();        //实例化对象的时候调用构造函数
unset($car);             //显式地销毁对象会调用析构函数,其实代码执行完会自动回收和销毁对象,因此可以不显式地销毁

注意:函数名前面是两个下划线,like this:_ _,当然写的时候是没有空格的,这里为了看清楚中间加了个空格

5.static方法

我们知道,静态方法只能操作静态变量,

class Car {
    private static $speed = 10;
    public static function speedUp(){
         self::$speed+=10;
    }
    public function getSpeed() {
        return self::$speed;
    }
}

$car = new Car();
Car::speedUp();         //调用静态方法加速
echo $car->getSpeed();  //调用共有方法输出当前的速度值

在方法里面访问静态变量就不能用之前提到的$this了,可以使用self::$speed(访问当前类的静态变量$speed)或者

parent::speedUp()(访问父类的静态方法speedUp())

总结一下:关于成员变量的访问$speed

静态成员变量:self::$speed(本类)、parent::$speed(父类)-----有$符号

非静态成员变量:$this->speed------------------------------------------------没有$符号

6.重载

php的重载简直就是TMD太奇特了,你感受一下

class Car{
    
}
$car = new Car();
$car->name = 'Porsche';
echo $car->name;

你能想象没有定义成员变量的类,它的实例化对象能任意声明一个成员变量并且赋值、输出?

这货居然真的能在浏览器输出Porsche!孤陋寡闻限制了我的想象力!!!

按照教程所说,是调用了魔术方法__set,__get,__isset,__unset对不存在属性的赋值、读取、判断属性是否设置、销毁属性。

方法的重载:

class Car {
    public $speed = 10;
    //在这里使用重载实现speedDown方法
    public function __call($name,$v){
        if($name=='speedDown'){
            $this->speed+=10;
        }  
    }
}
$car = new Car();
$car->speedDown(); //调用不存在的speedDown方法
echo $car->speed;

我们可以看到,在全局作用域调用了类的speedDown()方法,但是类原本是不存在这个方法的,此时就会将这个方法名称

传给__call($name,$v)的$name参数,从而实现方法体的调用。

7.魔术方法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->name);

很容易理解,但是要注意书写方式,值得一提的是clone时$b和$a是值传递,就是说虽然长得一样,但是占据了内存中两块不同的地址。

8.序列化和反序列化

$str = serialize($a);   //对象序列化成字符串
echo $str.'<br>';
$c = unserialize($str); //反序列化为对象
var_dump($c);

对象序列化的作用是方便数据的存储和传递,反序列化可以将字符串还原成对象,类似于md5的加密,只不过md5不可逆。

9.正则

$str = "abcdef";
$pattern = '/def/';
echo preg_match($pattern, $str, $matches);//匹配成功,返回1,否则返回0
echo $matches[0];                         //匹配结果为数组形式(虽然只有一项)

10.cookie

$name = 'test';
$value = 'value';
//cookie设置
setcookie($name,$value,time()+3600);//设置了一个名为test,值为value,过期时间为1h的cookie
//根基cookie名获得cookie值
echo $_COOKIE['test'].'<br>';
//打印出全部的cookie
print_r($_COOKIE);
//cookie删除
setcookie('test','',time()-1);

11.session

刚开始看的时候不太明白,session不是初次与网站建立连接的时候就有了么?怎么还要开启?是不是每个页面都要开启?那怎么保证

session的唯一性以及各个页面之间的信息传递(存在session中的),毕竟之前学的java,session直接在request中拿。

最后了解到:php中的session可以在网站主页脚本设置开启,然后往里面存数据,之后的页面都可以从里面拿数据,也可以删除、销毁session。

//开启session
session_start();
//显示当前的session_id
echo session_id();
echo "<br>";
//为当前session存入信息(键值对)
$_SESSION['test'] = time();
//读取session中键为test的信息值
echo $_SESSION['test'];
//销毁session中键为test的信息
unset($_SESSION['test']);
//删除session
unset($_SESSION);

值得注意的是,session_destroy并不会立即的销毁全局变量$_SESSION中的值,只有当下次再访问的时候,$_SESSION才为空,

因此如果需要立即销毁$_SESSION,可以使用unset函数。

12.用户信息的存储与读取

session_start();
//假设用户登录成功获得了以下用户数据
$userinfo = array(
    'uid'  => 10000,
    'name' => 'spark',
    'email' => 'spark@imooc.com',
    'sex'  => 'man',
    'age'  => '18'
);

/* 将用户信息保存到session中 */
$_SESSION['uid'] = $userinfo['uid'];
$_SESSION['name'] = $userinfo['name'];
$_SESSION['userinfo'] = $userinfo;

//* 将用户数据保存到cookie中的一个简单方法 */
$secureKey = 'imooc'; //加密密钥
$str = serialize($userinfo); //将用户信息序列化
//用户信息加密前
$str = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($secureKey), $str, MCRYPT_MODE_ECB));
//用户信息加密后
//将加密后的用户数据存储到cookie中
setcookie('userinfo', $str);

//当需要使用时进行解密
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($secureKey), base64_decode($str), MCRYPT_MODE_ECB);
$uinfo = unserialize($str);
echo "解密后的用户信息:<br>";
print_r($uinfo);

上面的例子就是分别将信息存到session、存到cookie。

其中存到cookie的时候进行了序列化、base64转码、以及md5加密处理;

解密的时候先解码、反序列化。

md5只是对服务端提供的秘钥进行加密,所以虽然不可逆,但是解码的时候也是用md5后的秘钥,所以不影响。

13.文件系统

file_get_contents

文本文件读取的时候会存在这样那样的编码问题,导致页面输出的时候乱码,于是在网上找了相关的解决办法,并封装:

function outContent($filePath){
    $text = file_get_contents($filePath);
    define('UTF32_BIG_ENDIAN_BOM', chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF));
    define('UTF32_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00));
    define('UTF16_BIG_ENDIAN_BOM', chr(0xFE) . chr(0xFF));
    define('UTF16_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE));
    define('UTF8_BOM', chr(0xEF) . chr(0xBB) . chr(0xBF));
    $first2 = substr($text, 0, 2);
    $first3 = substr($text, 0, 3);
    $first4 = substr($text, 0, 3);
    $encodType = "";
    if ($first3 == UTF8_BOM)
        $encodType = 'UTF-8 BOM';
    else 
        if ($first4 == UTF32_BIG_ENDIAN_BOM)
            $encodType = 'UTF-32BE';
        else 
            if ($first4 == UTF32_LITTLE_ENDIAN_BOM)
                $encodType = 'UTF-32LE';
            else 
                if ($first2 == UTF16_BIG_ENDIAN_BOM)
                    $encodType = 'UTF-16BE';
                else 
                    if ($first2 == UTF16_LITTLE_ENDIAN_BOM)
                        $encodType = 'UTF-16LE';
        
        // 下面的判断主要还是判断ANSI编码的·
    if ($encodType == '') { // 即默认创建的txt文本-ANSI编码的
        $content = iconv("GBK", "UTF-8", $text);
    } else 
        if ($encodType == 'UTF-8 BOM') { // 本来就是UTF-8不用转换
            $content = $text;
        } else { // 其他的格式都转化为UTF-8就可以了
            $content = iconv($encodType, "UTF-8", $text);
        }
    return $content;
}

对,你没有看错,就是这么一堆凌乱的位运算代码,但是,你现在只需调用这个方法就可以了,like this:

<?php
header("content-type:text/html; charset=utf-8");
include 'outConentt.php';
$filePath = 'D:/python_music/2.txt';
echo outContent($filePath);

我们引入了这个文件(这个函数),然后直接调用,就可以在浏览器输出 'D:/python_music/2.txt' 这个文本文件里面的字符串了。

值得注意的是header(~~~~~)定义的头部不可省略。

 c语言类似写法

$fp = fopen('./text.txt', 'rb');
while(!feof($fp)) {
    echo fgets($fp);               //读取一行
}
fclose($fp);



$fp = fopen('./text.txt', 'rb');
$contents = '';
while(!feof($fp)) {
    $contents .= fread($fp, 4096); //一次读取4096个字符
}
fclose($fp);
$filename = './test.txt';

//判断文件、文件目录是不是存在
file_exists($filename);

//判断是不是文件
is_file($filename);

//判断文件是否可写
is_writeable($filename);

//判断文件是否可读
is_readable($filename);

//获得文件的所有者
fileowner($filename);      

//获取文件的创建时间
filectime($filename);    

//获取文件的修改时间  
filemtime($filename);    

//获取文件的访问时间  
fileatime($filename);       

//删除文件
unlink($filename);

//删除文件夹
rmdir($dir);
//文件写入①
$filename = './test.txt';
$data = 'test';
file_put_contents($filename, $data);

//文件写入②
$fp = fopen('./test.txt', 'w');
fwrite($fp, 'hello');
fwrite($fp, 'world');
fclose($fp); 

14.数据库

①数据库连接

//mysql扩展连接
$link = mysql_connect('127.0.0.1', 'root', 'root');

//mysqli扩展连接
$link = mysqli_connect('127.0.0.1', 'root', 'root');

//PDO扩展连接
$dsn = 'mysql:dbname=eco;host=127.0.0.1';
$user = 'root';
$password = 'root';
$dbh = new PDO($dsn, $user, $password);

 ②相关设置

//选择数据库
mysql_select_db('eco');

//设置utf-8编码
mysql_query("set names 'utf8'");

③查询语句

刚看到这里的时候,感觉写法很奇特,毕竟从hibernate过来的,直接一条语句返回一个结果列表(Object[]),后来一想,也对

数据库查询,返回的本来就是一个二维数组,只不过hibernate返回的结果形式看上去更爽而已,下面看,数据库查询返回的数据样子

         
         
         
         

如你所见,查询得到4条记录,每条记录有5个字段值,这就是一个4行5列的二维数组,

$res = mysql_query('select * from hjmall_color');
$arr[] = array();
while($row = mysql_fetch_row($res)){
    $arr[] = $row;
};
var_dump($arr);

在这里,我们一行一行地读取查询到的结果,并将其存入一个数组$arr中,它会这样显示:

array(6) {
  [0]=>
  array(0) {
  }
  [1]=>
  array(5) {
    [0]=>
    string(1) "1"
    [1]=>
    string(28) "{"r":"51","g":"51","b":"51"}"
    [2]=>
    string(7) "#333333"
    [3]=>
    string(1) "0"
    [4]=>
    string(1) "0"
  }
  [2]=>
  array(5) {
    [0]=>
    string(1) "2"
    [1]=>
    string(29) "{"r":"255","g":"69","b":"68"}"
    [2]=>
    string(7) "#ff4544"
    [3]=>
    string(1) "0"
    [4]=>
    string(1) "0"
  }
  [3]=>
  array(5) {
    [0]=>
    string(1) "3"
    [1]=>
    string(31) "{"r":"255","g":"255","b":"255"}"
    [2]=>
    string(7) "#ffffff"
    [3]=>
    string(1) "0"
    [4]=>
    string(1) "0"
  }
  [4]=>
  array(5) {
    [0]=>
    string(1) "4"
    [1]=>
    string(30) "{"r":"239","g":"174","b":"57"}"
    [2]=>
    string(7) "#EFAE39"
    [3]=>
    string(1) "0"
    [4]=>
    string(1) "0"
  }
  [5]=>
  array(5) {
    [0]=>
    string(1) "6"
    [1]=>
    string(29) "{"r":"88","g":"228","b":"88"}"
    [2]=>
    string(7) "#58E458"
    [3]=>
    string(1) "0"
    [4]=>
    string(1) "0"
  }
}

相信不难看懂,我们也可以用$arr[1][2]获得第一条记录的第三个字段的值,在上面看来是 string(7) "#333333"

至于为什么会多出一个$arr[0],这得问它的创始人了。

④增、删、改

//增加记录
$sql = "insert into user(name, age, class) values('李四', 18, '高三一班')";
mysql_query($sql); 
//插入记录之后可以获得自增的id,可以由此来判断是否插入成功
$uid = mysql_insert_id();


//更新记录
$sql = "update user set name = '曹操' where id=2 limit 1";
if (mysql_query($sql)) {
    echo '更新成功';
}


//删除记录
$sql = "delete from user where id=2 limit 1";
if (mysql_query($sql)) {
    echo '删除成功';
}

⑤数据库关闭

mysql_close();

或者关闭指定的数据库连接:mysql_close($link);

⑥limit实现分页

limit的作用就是,获取结果集的指定条目

$sql = "select * from user limit 10, 10";

这上面就是返回筛选后记录的11到20条(从第九条开始,不包括9,后数10条记录),如此,假设一页10条数据,那么第三页的数据

就该这么查:$sql = "select * from user limit 20, 10";

第一页 0 10
第二页 10 10
第三页 20 10
第四页 30 10
第五页 40 10

你也可以根据自己业务需要,来推算limit后面的数值。

原文地址:https://www.cnblogs.com/eco-just/p/8663252.html