php基础复习应用大合集
1.不知道有没有人很长不是不复习基础或者一些编程思想,会忘记,博主呢秉承着温故而知新的道理把基础从到位复习了一边,其中还包括一些算法指针,统计目录,字符串,数组的方法,mvc思想,匿名函数,引用等,代码可以直接复制到php网页进行测试复习,但是什么学习都需要自己去学习,只看不练是没用的,所以,自己还是要练练的。
接下来就贴上来代码
<?php
header("Content-type: text/html; charset=utf-8");
//数学函数
// $a = -5.2; //绝对值
// echo abs($a);
// $a = 9.999; //进一法取整
// echo ceil($a);
// $a = 9.999; //舍去法取整
// echo floor($a);
// $a = 9.999; //浮点数未知
// echo fmod($a, 0.111);
//echo pow(2, 3); //(值,次方的倍数)
// echo round(1.4); // 浮点数四舍五入
// echo sqrt(9); //被开方的数平方根
// echo max(1,2,3,4,5,6,7); //求多个数字或数组,返回其中最大值
// echo min(1,2,3,4,5,6,7); //输出最小的那个值
// echo mt_rand(0,9); // 输入:最小|最大,输出:随机数随机返回范围内的值
// echo rand(0000,9999);
// echo pi(); //获取圆周率
//字符串处理
//$a = "hello world"; //求字符串长度
//echo strlen($a);
// $a = "hello world"; //返回字符串指定的字符或文本位置
// echo strpos($a, "world");
// $html = "<a>点击会怀孕</a>"; //将html 转换为字符串。
// $zhuan = htmlspecialchars_decode($html);
// var_dump($zhuan);
// $pwd = "小不点你真可爱"; //md5加密
// echo md5($pwd);
// $pwd = "admin"; //sha1加密
// echo sha1($pwd);
// $str = "abcdefjhigklmn"; //随机打乱字符串
// echo str_shuffle($str);
// $arr = str_split($str); //将字符串分割成数组
// var_dump($arr);
// $str = "hello world"; //截取字符串-
// echo substr($str, 3,5);
// $str = " word "; //去除字符串两侧空白字符
// var_dump(trim($str));
// $a;
// var_dump($a);
// $str ="hello word";
// echo strpos("You love php, I love php too!","php"); //后面在前面字符串的位置;
// print_r(str_split("woainiqinaideguniang"));
//时间戳!!!!
// time(); //获取本机时间戳
// date_default_timezone_set("Asia/shanghai"); //设置时区
// $date = date("Y-m-d H:i:s",mktime(21,0,0,4,9,2016)); //从时间戳转换为日期
// echo $date."<br>"; //输出日期
//时间戳
// $time= time();
// var_dump($time);
// var_dump($date);
// $dates = strtotime($date); //将日期转换为时间戳
// echo $dates."<br>"; //输出时间戳
// $datetime = "2018-8-23 22:10:23"; //将字符串转换为时间戳
// $dates = strtotime($datetime);
// echo $dates."<br>";
// $times = strtotime("-7000 Day"); //减去多少天的时间
// $times = date("Y-m-d H:i:s",$times);
// echo $times."<br>";
// echo strtotime("last week");
//使用另一个字符串填充字符串到指定长度
// $input = "Alien" ;
// // echo str_pad ( $input , 10 ); // 输出 "Alien "
// echo str_pad ( $input , 10 , "-=" , STR_PAD_LEFT ); // 输出 "-=-=-Alien"
// // echo str_pad ( $input , 10 , "_" , STR_PAD_BOTH ); // 输出 "__Alien___"
// // echo str_pad ( $input , 6 , "___" ); // 输出 "Alien_"
// $str = "Is your name \Oreilly?" ;
// // 输出: 'Is $your name O\'reilly'?
// echo addslashes ( $str );
// parse_str("id=23&name=john%20adams");
// echo $id."<br>";
// echo $name;
//23
//john
// 把查询字符串解析到变量中
// $str="first=value&arr[]=foo+bar&arr[]=baz"; //定义字符串
// parse_str($str); //把字符串解析为变量
// echo $first; //输出$first的值value
// echo "<br>";
// echo $arr[0]; //输出$arr[0]的值foo bar
// echo "<br>";
// echo $arr[1]; //输出$arr[1]的值baz
// echo "<br>";
// parse_str($str,$output); //把字符串解析的变量存储在$output中
// echo $output['first']; //输出$first的值value
// echo "<br>";
// echo $output['arr'][0]; //输出$arr[0]的值foo bar
// echo "<br>";
// echo $output['arr'][1]; //输出$arr[1]的值baz
//变量!!!!!
// header("Content-type:text/html;charset=utf8");
// $userName = "高天";
// $userAge = 19;
// echo $userName.$userAge;
//PHP 数据类型
//标量数据类型:int(整数) bool(真假) str(字符串) float(真假)
//复合数据类型: array(数组) obj(对象)
//特殊数据类型 null (空)
//资源类型 filesource
//分支结构
// $a = 5 ;
// if ($a==1) {
// echo "我";
// }elseif ($a==3) {
// echo "come";
// }elseif ($a==5) {
// echo "true";
// }else{
// echo "只能是我咯";
// }
// $a=5;
// switch($a){
// case '4':
// echo "false";
// break;
// case '5':
// echo "true";
// break;
// default:
// echo "不知道a是对少";
// break;
// }
//超全局变量
// $_GET $_POST $_SERVER $_FILE $_COOKIE $_SESSION $GLOBALS
// 声明常量
//define("SITE_URL", "http://127.0.0.1");
//echo SITE_URL;
//一维数组
// $arr = array(1,2,3);
// $arr = array(0,1,0,3,"age"=>110,"name"=>"高天");
// $arr["sex"]="男";
// var_dump($arr);
// 求出数组相同值的函数
// $arr1=array("0"=>"17","1"=>"20","2"=>"36","3"=>"48");
// $arr2=array("0"=>"17","1"=>"36","3"=>"57");
// $arr3=array_intersect($arr1,$arr2);
// // var_dump(array_unique($arr3));
// print_r($arr3);
//二维数组
//函数
// $arr = array(0,1,2,3,4,5,6,7,8,9,10);
// $arr1;
// in_array(值,数组) 判断某值是否在数组中 if
// empty(..)判断某变量,数组等是否为空值 if
// isset()判断某变量,数组或其他是否定义 if
//unset()销毁变量,销毁数组,销毁数组中某值 在最外面
// if (isset($arr1)) {
// echo "true";
// }else{
// echo "false";
// }
//循环
//从1加到100;
// $a = 0;
// $i = 0;
// while ($i<=99) {
// $i++;
// $a += $i;
// echo "a=".$a."____________i=".$i."<br>";
// }
// $a=0;
// for($i=1;$i<=100;$i++){
// $a += $i;
// echo "$a"."<br>";
// }
//数组函数
//返回数组中所有的值
// $arr= array("name"=>"高天","age"=>"19","size"=>"00");
// print_r(array_values($arr));
//返回数组中所有的键
// $arr= array("name"=>"高天","age"=>"19","size"=>"00");
// print_r(array_keys($arr));
//交换数组中的键和值 (如果有重复前面的会被后面的覆盖)
// $arr= array("name"=>"高天","age"=>"19","size"=>"00");
// print_r(array_flip($arr));
//查看数组中是否存在,某个值
// $arr= array("name"=>"高天","age"=>"19","size"=>"00");
// print_r(in_array("高天", $arr));
//在数组里搜索给定的值,如果成功则返回相应的键名
// $arr= array("name"=>"高天","age"=>"19","size"=>"00");
// print_r(array_search("19", $arr));
//查看给的键名 是否存在于数组中
// $arr= array("name"=>"高天","age"=>"19","size"=>"00");
// print_r(array_key_exists("name", $arr));
//数组的指针
//返回数组中的当前(current)单元
//将数组中的内部指针向前(next)移动一位,
//将数组中的内部指针向倒回(prev)一位,
// $arr= array("name"=>"高天","age"=>"19","size"=>"00");
// $mode = current($arr);
// $mode = next($arr);
// $mode = prev($arr);
// $mode = end($arr); //将数组内的指针指向最后一个单元
// $mode = reset($arr); //将数组中的指针指向第一个元素
// $mode = key($arr); //返回数组中当前指向元素的键名
// var_dump($mode);
//数组的分段和填充
//返回数组中的一段
// $arr= array("a","b","c","d","e","f");
// print_r(array_slice($arr,0,1));
// //把数组中的一部分去掉,并用其他值代替
// $a1=array(0=>"Dog",1=>"Cat",2=>"Horse",3=>"Bird");
//z $a2=array(0=>"Tiger",1=>"Lion");
// array_splice($a1,0,2,$a2);
// print_r($a1);
//用值将数组填补到指定长度
// $input = array( 12 , 10 , 9 );
// $result = array_pad( $input , 10 , 'a' );
// print_r($result);
//将一个或多个单元压入数组的末尾(入栈)
// $stack = array( "orange" , "banana" );
// array_push ( $stack , "apple" , "raspberry" );
// print_r ( $stack );
//将数组最后一个单元弹出(出栈)
// $stack = array( "orange" , "banana" , "apple" , "raspberry" );
// $fruit = array_pop ( $stack );
// print_r ( $stack );
//将数组开头的单元移出数组
// $stack = array( "orange" , "banana" , "apple" , "raspberry" );
// $fruit = array_shift ( $stack );
// print_r ( $stack );
//在数组开头插入一个或多个单元
// $queue = array( "orange" , "banana" );
// array_unshift ( $queue , "apple" , "raspberry" );
// print_r ( $queue );
//数组排序
//本函数对数组进行排序。当本函数结束时数组单元将被从最低到最高重新安排。 不保持索引关系
// $fruits = array( "lemon" , "orange" , "banana" , "apple" );
// sort ( $fruits );s
// print_r($fruits);
//从数组中随机取出一个或多个单元
// $input = array( "Neo" , "Morpheus" , "Trinity" , "Cypher" , "Tank" );
// $rand_keys = array_rand ( $input , 2 );
// var_dump($rand_keys);
// foreach ($input as $rand_keys) {
// $arr[]=$rand_keys;
// echo $arr;
// }
//求数组的和,还有平均值
// $arr = array(12,45,56,24,48);
// $total = $arr[0]+$arr[1]+$arr[2]+$arr[3]+$arr[4];
// $total = array_sum($arr);
// $number=count($arr);
// var_dump($total/$number);
// $sum = 0 ;
// for ($i=0; $i<count($arr);$i++) {
// $sum += $arr[$i];
// }
// $sums=$sum/count($arr);
// var_dump($sums);
// $sum = 0 ;
// foreach ($arr as $v) {
// $sum +=$v;
// }
// $sums = $sum/count($arr);
// var_dump($sums);
//数组,多维数组
// $arr = array(1,2,3,4,5,6,7,8,9,10);
// $arr1 = array("高"=>"天","age"=>19,18,"20"=>21,22);
// var_dump($arr1);
// $arr2 = array(12,10,array(12,456,array(12,45,56)));
// echo $arr2[2][2][1];
//强制类型转换
// $a = 100;
// $a = 0;
// $a = 10.98;
// $a = NULL;
// $result = (int)$a;
// var_dump($result);
//break语句 跳出几层循环
//数组的运用题
//第一题
// $arr3 = array(101,13,1,190,526,133,18,6,3,85);
// function ArrayMax($arr3){
// $max = $arr3[0];
// for ($i=0; $i < count($arr3)-1; $i++) {
// if ( $max < $arr3[$i+1]) {
// $max = $arr3[$i+1];
// }
// }
// return $max;
// }
// function ArrayMin($arr3){
// $min= $arr3[0];
// for ($i=0; $i < count($arr3) -1 ; $i++) {
// if ($min > $arr3[$i+1]) {
// $min = $arr3[$i+1];
// }
// }
// return $min;
// }
// echo "第一题最大为".ArrayMax($arr3);
// echo "<br>";
// echo "第一题最小为".ArrayMin($arr3);
// echo "<br>";
// //第二题
// $arr = array(10,11,1,90,56,33,18,6,123,85,13);
// function ArrayOneMax($arr){
// $max = $arr[0];
// for ($i=0; $i < count($arr)-1; $i++) {
// if ( $max < $arr[$i+1]) {
// $max = $arr[$i+1];
// }
// }
// return $max;
// }
// function ArrayTwoMax($arr){
// $ArrayTwoMax = $arr[0];
// for ($i=0; $i < count($arr)-1 ; $i++) {
// if ($ArrayTwoMax < $arr[$i+1]) {
// if ($arr[$i+1] != ArrayOneMax($arr)) {
// $ArrayTwoMax=$arr[$i+1];
// }
// }
// }
// return $ArrayTwoMax;
// }
// echo "第二题第二大为".ArrayTwoMax($arr);
// echo "<br>";
// //第三题
// $arr6 = array(array(10,20,30,80),array(60,20,40,50),array(30,70,30,20));
// function avg($arr6){
// $num = 0 ;
// $number = 0 ;
// for ($i=0; $i < count($arr6) ; $i++) {
// for ($j=0; $j < count($arr6[$i]) ; $j++) {
// $number++;
// $num+=$arr6[$i][$j];
// }
// }
// return $num/$number;
// }
// echo "第三题平均值为".avg($arr6);
// echo "<br>";
// //第四题
// $arr7 = array(50,60,70,array(10,20,30,80),50,array(60,20,40,50),80,60,10,array(30,70,30,20));
// function avgTwo($arr7){
// $num = 0 ;
// $number = 0 ;
// for ($i=0; $i < count($arr7) ; $i++) {
// if (!is_array($arr7[$i])) {
// $num+=$arr7[$i];
// }
// for ($j=0; $j <count($arr7[$i]) ; $j++) {
// $number++;
// $num+=$arr7[$i][$j];
// }
// }
// return $num/$number;
// }
// echo "第四题平均值为".avgTwo($arr7);
// echo "<br>";
// // each list
// $arr = array("name"=>1,"age"=>19);
// $keystr = "";
// $valstr= "";
// while (list($key,$val)=each($arr)) {
// $keystr.=$key;
// $valstr.=$val;
// }
// echo $keystr,$valstr;
//GD库 制作验证码(1)
// header("Content-type:image/png"); //创建一个GD画布
// $image = imagecreatetruecolor(100, 50); //创建一个真彩画布
// $gray = imagecolorallocate($image, 200, 200, 200); //创建一个颜色
// imagefill($image, 0, 0, $gray); //给画布添加颜色
// $arr1 = range("0","9");
// $arr2 = range("a","z");
// $bigarr = array_merge($arr1,$arr2);
// $randStrArr = array_rand($bigarr,4);
// $string = "";
// foreach ($randStrArr as $v) {
// $string.=$bigarr[$v];
// };
// $font=5;
// $imageWidth = imagesx($image); //获取图像的宽
// $imageHeight = imagesy($image); //获取图像的高
// $fontWidth = imagefontwidth($font)*strlen($string);
// $fontHeight = imagefontheight($font);
// $x =($imageWidth-$fontWidth)/2;
// $y =($imageHeight-$fontHeight)/2;
// for ($i=0; $i < 10 ; $i++) {
// $linecolor = imagecolorallocate($image, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
// $imageline = imageline($image, mt_rand(0,100), mt_rand(0,100), mt_rand(0,100), mt_rand(0,100), $linecolor);
// }
// $blue = imagecolorallocate($image, 0, 0, 255);
// imagestring($image,$font,$x,$y,$string,$blue);
// imagepng($image); //输出画布
// imagedestroy($image); //销毁画布
//GD库制作验证码(2)
// $str = "0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"; //创建一个字符串
// $strr = null; //设置一个空的变量
// for ($i=0; $i < 4; $i++) { // 循环 字符串任意一个,循环出四个
// $strr .= $str{rand(0,strlen($str)-1)};
// }
// header("content-type:image/png");
// $width = 100; //设置 宽100;
// $height = 50; //设置 高50;
// $img = imagecreatetruecolor($width,$height); //创建一个真彩画布
// $color = imagecolorallocate($img,200,220,220); //创建一个颜色
// imagefill($img,0,0,$color); //填充画布
// for ($a=1; $a < 100; $a++) { // 循环出100个点
// imagesetpixel($img, rand(0,$width), rand(0,$height), imagecolorallocate($img,rand(150,255),rand(150,255),rand(150,255)));
// }
// for ($a=1; $a < 11; $a++) { //循环出11条干扰先
// imageline($img, rand(0,$width), rand(0,$height), rand(0,$width), rand(0,$height),imagecolorallocate($img,rand(150,255),rand(150,255),rand(150,255)));
// }
// for ($f=0; $f < 4; $f++) { //每一个字符的位置和颜色
// $s = $strr{$f}; //imagechar 将字符串画在image的指定图像中。
// imagechar($img, 15, rand($f*22,20*($f+1)), rand(10,30), $s, imagecolorallocate($img,rand(0,100),rand(0,100),rand(0,100)));
// }
// ob_clean(); //去除缓存
// imagepng($img); //输出图像
// imagedestroy($img); //销毁图像
// $k=0;
// function fbnqs($n){ //传入数列中数字的个数 //非递归写法
// global $k;
// if($n <= 0){
// return 0;
// }
// if($n==1||$n==2){
// return 1;
// }
// $array[1] = $array[2] = 1; //设第一个值和第二个值为1
// for($i=3;$i<=$n;$i++){ //从第三个值开始
// $array[$i] = $array[$i-1] + $array[$i-2];
// //后面的值都是当前值的前一个值加上前两个值的和
// $k++;
// }
// return $array;
// }
// // $num = fbnqs(8);
// // print_r($num);
// $s=0;
// function fbnq($n){ //递归写法 方法自己调用自己
// global $s;
// $s++;
// if($n<=0) return 0;
// if($n==1||$n==2) return 1;
// return fbnq($n-1)+fbnq($n-2);
// }
// $num = fbnq(10);
// $nums = fbnqs(100);
// echo "递归执行 ".$s." 次<br>";
// echo "普通非递归执行 ".$k." 次";
//函数定义
/*
*PHP函数和类都具有全局作用域
*不支持函数重载
*任何有效的代码都可能出现 在函数内部
*/
// hanshu1();
// function hanshu1(){
// echo "hanshu1";
// function hanshu2(){
// echo "hanshu2";
// }
// }
// hanshu2();
//函数参数(引用传参)
//不适用引用传参,如果形参的值改变,不会影响实参,
//使用引用传参,如果形参值改变,实参的值也会改变
//参数默认值必须是常量表达式
// function honggang(&$girl1,$girl2,$girl3,$girl4="高天天"){
// $girl1 = "天天棒";
// echo $girl1."<br/>";
// echo $girl2."<br/>";
// echo $girl3."<br/>";
// echo $girl4."<br/>";
// }
// $c1 ="天天";
// $c2 = "酷天天";
// $c3 = "天天天";
// honggang($c1,$c2,$c3);
// echo $c1;
//函数返回值 return + 数组参数传递
// function honggang($girl1,$girl2="高天天"){
// foreach ($girl1 as $key => $value) {
// echo $value."<br/>";
// }
// echo $girl2;
// return $girl1;
// }
// $js = ["python","c#","java"];
// $res = honggang($js);
// print_r($res);
// $arr = [0=>"love",1=>"is","no","love"];
// list($baby,$shi,$bu,$ai) = $arr;
// echo $bu;
//引用变量
// $a = "啊啊啊啊";
// $b = &$a;
// echo $b;
//引用函数
// function & returns_reference(){
// $someref = "宁宁mua";
// return $someref;
// }
// $newref = & returns_reference();
/*
* 正则表达式(文本处理) 参考 https://www.cnblogs.com/vania/p/4422083.html
* 用途:
* 1.服务器网站配置路由重写
* 2.匹配邮箱格式
* 3.匹配电话号码格式
* 打印字符
* 1.打印字符(a-z A-Z 0-9 !@#¥%……&*()+*-)和非打印字符
* 2. \ 反斜杠是转义字符
2.1.正则表达式,就是一个匹配的“模式”
2.2正则表达式本身,就是一个字符串(中有一些语法规则,特殊字符)
* 一.可以将有意义
* 的字符转成没有意义的原子字符(将有意义的变成原子)
* 二.可以将没有意义的字符转成有意义的原子
* 三.a-z A-Z 0-9 _ 所有没有意义的字符,加上转义字符也没有意义,\@可加可不加
* 教学视频:https://www.bilibili.com/video/av3571918?spm_id_from=333.338.__bofqi.12
*
*
*
*/
// $str = "this383333388333312222s settext";
// $reg = "/\bset\B/";
// if (preg_match($reg, $str,$matches )) {
// echo "正则表达式<b>{$reg}</b> 和字符串 <b>{$str}</b>匹配成功";
// }else{
// echo "匹配失败";
// }
// print_r($matches);
//PHP文件系统
//判断文件类型
// echo "文件类型".filetype("0816.php");
// echo "文件类型".filetype("../project");
//is_dir()判断是不是一个目录
// if (is_dir("../project")) {
// echo "它是一个目录";
// }else{
// echo "不是目录<br/>";
// }
//is_executable(艾克斯q它bo) --判断是否可执行,返回类型:如果文件存在且可是执行返回true,否则返回false
// if (is_executable("路径")) { //得是exe文件才能判断是否可执行
// echo "文件可执行";
// }else{
// echo "不能执行";
// }
//is_file 判断是否是一个文件
// if (is_file("文件名")) {
// echo "它是一个文件";
// }
//is_readable() 判断给的文件名是否可读 如果文件存在,且可读返回true
// if (is_readable("0816.php")) {
// echo "文件可读";
// }
//is_writable() 判断给的文件是否可写
// if (is_writable("0816.php")) {
// echo "文件可写";
// }
//file_exists
// if (file_exists("0816.php")) {
// echo "文件|目录存在<br/>";
// }
//获取文件大小
// echo "文件大小为:".filesize("0816.php")."<br>";
// //文件创建时间 (简便记忆:create modify access)
// echo "文件创建时间:".date("Y-m-d H-i-s",filectime("0816.php"))."<br/>";
// //修改navicat.lnk
// echo "文件修改时间:".date("Y-m-d H-i-s",filemtime("0816.php"))."<br/>";
// //访问
// echo "文件访问时间:".date("Y-m-d H-i-s",fileatime("0816.php"))."<br/>";
//stat 获取文件大部分属性 atime mtime ctime size..
// $stat = stat("0816.php");
// print_r($stat);
// echo "<br/>";
//几的几次方
// echo pow(2, 20);
// rewinddir() //返回文件木有
//opendir() 打开目录句柄
//closedir() 关闭目录句柄
//遍历目录
// echo "<br/>";
// $res = opendir("../project");
// echo "<br/>";
// $a=0;
// while ($file = readdir($res)) {
// $a++;
// echo $file."<br/>";
// echo $a;
// }
//文件系统(判断是文件还是目录)
// $dir=opendir("phpmyadmin4.1.14");
// while($filename=readdir($dir))
// {
// if($filename!="."&&$filename!="..")
// {
// $filename="./phpmyadmin4.1.14/".$filename;//一定记得文件夹的名字得加上原来的啊
// if(is_dir($filename))
// echo "目录:".$filename."<br>";
// else
// echo "文件:".$filename."<br>";
// }
// }
// rewinddir($dir);//返回
// echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@<br>";
// while($filename = readdir($dir)) {
// //不要操作.和..
// if($filename!="." && $filename!="..") {
// //一定要注意路径, 找对才可以
// $filename = "./phpmyadmin/".$filename;
// if(is_dir($filename)) {
// echo "目录:".$filename."<br>";
// } else {
// echo "文件:".$filename."<br>";
// }
// }
// }
// //关闭这个资源
// closedir($dir);
//文件系统(统计目录的个数)
#统计目录的个数
// $dirn=0;
// $filen=0;
// function getdirnum($file)
// {
// global $dirn;
// global $filen;
// if(is_dir($file))
// {
// $dir=opendir($file); //把打开目录后的文件名给 $dird
// echo "打开句柄:".$file."<br/>d";
// while($filename=readdir($dir)) //把读取到的一个目录名称给到文件名的变量里
// {
// if($filename!='.'&&$filename!='..') //去除..
// {
// $filename=$file."/".$filename;
// if(is_dir($filename))
// {
// echo "文件夹:".$filename."<br/>";
// $dirn++;
// getdirnum($filename);
// }
// else{
// $filen++;
// echo "文件:".$filename."<br/>";
// }
// }
// }
// echo "关闭句柄:".$dir."<br/>";
// closedir($dir);
// echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@";
// }else{
// echo "return!";
// return 1;
// }
// }
// getdirnum("./2018-09-29");
// echo $dirn;
// echo "<br/>";
// echo $filen;
//递归
#4 递归函数
// function recursion ( $a )
// {
// if ( $a < 20 ) {
// echo " $a \n" ;
// recursion ( $a + 1 );
// }
// }
// 递归函数实现功能
// function fileall($fname){
// $sum = 0;
// if(is_dir($fname)){
// $dir = opendir($fname);
// while($name = readdir($dir)){
// if($name != "." && $name != ".."){
// $wzpath = $fname."/".$name;//将文件拼接成完整的路径
// if(is_file($wzpath)){
// //如果是文件+1
// $sum++;
// }else{
// //如果是文件夹调用本身函数查找所有文件
// $sum += fileall($wzpath);
// }
// }
// }
// closedir($dir);
// return $sum;
// }else{
// return 1;
// }
// }
// 面向对象OOP
// 1.概念
// 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;
// 面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
// #人生
// 面向过程
// 某同学的人生规划
// 姓名: XX
// 性别:
// 特征:爱说话,爱睡觉
// 学校学习
// 找一个稳定的工作
// 有一份稳定的事业
// 搞一个女朋友
// 结婚
// 生孩子
// 找工作
// 离婚
// 搞一个白富美
// 二婚
// 走向人生巅峰~!
// 面向过程
// 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
// 缺点:没有面向对象易维护、易复用、易扩展
// 面向对象
// 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统(重用性,灵活性,扩展性),使系统 更加灵活、更加易于维护
// 缺点:性能比面向过程低
// 面向对象三大特征:封装,继承,多态
// 类和对象关系
// 什么是类 组成:成员属性(变量) 成员方法(自定义函数)
// 什么是对象 客观事物一个实体
// class rensheng{
// public $name;
// public $like;
// public function start($_name,$_like){
// //$this->$name = $_name;
// //$this->$like = $_like;
// echo "我叫 ".$this->$name;
// echo "我喜欢".$this->$like;
// echo "我希望我的一生是这样度过:";
// }
// public function gongzuo($type){
// swith
// }
// public funciton hun($type){
// swith
// }
// public function shengzi($type){
// }
// public funciton pengyou($type){
// }
// public function dianfeng(){
// }
// }
// 对象引用:$this 类里边:调用自己属性和方法
// 对象调用结构:
// 对象->成员
// 属性的作用域
// 1.类外的变量不能作用到类内
// 2.类中的属性可以作用到类方法中
// 3.类中变量不能作用到类方法中
// 4.类中方法中变量可以给属性赋值
// 构造和析构
// 析构(进栈出栈)
// 栈 堆
// $c=3; 3
// $b=2; 2
// $a=1; 1
// 先进后出 3 2 1
// 对象链
// .dog{
// with:256px;
// height:256px;
// background:#ccc;
// border-radius:128px;
// overflow:hidden;
// cursor:point;
// }
// <div class="dog">
// <img src="dog.png">
// </div>
// $('.dog').click(function(){
// var s = 0;
// var v = 10;
// setInterval(funciton(){
// s +=v;
// document.title=s;
// $('.dog').find('img').parent().css('background','#aff').css('transform','rotate('+s+'deg)');
// },1000);
// });
// jq对象链
// $('.dog').find('img').parent().css('background','#aff').css('transform','rotate('+s+'deg)');
// php对象链
// $dog->find()->css()->css();
// 2.继承,封装
// 类继承的特性
// parent::__construct($a,$b);
// 子类可以访问父类的成员,继承关键字extends,提高代码的重用性, 子类覆盖父类同名方法
// 1>重用性
// 2>扩展性
// 3>灵活性
// 类封装的特性(更加灵活)
// public 公开
// 类外可以访问,子类可以访问,本类可以访问
// protected 受保护的
// 类外不能访问,子类可以访问,本类可以访问
// private 私有的
// 类外不能访问,子类不能访问,本类可以访问
// 类封装级别:
// 子类的修饰词权限要小于等于父类同名方法前的修饰词
// 保守 private < protected < public 开放
// 静态关键字~!!~~!!
// 4.实力:分页类 thinkphp 分页 扒过来明天(!)
// 5.实力:数据操作类
// 链接数据库
// 增删改查
// 6.抽象类
// 含有抽象方法的类就是抽象类,抽象类中必须要有抽象方法,但可以有非抽象方法
// abstract class lei{}
// 抽象方法:
// 定义未被实现的方法的方法叫做抽象发放
// abstract public function start();
// 7.接口
// 只含有抽象方法的类,类中的所有方法都没有被实现;
// 一旦被定义为接口,体内不能有普通方法
// interface class lei{
// public function action1();
// public function action2();
// }
// 接口需要实现不是继承(一个都没实现,需要实现)
// class lei2 implements lei1{
// 接口定义的方法必须全部实现(lei1)
// }
// 一个类实现多个接口
// class lei3 implements lei1,lei2{
// 接口定义的方法必须全部实现(lei1和lei2)
// }
// 接口继承
// interface jk1{
// }
// interface jk2{
// }
// interface jk3 extends jk1,jk2{
// }
// class lei implements jk3{
// }
// 8.多态
// 区分不同的种类就是多态
// interface jk1{
// public funciton gongneng1();
// public funciton gongneng2();
// public funciton gongneng3();
// }
// class lei implements jk1{
// 实现功能123
// }
// abstract class lei2 implements jk1{
// 实现一部分
// 实现功能1
// }
// class lei3 extends lei2{
// 实现功能2和3
// }
// class daoban{
// 实现功能123
// }
// function useUsb(Usb $o){
// $o->load();
// $o->start();
// $o->unload();
// echo "<hr>";
// }
// static关键字
// 上节课复习————————————————
// 概念
// $this = new 对象
// 构造和析构
// __construct 创建对象时调用
// __destruct 对象使用后一次结束后
// 对象链
// class duixianglian{
// public function a(){
// return $this;
// }
// public function b(){
// }
// }
// $obj = new duixianglian();
// $obj->a()->b();
// 析构(进栈出栈)
// 栈 堆
// $c=3; 3
// $b=2; 2
// $a=1; 1
// 先进后出 3 2 1
// 继承
// class duixiangb extends duixianglian{
// public function b(){
// }
// }
// $obj2 = new duixiangb();
// $ojb2->b();
// 封装
// public 公有的
// 类外:可以 类内:可以 子类:可以
// protected 保护的
// 类外:不可以 类内:可以 子类:可以
// private 私有的
// 类外:不可以 类内:可以 子类:不可以
// 保守 private < protected < public 开放
// 静态关键字
// 抽象类:
// 含有抽象方法的类叫做抽象类
// 接口:
// 类里所有的方法都是抽象方法的类
//spl_autoload_register(); 的参数可以是匿名函数,自定义函数名,静态方法
//类不存在,自动调用魔术方法,类的自动调用 __autoload
// function __autoload($class_name){
// echo "没有类可调用,魔术方法autoload被调用. $class_name .";
// $classfile = $class_name.".class.php";
// require_once($classfile);
// }
// $new = new School();
// $new->p();
//自定义函数名
// spl_autoload_register("my_autoload");
// function my_autoload($class_name){
// echo "string";
// $classfile=$class_name.".class.php";
// require_once($classfile);
// }
// $new = new School();
// $new->p();
//匿名函数 类的自动加载
// spl_autoload_register(function($classname){
// echo "未找到类文件";
// $classfile = $classname.".class.php";
// require_once($classfile);
// });
// $new = new School();
// $new->p();
//静态方法
// class load{
// public static function loadapp($classname){
// echo "找不到类文件,自动调用类的自动加载文件";
// $classfile = $classname.".class.php";
// require_once($classfile);
// }
// }
// spl_autoload_register("load::loadapp");
// $new = new School();
// $new->p();
// 魔术方法
// __construct(),类的构造函数!
// __destruct(),类的析构函数!
// __call(),在对象中调用一个不可访问方法时调用1
// __callStatic(),用静态方式中调用一个不可访问方法时调用1
// __get(),获得一个类的成员变量时调用
// __set(),设置一个私有的类的成员变量时调用
// __isset(),当对不可访问属性调用isset()或empty()时调用
// __unset(),当对不可访问属性调用unset()时被调用。
// __sleep(),执行serialize()时,先会调用这个函数
// __wakeup(),执行unserialize()时,先会调用这个函数
// __clone(),当对象复制完成时调用 对象复制vs对象引用
//魔术方法
// __call(),在对象中调用一个不可访问方法时调用1
// 在对象中调用一个不可访问方法时,__call() 会被调用。
// 为了避免当调用的方法不存在时产生错误,而意外的导致程序中止,可以使用 __call() 方法来避免。
// 该方法在调用的方法不存在时会自动调用,程序仍会继续执行下去。
// __callStatic(),用静态方式中调用一个不可访问方法时调用
// class per{
// public $name;
// public function start(){
// echo "start";
// }
// /**
// * 在对象中调用一个不可访问方法时,__call() 会被调用。
// * @param string $name 调用的方法名称
// * @param array $params 方法传入的参数
// */
// public function __call($name,$params=""){
// echo $name."方法不可访问";
// print_r($params);
// }
// public static function __callStatic($name,$params=""){
// echo "静态方法:".$name."不存在";
// }
// }
// // $p = new per();
// // $p->per(array('232'));
// per::jingtai(array('jingtai'));
// 读取不可访问属性的值时,__get() 会被调用。
// 在 php 面向对象编程中,类的成员属性被设定为 private 后,如果我们试图在外面调用它则会出现“不能访问某个私有属性”的错误。那么为了解决这个问题,我们可以使用魔术方法 __get()。
// class per{
// public $name;
// private $age;
// /**
// * __get在调用一个私有的或者不存在的属性时调用
// * @param string $name 调用的方法名称
// * @param array $params 方法传入的参数
// */
// public function __get($name){
// echo "属性:".$name."不存在或没有权限, __get 魔术方法被调用";
// }
// *
// * __set给一个私有的属性赋值时调用
// * @param string $name 属性名
// * @param string $params 属性赋值的参数
// public function __set($name,$param){
// echo "__set:".$param."#".$name;
// $this->age = $param;
// }
// public function echoVal(){
// echo $this->age;
// }
// }
// $p = new per();
// // echo $p->age;
// // //给一个对象复制
// $p->name = "王境";
// echo $p->name;
// //给私有属性赋值
// $p->age = 20;
// $p->echoVal();
// __isset()
// 当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
// 分两种情况,如果对象里面成员是公有的,我们就可以使用这个函数来测定成员属性,如果是私有的成员属性,这个函数就不起作用了,原因就是因为私有的被封装了,在外部不可见。那么我们就不可以在对象的外部使用isset()函数来测定私有成员属性是否被设定了呢?当然是可以的,但不是一成不变。你只要在类里面加上一个__isset()方法就可以了,当在类外部使用isset()函数来测定对象里面的私有成员是否被设定时,就会自动调用类里面的__isset()方法了帮我们完成这样的操作。
// __isset()的作用:当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
// echo isset($person->sex),"<br>";
// class per{
// private $name;
// public $age;
// private $sex;
// *
// * 当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用
// * @param string $name 调用的属性名称
// public function __isset($name){
// echo "__isset";
// }
// }
// $p = new per();
// echo isset($p->age);
// echo isset($p->name);
// echo empty($p->age);
// echo empty($p->sex);
#############################################
// __unset()
// 当对不可访问属性调用 unset() 时,__unset() 会被调用。
// 这里自然也是分两种情况:
// 1、 如果一个对象里面的成员属性是公有的,就可以使用这个函数在对象外面删除对象的公有属性。
// 2、 如果对象的成员属性是私有的,我使用这个函数就没有权限去删除。
// 虽然有以上两种情况,但我想说的是同样如果你在一个对象里面加上__unset()这个方法,就可以在对象的外部去删除对象的私有成员属性了。在对象里面加上了__unset()这个方法之后,在对象外部使用“unset()”函数删除对象内部的私有成员属性时,对象会自动调用__unset()函数来帮我们删除对象内部的私有成员属性。
// class per{
// private $name;
// private $age;
// public $sex = "人妖";
// public function __unset($name){
// echo "属性:".$name."是私有的不能被卸载";
// //类内卸载自己的属性
// unset($this->name);
// }
// public function echoVal(){
// echo $this->name;
// }
// }
// $p = new per();
// // echo $p->sex;
// // unset($p->sex);
// // echo $p->sex; //属性sex已被删除: Undefined property: per::$sex
// unset($p->name); //unset私有name属性时调用 __unset 魔术方法
// $p->echoVal(); // Undefined property: per::$name
// // serialize
// //做序列化
// //mysql 字段里边不可以存入数组
// $arr = [
// '如来佛组',
// '吴彦组',
// '光宗耀组',
// '天马行空组',
// '超越1组',
// '超越2组',
// '龙骑士组'
// ];
// serialize() 返回字符串,此字符串包含了表示 value 的字节流,可以存储于任何地方。
// 序列化 把变量和他们的值编码成文本形式
//反序列化 恢复原先变量
// serialize unserialize
// $str = serialize($arr);
// var_dump($str);
// // //反序列化unserialize
// $arr_ser = unserialize($str);
// print_r($arr_ser);
// 如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误
// 不能返回父类的私有成员的名字。这样做会产生一个 E_NOTICE 级别的错误
// class per{
// private $name,$sex,$age;
// public function __construct($_name,$_sex,$_age){
// $this->name = $_name;
// $this->sex = $_sex;
// $this->age = $_age;
// }
// public function __sleep(){
// return array();
// }
// public function __wakeup(){
// echo "__wakeup被调用";
// }
// }
// $p = new per('李磊','女',18);
// //序列化对象的时候回调用类里的 __sleep 清理对象
// var_dump(serialize($p));
// //序列化后的对象 被反序列化 调用 __wakeup 重新连接数据库
// unserialize(serialize($p));
// echo $p->sex;
// echo $p->age;
// __toString(),类被当成字符串时的回应方法
// __invoke(),调用函数的方式调用一个对象时的回应方法
// __autoload(),尝试加载未定义的类
// __debugInfo(),打印所需调试信息
// __set_state(),调用var_export()导出类时,此静态方法会被调用。
// 常用的包括 __set() __get() __autoload() 等应该熟悉,其他的了解也没有关系
// __call()
// 在对象中调用一个不可访问方法时,__call() 会被调用。
// 为了避免当调用的方法不存在时产生错误,而意外的导致程序中止,可以使用 __call() 方法来避免。
// 该方法在调用的方法不存在时会自动调用,程序仍会继续执行下去。
// __callStatic()
// 用静态方式中调用一个不可访问方法时,__callStatic() 会被调用。
// __set()
// 在给不可访问属性赋值时,__set() 会被调用。
// __set( $property, $value )` 方法用来设置私有属性, 给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的 属性名和值。
// $Person->name = "小红"; //赋值成功。如果没有__set(),则出错。
// __get()
// 读取不可访问属性的值时,__get() 会被调用。
// 在 php 面向对象编程中,类的成员属性被设定为 private 后,如果我们试图在外面调用它则会出现“不能访问某个私有属性”的错误。那么为了解决这个问题,我们可以使用魔术方法 __get()。
// /**
// * 在类中添加__get()方法,在直接获取属性值时自动调用一次,以属性名作为参数传入并处理
// * @param $propertyName
// *
// * @return int
// */
// public function __get($propertyName)
// __isset()
// 当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
// 分两种情况,如果对象里面成员是公有的,我们就可以使用这个函数来测定成员属性,如果是私有的成员属性,这个函数就不起作用了,原因就是因为私有的被封装了,在外部不可见。那么我们就不可以在对象的外部使用isset()函数来测定私有成员属性是否被设定了呢?当然是可以的,但不是一成不变。你只要在类里面加上一个__isset()方法就可以了,当在类外部使用isset()函数来测定对象里面的私有成员是否被设定时,就会自动调用类里面的__isset()方法了帮我们完成这样的操作。
// __isset()的作用:当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
// echo isset($person->sex),"<br>";
// __unset()
// 当对不可访问属性调用 unset() 时,__unset() 会被调用。
// 这里自然也是分两种情况:
// 1、 如果一个对象里面的成员属性是公有的,就可以使用这个函数在对象外面删除对象的公有属性。
// 2、 如果对象的成员属性是私有的,我使用这个函数就没有权限去删除。
// 虽然有以上两种情况,但我想说的是同样如果你在一个对象里面加上__unset()这个方法,就可以在对象的外部去删除对象的私有成员属性了。在对象里面加上了__unset()这个方法之后,在对象外部使用“unset()”函数删除对象内部的私有成员属性时,对象会自动调用__unset()函数来帮我们删除对象内部的私有成员属性。
// __sleep()
// __sleep(),执行serialize()时,先会调用这个方法.
// serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。
// 此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。
// 如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。
// 注意:
// __sleep() 不能返回父类的私有成员的名字。这样做会产生一个 E_NOTICE 级别的错误。可以用 Serializable 接口来替代。
// __sleep() 方法常用于提交未提交的数据,或类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,这个功能就很好用。
// 例子:
// public function __sleep() {
// echo "当在类外部使用serialize()时会调用这里的__sleep()方法<br>";
// $this->name = base64_encode($this->name);
// return array('name', 'age'); // 这里必须返回一个数值,里边的元素表示返回的属性名称
// }
// 与之相反, unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。 __wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。
// public function __wakeup() {
// echo "当在类外部使用unserialize()时会调用这里的__wakeup()方法<br>";
// $this->name = 2;
// $this->sex = '男';
// // 这里不需要返回数组
// }
// __toString() 方法用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。此方法必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR 级别的致命错误。
// $person = new Person('小明'); // 初始赋值
// echo $person;
// __invoke(),调用函数的方式调用一个对象时的回应方法
// $person();
// 当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
// class per{
// public function say(){
// echo "say hello ";
// }
// public function __invoke($par){
// echo $par;
// }
// }
// $per1 = new per();
// $per1('abc');
// __clone(),当对象复制完成时调用
// $person2 = clone $person;
// class Person
// {
// public $sex;
// public $name;
// public $age;
// public function __construct($name="", $age=25, $sex='男')
// {
// $this->name = $name;
// $this->age = $age;
// $this->sex = $sex;
// }
// public function __clone()
// {
// echo __METHOD__."你正在克隆对象<br>";
// }
// }
// $person = new Person('小明'); // 初始赋值
// $person2 = clone $person;
// // var_dump('persion1:');
// // var_dump($person);
// // echo '<br>';
// // var_dump('persion2:');
// // var_dump($person2);
// $person->age = 20;
// echo $person -> age;
// echo $person2 -> age;
// 对象引用:$b=&$a;
// $person = new Person('小明');
// $person2 =& $person;
// $person->age = 20;
// echo $person -> age;
// echo $person2 -> age;
// PHP对象的浅复制与深复制
// 对象复制和对象引用比较
// __clone(),当对象复制完成时调用
// $person2 = clone $person;
// class per{
// public $num = 20;
// public function say(){
// }
// public function __clone(){
// echo "对象已被clone";
// }
// }
// $p = new per();
// //复制对象 相当于复制一个盗版出来
// // $q = clone $p;
// // $q->num = 50;
// // echo $q->num."<br>";
// // echo $p->num."<br>";
// //对象引用 借东西一样
// $q =& $p;
// $p->num = 50;
// echo $p->num;
// echo $q->num;
// __autoload
// 在魔术函数 __autoload() 方法出现以前,如果你要在一个程序文件中实例化100个对象,那么你必须用include或者require包含进来100个类文件,或者你把这100个类定义在同一个类文件中 —— 相信这个文件一定会非常大,然后你就痛苦了
// 这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数。
// spl_autoload_register自动加载类
// spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载。因此,不再建议使用 __autoload() 函数,在以后的版本中它可能被弃用。
// Final 关键字
// PHP 5 新增了一个 final 关键字。
// 如果父类中的方法被声明为 final,则子类无法覆盖该方法。
// 如果一个类被声明为 final,则不能被继承。
// 手册:
// ——————————————————
//参数绑定
// stmt_init //创建一个预处理实例
// prepare 呸 呸儿 //准备查询语句
// bind_param //绑定参数
// execute //执行sql
// affected_rows9 //回最后一条倍执行的语句改变,删除或插入的总行数
// close //关闭预处理
// bind_result /* 绑定返回的字段 */
//具体请到 [2018.10.31日查找]
// 后期静态绑定
// 命名空间
// http协议
// PHP操作数据库的三种方式(pdo预留)
// pdo的使用
// pdo类封装(常用sql封装);
//数组的运用题
// $a=[
// 'colthes'=>'t-shirt',
// 'size'=>'medium',
// 'color'=>'blue'
// ];
// extract($a);
// echo $colthes;
// $number = [20,-3,50,-99,55];
// function test_odd($var)
// {
// return($var > 0);
// }
// print_r(array_filter($number,"test_odd"));
// $a=array("A","Cat","Dog","A","Dog");
// print_r(array_count_values($a));
// $cities = ['Berlin', 'KYIV', 'Amsterdam', 'Riga'];
// foreach ($cities as $v) {
// print_r(array_change_key_case($cities,CASE_LOWER));
// }
// $arr=range(20, 30);
// var_dump($arr);
// echo "<br/>";
// $values = ['say', ' bye', '', ' to', ' spaces ', ' '];
// function tests($v){
// return trim($v);
// }
// print_r(array_filter($values,'tests'));
// 面向对象基本概念
//命名空间 函数 类 常量
// mysql参数绑定 PDO操作数据库 http协议 tcp
//mvc思想架构
//所谓的mvc思想,就是在显示和逻辑相分离的基础之上,再把逻辑中的所有数据处理模块单独的提取出来
//在需要的功能上进行调度即可!
// m:Model,模型,项目中的数据处理单元,专门负责和数据库进行交互(增删改查)
// v:View,视图,项目中用于结果展示的单元,(以前的模板文件)
// c:Controller,控制器,项目中负责某个功能整体流程调用的单元
//mvc架构的优点
//1.代码结构分工明确,可都性强。
//2.项目开发效率很高,更有利于团队的合作
//3.后期项目的维护和升级变得非常容易
//mvc架构的缺点
//降低了代码运行的效率
//强调
//mvc项目架构思想,指的是项目中代码间的组织关系,不决定语法形式,面向过程和面向对象都可以使用mvc的架构思想!
//mvc模型类
//所谓的模型类,就是把mvc中的数据处理单元的功能,封装到一个类中!
//由于数据处理单元都是和数据库进行交互,而数据表要是数据库的基本单元,所以,典型的,我们一般将一张数据表的所有操作,封装到模型类当中,
//也就是说,一张数据表就对应着PHP项目开发中的一个模型类!
//基础模型类
//所谓的基础模型类,其实就是其他模型类的父类,需要在里面定义一些公共的代码!被其他的模型类所继承。
//模型类的单列模式// 如果在一个功能(控制器)
//中,需要使用某个表的多次操作,应该使用该表的一个模型就可以完成全部的任务