zoukankan      html  css  js  c++  java
  • 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后面的数值。

  • 相关阅读:
    PHP之ThinkPHP框架(界面)
    安卓网络访问(xUtils3)
    Python制作二维码和条形码扫描器 (pyzbar)
    redis 哨兵
    Django 源码阅读笔记(详细视图)
    Django 源码阅读笔记(基础视图)
    JavaScript基础
    Flask 基础
    redis 主从复制
    redis 数据删除策略和逐出算法
  • 原文地址:https://www.cnblogs.com/eco-just/p/8663252.html
Copyright © 2011-2022 走看看