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后面的数值。