/*var_dump($a)查看数据类型+变量/*echogettype($a)查看数据类型+/*array(1,2,3)数组/*object对象class/*resource资源类型define("NAME","张三");常量echoNAME;defined("NAME")检查常量返回bool$age=30;变量isset();检查变量返回bool
echo_FILE_;获取路径echo_LINE_;获取行数echoPHP_VERSION;php版本echoPHP_OS;
$a=100;十进制$a=-100;$=0100;八进制$=0xff;十六进制
标量:整型0false浮点型0.0false布尔型false字符串"""0"false
复合型:"对象和数组array[]false
特殊类型:资源true和nullfalse
1.强制转换形成新的类型$a="100abc";$b=(int)$a;var_dump($b);2.强制转换在原来改变$a="100abc";setType($a,"integer");var_dump($a);3.强制转换形成新的类型$a="100abc";$b=intval($a);var_dump($b);
强制转换整型:(int)(integer)(bool)(boolean)(float)(double)(real)(string)数组(array)对象(object)读法Oj
$_POST在数组里显示$_GET显示$_REQUEST;不管getpost都接受读绿快print_r($_POST)全局数组
$_FILES上传数据$_COOKIE$_SESSION
$_SERVER$_ENA
REMOTE_ADDR获取ipDOCUMENT_ROOT获取管理路径SCRIPT_FILENAME文件路径
运算符算数运算符+-*/%++--比较运算符=====!=<>!==<><=>=:逻辑运算符&&||!andorxor位运算符&|^~<<>>>>>赋值运算符=+=-=*=/=%=其他运算符..=
科学计数法1.2e+41.2剩余10的4次反
$b=(int)$a;不改变原来的数据,形成新的数据setType($a,"integer");把原来的数据改变$b=intval($a);不改变原来的数据,形成新的数据
字符串转换整型只会转换字母前的数,否则转换0e字母转科学计数法
$a=10;$b=$a++;//$b=10$a=11;$c=$b--;//$c=10$b=9&d=--$c;//&d=9&c=9$e=++$d;//$e=10$d=10//10+8$f=$e-----$e;//$e=8$f=2$g=$f+++++$f;//$f=4$g=6//2+4
"100abc"==100true先转换整型再比较"100abc"===100false===比较全等<>不等同!=$a=false;$a$b=100:$b=1000如果a为真执行俩边数据否则执行后面的echo$b;
&&俩个位trueand||其中一个为true就是trueor!起反xorandorxor一般在连接数据库那样情况用
位运算32位&按二进制俩个为1时是1否则是0|其中一个为1时就是1^不同为1,相同为0~一元运算符取反11111111111111111111111111110000<<二进制向左移动n个右边就补上n个0前面是0补0是1补1某平台不同>>二进制右边移动n个左边就补上n个0前面是0补0是1补1某平台不同>>>全部补0
逻辑&&||和位运算&|一样用但是短路&&一个false就不再计&前面false一样计后面
$a+=1等于$a=$a+1
.连接字符串来使用不可以垃圾整型等可以连接变量.=和+=类似
遇到优先级用无限括号字符串是整数%一般数在0-10分支结构if...elseswitch(变量)...case参数:..break;..defaulttry...catchif()...elseif()...else还有嵌入式if
单个值使用switch方便breakb绿跳出循环同时匹配多个值break12退出多循环default默认与else相同continue本次循环停止,后面的继续在while会死循环continue12退出多循环case1:case2:echo"111";同if(n==1||n==2)
循环结构while(){}do{}...while(){}for(;;){}
}echo$a;数变888传地址
echo"function_exists(fun)";检测函数存在存在true否则falsestatic静态共享第一次初始化
变量区分大小学函数其他不区分
实参可以比形参多
比形可以实参多但是会警告可以忽略在调用加@@fun()
functionfun($a){$args=func_get_args();//接收任意参数为数组echocount($args);//输出参数的个数echo$args[4];//输出参数的第几个0-开始}fun(0,1,2,3,4)
functionfun($a){$sum=0;$args=func_get_args();for($i=0;$i
functionfun($a){$sum=0;$i=0;if($i<=$a){$sum=$a+fun($a-1);}return$sum;}echofun(100);>
内部函数不可以直接调用内部函数但是可以在函数调用不同的外函数
重用函数
避免函数名相同include_once("demo.php");计文件名拷贝require_once("demo.php");完全拷贝到
字符串定义双引号""单引号''反引号``定界符双引号""1.可以在里面执行标量.标量.${num}2.可以使用转义字符"thisisa\"string"\test"3.可以用''单引号单引号''1.不能在单引号执行变量2.只能使用部分转义字符\'\\反引号``1.在反引号使用的是服务器的命令
定界符<<<1.可以在里面执行标量2.可以使用转义字符3.可以使用任何多的双引号""$str=<<< 1·函数的功能介绍2·需要几个参数,一每个参数的类型,那些参数是必需的,那些参数是可选的。3.函数返回值,返回值的类型 输出函数echo()print()有返回值10布尔型die()输出并退出程序printf()sprintf()可以保存才输出变量print_r()输出数组var_dump()输出类型 echo"sss","sss"$num=100.001;printf("%s---%d"---%b---%x--%o--%c---%X---%f---%.2f,$num,$num)按格式输出字符串整型二进制十六进制八进制安编码大写浮点型保留小数printf("%'#20s",$num)一共20位补 ltrim()做掉字符串左空格rtrmin()做掉字符串右空格trim()去掉字符左右右空格strrev()将字符串反转新成新的变量新的要赋值变量strtolower()小写strtoupper()大写strlen($str)查看长度ucfirst()将第一个字符改大写ucwords()将字符串中的每个单词改为大写explode(stringseparator,stringstring,[,intlimit])使用一个字符串分割别一个字符串implode()用一组较小的字符串创建一个大字符串join另一个名substr(stringstring,intstart[,intlength])取得部分字符串strstr(string,string)别名strchr()返回字符串中某字符串开始处至结束的字符串strpos(string,char,[intoffset])寻找字符中某字符最先出现的位置从0开始strrpos()寻找字符中某字符最后出现的位置strrchr()返回最后出现的字符到结束的字符串str_pad(stringstr,intlength,stringadd,)字符串的填补函数STR_PAD_LEFT左STR_PAD_RIGHT右STR_PAD_BOTH俩边 $ex=explode("",$str,2)2分多print_r($ex); $arr=array("hello","ss")implode(",",$arr) ><==按字节进行字符串比较strcmp();<1>-1=0strcasecmp();<1>-1=0按照自然排序法进行字符串比较strnatcmp()按照字符串的模糊比较soundex()读音相不同similar_text(string,string,[$similar%])相同的数目 if(soundex($st)==soundex($stt)){echo"==";}else{echo"!=";}echosimilar_text($st,$stt,$similar);echo$similar."%"; str_replace(string,string,string)替换可以是arraysstr_replace(array,string,string)str_replace(array,array,string)str_replace(要替换的,替换成,那个字符串) stripslashes();去掉引号addslashes() strip_tags()删除标签strip_tags("string","")过滤 处理URL对URL字符串的解析parse_str()parse_url(); URL编码处理函数rawurlencode()要编码的字符串rawurldecode()要解码的字符串urlencode()要编码的字符串urldecode()要解码的字符串 数组是一个可以存储一组或一系列数值的变量.1.可以存储任何类型的数据(多数类型);2.长度可以变长 下标:可以视为资料内容在些数组中的识别名称 $数组变量名[索引值]=资料内容$arr[0]=12arr["name"]="zhangsan";$arr[]=10;$arr[]=100; $arr[0][0]二维数组索引第一的数组中的第一个$arr=array(array(array(),array()),array(array(),array()))三维数组 $数组变量名=array(资料内容,资料内容...)$arr=array(1,"abc",2);$arr=array("one"=>1,100=>"abc",2); $arr[0]=100;$arr[1]=110;以上个数组索引值是几就继续$arr=null;for($i=0;i<100;i++){$arr=0;} $person["name"]="Koo" $arr=array(1,2,“one”,3.333,true);$arr=array("age"=>1,2,“one”,3.333,true);"age"=>1指定下标$arr[name]="Koo" 数组遍历$arr=array(1,2,3,4,5,6);//只能索引数组自定义索引麻烦输出for($i=0;$i foreach(as)循环结构 array_sum()数组相加array_merge(数组,数组)合并数组array_merge_recursive()array_diff()相差什么返回什么array_diff_assoc()vlue相同但key不同一样输出array_intersect()相同的返回array_intersect_assoc()value和key相同才输出 PHP面向对象oop什么是类电脑配置单,桌子图纸,椅子图纸,人类什么是对象电脑教室(20台电脑,20桌子,20个椅子,一个投影,6灯,一个白板,一台IBM,手机,20个学员);类和对象之间的关系什么是成员属性什么是成员方法类里面{成员属性前面有个修饰var成员方法} class人类{成员属性:姓名,性别,年龄,身高,体重;成员方法:可以说话,工作,学习,吃饭,使用电脑] 命名文件要和类名有关person.phpperson_class.php 实例化对象$对象名称=new类名称() 初始化静态段在内存占一个被数据共同用于的栈内存空间小访问速度快长度不变的数据类型int....堆内存空间大访问速度慢大的类型空间不定长的类型string对象代码段语言的结构函数信息$p1->name="John";$p2->name="Koo";$p1->run();在一个类中可以把另一个类当属性$phone1=newPhone();$phone1->xinghao="sm-9100";$phone2=newPhone();$phone2->xinghao="sm-7100";$p1->phone=$phone1; $p1->phone->sendMessage($p2,"hello"); 整合 $对象名称->成员属性;$对象名称->成员方法;特殊的引用$this使用functionrun(){echo"MyName:".$this->name;echo" //构造方法functionPerson(){//创建对象自动调用最先}构造方法特点:名称是和类名相同,对象一产生的时候,就自动调用的方法去初始化成员属性functionPerson($name,$age,$sex){//php4的$this->name=$name;$this->age=$age;$this->sex=$sex;}$p1=newPerson("John",20,"男");在创建对象的时候就赋值//PHP5的构造方法function__construct(){} 先找PHP5的构造方法,找到就执行php5的,就不在执行php4的了找不到,在执行php4的 function__destruct(){//析构方法结束前调用最后创建的对象先开始echo$this->name."bye 加@可以屏蔽警告 封装性就是将对象内部的属性或方法封装在自己对象的内部,在对象内部可以被使用和访问,但在对象的外部或是在其他对象里不能使用的封装的成员private$age;p来vartiprivatefunctioneat(){echo" __set()__get()__isset()__unset()在某一时刻自动调用的方法privatefunction__get($proName){return$this->$proName;}echo" publicfunction__set($proName,$value){if($proName=="age"){if($value<0||$value>150)return;}$this->$proName=$value;}$p1->age=33; isset(变量)判断变量是否存在存在返回1不在返回空privatefunction__isset($proName){//访问对象中的私有属性returnisset($this->$proName);}if(isset($p1->age)){echo"属性存在 unset(变量)清除变量function__unset($proName){unset($this->$proName);}unset($p1->age); 类的继承继承就是对原有的扩展单继承classStudentextendsPerson{var$school;functionstudy(){}}私有的方法继承的不能使用私有属性也是但是重新创建了属性使用才正常使用 类方法的重载同类中方法名和参数个数相同不存在没有这个概念参数个数不同就有现在说重载是指子类的覆写function__construct($name,$age,$sex,$school){parent::__construct($name,$age,$sex);$this->school=$school;}functionrun(){parent::run();//调用继承父类的方法echo$this->school." 访问类型privateprotectedpublicprotected在本类和子类可以访问子类不能低于父类的访问权限方法 finalstaticconstdefine()常量 final:只能用来定义类和方法作用:使用final定义的类不能被继承使用final定义的方法不能覆盖重载 静态的方法Person::run(); __toString()__clone()__call()__autoload() __toString打印对象信息classPerson{*function__toString(){$str="";$str=$this->name.$this->age.$this->sex;return$str;}}$p1=newPerson("John",22,"man");echo$p1." __clone对象克隆$p2=$p1;//是把对象赋值与p2共同管理一个对象$p2=clone$p1;//克隆一个新的对象function__clone(){$this->name="JohnBak".$that->name;//this指clone副本的that指原本}$p2=clone$p1;//克隆一个新的对象__call()调用不存在的函数时调用function__call($funName,$argus){//需要俩个参数一个传入函数名一个传入的参数是数组形式echo$funName."函数";print_r($argus);echo"参数,不存在 对象的串行化函数serialize()unserialize()俩个过程:串行化,就是把对象转为二进制的字符串,serialize()反串行化,把二进制字符串转化为对象unserialize() 第一种:对象在网络中传输的时候第二种:将对象写入文件或者写数据库时$p1=newPerson("John",22,"man");echo$p1." 接口:相当于一个规范不可以实例化对象要被子类继承并且覆写全部方法不全部就是抽象类可以用abstract修饰才能实现接口子类可以有多个接口实现接口时使用implements==extends可以使用抽象类去实现接口的部分方法;interface接口extends接口{}class子类implements父类,父类2{}class子类extends父类implements父类,父类2{}interfaceDemo{所有的成员属性必须是常量;所以的方法都是抽象的不用abstract修饰所有的成员都是必须是public} 多态的应用弱类型类直接对象调用不好像java子类父类类型转换interfacePCI{functionstart();functionstop();}classNetCardimplementsPCI{functionstart(){echc"start";}functionstop(echc"stop";);}classViewCardimplementsPCI{functionstart(){echc"start";}functionstop(echc"stop";);}classmainBoard{functionusePCI($pci){$pci->start();$pci->stop();}}classPerson{functioninstall(){$nc=newNetCard();$vc=newViewCard();$pci=$nc;$pci=$vc;$pci->start();$pci->stop();}}$p=newPerson();$p->install(); preg_replace()替换preg_replace("/\d/","MM",$str,1)默认全部-11preg_replace("/\d/e","md5(MM)",$str)e当表达式 str="currentdateandtimeis".date("Y-m-dh:ia").",wearelearningphp";echopreg_replace("/(\d{4}-\d{2}-\d{2})(\d{2}:\d{2})([ap]m)/"," preg_split()分割是个数组arr=preg_split("/[:,\s]/",$str); .任意字符一个.+或者.*0个多个可以没有.* 文件打开模式参数r只读打开文件必须存在指针开头r+读写打开文件必须存在指针开头w写文件打开将文件清空不存创建指针开头w+读写打开文件将文件清空不存创建指针开头a写打开追加不存创建指针结尾a+读写打开追加不存创建指针结尾 x读打开存在false不存在创建文件指针开头只能本地x+读写打开存在false不存在创建文件指针开头只能本地 b只能win创建二进制文件t只能win\n转换\r\n跨平台文件 $file=fopen成功返回文件相当true不返回boolfalse if(!$file){echo'error';exit();}直接ordie('openerror'); fwrite写入文件for[]fwrite($file,'内容','int只写多少个'); fclose($file)ordie('closeerror')关闭关闭成功truefalse PHР文件系统(文件操作)1·写入文件2.写入数据库php对文件系统的操作是基于Unix系统,或者linux文件一般处理函数fopen(); 少打$循环死机$i++只一个递增死循环 9.2文件系统处理 fwrite别名fputs()fread($file,filesize($filename));读取全部fgets($file,intLength)返回文件一行长度读取一行循环读取指针往下fgetc($file)读取一个字符指针往下返回内容结尾返回falsefilesize($filename)获得文件大小feof($file)feof判断是否到文件末尾{ { file($filename);返回一个数组每一行一个元素不用打开关闭文件 readfile();直接输出到浏览器里面读入一个文件并写入到输出缓冲里面不方便控制直接dom不用打开关闭看内容还可以 file_exists($filename)判断文件存在返回bool { counts($filename);>} 9.3文件系统处理 php不能自己现在用的路径过 file_get_contents($filename)可以本地网络不用打开关闭都封装好了file_put_contents($filename,'内容');写入内容不用打开关闭都封装好了返回内容长度清空替换 防止多个人同时操作文件flock();锁成功truefalse枷锁$file=fopen('test.txt','r');flock($file,[conts]);LOCK_SH:共享锁定,读文件的时候使用LOCK_EX:独占锁定,写入文件的时候使用LOCK_UN:释放锁定LOCK_NB:附加锁定 读完lock_un释放文件第三个才可以读取 die('推出并且输出') { 俩人操作写文件大家都锁定多重锁定error防止多锁定加附加锁等一个人释放了才可以LOCK_EX+LOCK_NB{ 9.4文件系统处理文件指针ftell()返回文件指针位置fseek()设置指针位置返回boolfseek(文件指针,移动的字节数,起始位置)fseek($file,30,SEEK_CUR)读30字符(相当跳过30字符)当前ftell查看还可以是-5反读起始位置SEEK_CUR当前位置SEEK_SET开头SEEK_END结尾rewind()移动指针到文件开头组合fread(file,设置指针){ 都不要打开关闭文件copy("c:\\curentFilename","c:\\targetFilename")复制returnboolunlink("c:\\targetFilename")删除returnboolrename("demo.txt","hello.txt")重新命名returnbool 需要打开关闭$fp=fopen()返回文件的指针ftruncate($fp,int多少Char)截取文件内容returnbool源文件改变只能保留截取文件内容 { file_exists()文件存在filesize()文件大小filetype()文件类型 is_dir()是否目录 is_file()是否是文件is_link()是否是链接文件is_executable()是否可执行文件is_readable()是否可读写文件is_writable()是否可以写文件{ echo"fileCreateTime:".date("Y年m月j日",filectime($filename))." 在win修改不太明显linux下还是改文件权限改grouprwxchmod($filename,0644)returnbool权限chown($filename,501)returnbool所有者chgrp($filename,503)returnbool所有组fileowner($filename)文件所有者0管理员返回idfilegroup($filename)文件所有组0管理员返回id 继续再重来{//chmod($filename,0777);//权限修改//chown($filename,501);//所有者修改//chgrp($filename,503);//所有组修改echofileowner($filename)." 在读一次目录指针下面二次不执行rewinddir目录指针开头 { closedir($dirHandle);>} $d=dir(目标目录str)返回目录对象oop模式对象下面的方法路径$d->path引用句柄$d->handle读取内容$d->read()同readdirreturn文件失败false读取一个文件目录指针向下循环读取关闭$d->close();{ 优化如果文件存在提示覆盖或者跳过echobreak C:\Users\Administrator\Desktop\video_1010.1文件上传 文件上传文件下载1.表单提交2.对文件的操作 表单必须要改的:
";}>
";}>while()list()each()
";//1和value是值echo"\$arr[".$a["key"]."]"."=".$a["value"]." ";}>
";}}$p1=newPerson();$p2=newPerson();>
接信息是$Message
";}}$p1=newPerson();$p2=newPerson();$p1->name="John";$p2->name="Koo";$p1->run();$phone1=newPhone();$phone2=newPhone();$phone1->xinghao="sm-9100";$phone2->xinghao="sm-7100";$p1->phone=$phone1;$p2->phone=$phone2;$p1->phone->sendMessage($p2,"hello");>
我在说话";}
";}
吃饭";}
".$p1->name."
";
";}else{echo"属性不存在
";}
";}
";
";}$p1->fun("数组");//调用不存在函数__autoload()自动加载类php写在外部的function__autoload($className){//需要一个参数include_once($className."_class.php");}
";$str=serialize($p1);$file=fopen("tmp.txt","w");fwrite($file,$str);fclose($file);
';}fclose($file);>
".ftell($file);//rewind指针文件开头rewind($file);echo"
".ftell($file);if(!flock($file,LOCK_UN)){die("无法释放文件锁");}fclose($file)ordie("文件关闭失败");//file()file_get_contents()readfile()//echofile_get_contents($filename);>}
";if(is_link($filename))echo"是链接文件"."
";if(is_executable($filename))echo"可执行文件"."
";if(is_readable($filename))echo"可读文件"."
";if(is_writable($filename))echo"可写文件"."
";echo"filesize:".filesize($filename)."
";echo"filetype:".filetype($filename)."
";
";echo"fileXiuGaiTime:".date("Y年m月j日",filemtime($filename))."
";echo"fileFanWenTime:".date("Y年m月j日",fileatime($filename))."
";}else{echo"文件不存在";}>}
";//return所有者uidechofilegroup($filename)."
";//return所以组id}9.6文件处理之目录操作9.7文件处理之目录操作目录操作遍历目录循环遍历函数遍历打开文件fopen()fread()fclose()打开目录opendir(目标路径);returnboolfase+e_wangine警告信息@opendir()@屏蔽警告readdir(目录引用句柄)文件目录都读取但不目录下面的目录和文件returnbool指针目录里面目录下个读取一个目录文件循环读取指针向下没有返回false到底特殊俩个目录.当前..上级目录不输出或先读取跳过if判断...rewinddir()指针目录开始closedir()
";while(($file=readdir($dirHandle))!==false){//if(is_dir($file)){if(is_dir("data".DIRECTORY_SEPARATOR.$file)){echo"目录:".$file."
";}else{echo"文件:".$file."文件大小:".filesize("data".DIRECTORY_SEPARATOR.$file)."
";}}rewinddir($dirHandle);echo"
二次读取
";while(($file=readdir($dirHandle))!==false){if($file!='.'&&$file!='..'){if(is_dir("data".DIRECTORY_SEPARATOR.$file)){echo"目录:".$file."
";}else{echo"文件:".$file."文件大小:".filesize("data".DIRECTORY_SEPARATOR.$file)."
";}}}
";echo"句柄指针".$d->handle."
";//$->read();.//$->read();..while(($file=$d->read())!==false){//readdir()if($file!='.'&&$file!='..'){echo"文件目录:".$file."
";}}$d->close();//closedir()>}
$_files会显示上传位置C:\Users\Administrator\AppData\Local\Temp\php6584.tmp缓存系统自动clean
php.inifile_upload=on是否应许文件上传upload_max_filesize=2M服务器限制上传大小post_max_size=8Mpost数据大小
$_getpostrequestfiles
html{
Passwd:
$_FILES标准的MIME类型texttext/html.html.htm...text/plain.txt.logimageimage/gif.gifimage/jpeg.jpeg.jpgimage/png.pngaudioaudio/x-midimid.mid.midiaudio/w-wav.wavvideovideo/quicktime.qt.movvideo/mpeg.mpegapplicationapplication/pdf.pdfapplication/msword.doc.dotapplication/vnd.ms-excel.xlsapplication/vnd.ms-powerpoint.pptapplication/zip.zipapplication/rar.rarapplication/xml.xml.xslapplication/mshelp.hlp.chmapplication/octet-stream.ext.bin.com.dll.classmultipartmessage
控制上传类型
注意可执行文件权限安全临时文件不能执行rwxrw-安全目录都是随机字符串临时目录cpoy到自己指定目录也行了专门函数move_uploaded_file()移动上传文件returnboolmove_uploaded_file(目标路径,现在路径可同时改名)move_uploaded_file(.$_FILES['upfile']['tmp_name'],'upload/'.time().$_FILES['upfile']['name'])改名随机安全成功显示大小sizeb/512*1024byte/512*1024tokbecho"size:".($_FILES['upfile']['size']/512*1024)."kb
";
$_files[myfile][error]>0才执行移动switch1.上传的文件超过了php.iniupload_max_fileszie2.上传的文件超过了html表单中max_file_size3.文件部分上传不完整4.没有文件上传论坛discuz->
判断上传文件在不在临时目录下is_uploaded_file($_FILES['upfile']['tmp_name'])returnbool在才执行移动
版本老是4成功也是..暂时注销4看错了有俩个file一个file0一个不用是4[[]]
10.3上传多个文件和文件下载处理
$_files['myfile']['name'][0]$_files['myfile']['name'][1]$_files['myfile']['name'][2]
$_files['myfile']['size'][2]
$_files[myfile][error]!=upload_err_ok常量$_files[myfile][error]!=0
标签加个[]变三维数组
俩个文件改浏览器缓存问题
成功过
出现多个不是是因为只上一个其他空才显示这
下载输入地址根直接下载了图片部分html不行了服务器设置才可以浏览器打开
文件下载文件下载的类型使用MIME类型表示下载文件的描述如给出文件名称等下载文件的长度以字节为位header()告诉浏览器header是什么header()只能在php文件开头不能输出echo空格等这空格也不行
header("Content-type:text/html");//文件格式header("Content-type:image/pngjpeg");header('Content-Disposition:attachment:filename="download.html"');//文件描述\download.jpg\同时改下载时显示的名字否则原来名字header("Content-Length:".filesize($filename));//responsebrowser文件长度用读打开文件fopenhtml用whilefeof($p)是否指针到底fread()fclosereadfile($filename)直接显示dom图片用告诉浏览器是什么类型不是浏览是下载路径有index会autoindex无权访问此服务器上的/es6/data/。工具设置权限设置不行简单不直接下载
{
C:\Users\Administrator\Desktop\arrayarray_filter
函数array_filter()作用:调用回调函数过滤数组中的元素原型:array_filter(arrayinput[,callbackcallback]);第一个参数:input第二个参数:callback匿名函数函数函数()测试下就知行不简单小时过返回值array新数组原不变
array_intersect函数array_intersect()数组中都有的数作用:计算数组的交集原型:array_intersect(arrayarray1,arrayarray2,[,array...])第一个参数:array1第二个参数:arrayn返回值array新数组原不变
俩个数组都有的显示多个比较
函数array_merge()作用:把一个或多个数组合并为一个数组原型:array_merge(arrayarray1[,arrayarray2,array...])第一个参数:array1第二个参数:arrayn返回值array新数组原不变
索引数组一个一个排新数组从0关联数组...相同key最后数组覆盖
array_pop函数array_pop()弹出array_push添加入栈作用:删除数组中的最后一个元素,即将数组最后一个单元弹出(出栈)原型:mixedarray_pop(array&array)第一个参数:array必须是数组变量(引用传递)返回值mixed删除内容原变
array_push函数array_push()作用:向数组的结尾压入数据(进栈)原型:intarray_push(array&array,mixedvar[,mixed...])第一个参数:array必须是数组变量(引用传递)第二个参数:var..添加内容多个...返回值intnewarrayLen原arr变
array('arr','bb')类创建数组字面量快添加$arr[]=100;
array_rand函数array_rand()作用:从数组中随机选出一个或多个元素原型:mixedarray_rand(arrayinput[,intnum_req])第一个参数:input第二个参数:num_req返回值array新数组mixed在数组中取得n个1个直接字符串返回的是原数组的下标2个以上数组返回的是原数组的下标array_rand($arr,2)
";//返回的是原数组的下标$key=array_rand($arr,2);//2->返回key组成的数组print_r($key);echo"
".$arr[$key[0]];>
array_shift函数array_shift()shift开头删除unshift开头添加push结尾添加pop结尾删除en分池其他语言pull|版本作用:删除数组中第一个元素原型:mixedarray_shift(array&array)第一个参数:array必须是数组变量(引用传递)返回值mixed删除内容原数组改变
array_sum函数array_sum()作用:返回数组中所有值的总和原型:numberarray_sum(arrayarray)第一个参数:array返回值number
in_array
函数in_array()作用:检查数组中是否存在某个值原型:boolin_array(mixedneedle,arrayhaystack[,boolstrict])第一个参数:needle"str"第二个参数:haystack目标数组第三个参数:strict严格按类型匹配返回值boolean
字符串区分大写regxphpone
range函数range()作用:创建并返回一个包含指定范围的元素的数组原型:arrayrange(mixedfirst,mixedsecond[,numberstep])第一个参数:first第二个参数:second第二个参数:step返回值newarr
多用于初始化数组range(1,50,10)1-50每次跳10数组
shuffle函数shuffle()作用:把数组中元素按随机顺序重新排列原型:boolshuffle(arrayinput)第一个参数:input返回值bool原数组改变下标随机改变php5视频函数库
unique函数array_unique()作用:删除数组中重复的值,并返回没有重复的新数组原型:arrayarray_unique(arrayarray)第一个参数:array返回值array新数组原不变key不同value相同去掉
C:\Users\Administrator\Desktop\datetimedate
C:\Users\Administrator\Desktop\filebasename函数basename()作用:返回路径中的文件名部分原型:stringbasename(stringpath[,stringsuffix])第一个参数:path第二个参数:suffix.php返回就去后缀返回值string文件名分隔符.../\directory_separator
dirname函数dirname()目录部分basename()文件部分作用:返回路径中的目录部分原型:stringdirname(stringpath)第一个参数:path返回值string
file函数file()file_get_contents()作用:把整个文件读入一个数组中原型:arrayfile(stringfilename,[intuse_include_path,resourcecontext])第一个参数:filename返回值array
一行一个建值不用打开关闭
file_get_contents函数file_get_contents作用:将整个文件读入一个字符串原型:stringfile_get_contents(stringfilename,[booluse_include_path,resourcecontext,intoffset,intmaxlength])第一个参数:filename返回值string
filetype函数filetype()作用:取得文件类型原型:stringfiletype(stringfilename)filedirunknownblockchardirfifofilelinkunknown第一个参数:filename返回值style
fopen支持远程文件函数fopen()作用:打开文件或者URL原型:resourcefopen(stringfilename,stringmode[,booluse_include_path,resourcezcontext])第一个参数:filename第二个参数:moderr+读写打开ww+清空创建xx+不存在创建aa+最加b二进制t跨平台\n\r返回值resource
$_server['document_root']服务器跟地址
都帮助文档看
项目合作不一个人分公
pathinfo函数pathinfo()dirnamebasename作用:返回文件路径的信息原型:arraypathinfo(stringpath,[intoptions])dirnamebasenameextension扩展名第一个参数:path第二个参数:options返回值array
";//basename()echo"扩展名:".$pathinfos['extension']."
";>
readfile函数readfile()file()gets()作用:输出一个文件原型:intreadfile(stringfilename,[booluse_include_path,resourcecontext])第一个参数:filename返回值int
$mysqli=newmysqli();$mysqli->connect()$mysqli->select_db()调用对象下的方法
$mysqli=newmysqli(1270.0.01...)构造方法init
$mysqlivar_dump查对象
mysqli_connect_errno
函数mysqli_connect_errno()是否错误mysqli_connect_error()错误信息作用:测试在建立连接的过程中是否发生错误原型:boolmysqli_connect_errno(void)返回值boolean
mysqli_fetch_accoc函数mysqli_fetch_assoc()mysqli_fetch_row()作用:从结果集中获取一条记录原型:mixedmysqli_fetch_assoc(mysqli_resultresult)classmysqli_result{mixedfetch_assoc(void)}返回值mixed
{
";}>}
{
";}>}
$res=$mysqli->query(sql语句)$res->fetch_rowfetch_assoc一行数据
mysqli_fetch_array函数mysqli_fetch_array()返回指定都关联索引数组mysqli_fetch_assoc()return关联mysqli_fetch_row()索引数组作用:从结果集中获取一条记录原型:mixedmysqli_fetch_array(mysql_resultresult,[intresulttype])Objectorientedstyle(method);classmysqli_result{mixedfetch_array([intresulttype])}大写常量mysqli_assoc关联数组返回用这直接用mysqli_fetch_assocmysqli_num索引数组mysqli_fetch_row()mysqli_both默认关联索引没必要俩个返回返回值mixed
mysqli_fetch_object函数mysqli_fetch_object()mysqli_fetch_array()mysqli_fetch_assoc()mysqli_fetch_row()作用:从结果集中获取一条记录对象原型:mixedmysqli_fetch_object(mysqli_resultresult);Objectorientedstyle(method);classmysqli_result{mixedfetch_object(void)}返回值mixed
指针向下读取
';echo$row->title;>
mysqli_fetch_row函数mysqli_fetch_row()作用:从结果集中获取一条记录对象原型:mixedmysqli_fetch_row(mysqli_resultresult)Objectorientedstyle(method);classmysqli_result{mixedfetch_row(void)}返回值mixed
读取到最后返回nullfalse循环while
";}
>mysqli_query函数mysqli_query()作用:执行SQL命令原型:mixedmysqli_query(mysqlilink,stringquery,[intresultmode])Objectorientedstyle(method);classmysqli{mixedquery(stringquery,[intresultmode])}返回值mixed
插入sql返回bool插入sql更新返回boolinsertinfothink_data(id,title)values('3','name');updatethink_datasetname='x'whereid=1;
select查询返回mysqli对象select*fromdemo;{
C:\Users\Administrator\Desktop\sessionsession_destroy函数session_destroy()作用:销毁和当前session有关的资料原型:boolsession_destroy(void)返回值boolean
不能这样全局变量都删除了unset($_SESSION['username']);
等空数组session_start();$_SESSION=array();//判断变量是否存在if(isset($_COOKIE[session_name()])){setCookie(session_name(),'',time()-60,'/');}session_destroy();
session_start函数session_start()作用:启动session原型:boolsession_start(void)开始不能有空格换行同header()返回值boolean
用户会话开始session_start();echosession_id();浏览器其他同页面一个id客户端返回的id
以后调用$_COOKIE['cookiename']
$username=skygaoexpiretime()+60*60*24*77天
ie删除cookieschrome控制台查看c://documentsandsettings/ibm/cookies内容里面
setCookie('username','koo',time()*60*60);delsetCookie('username','',time()-60);setCookie('username');
C:\Users\Administrator\Desktop\stringexplode函数explode()作用:字符串分割原型:arrayexplode(stringseparator,stringstring,[intlimit])第一个参数:必须第二个参数:必须第二个参数:可选分割多少部分-1最后2返回值array数组
list($var,$var2)=explode('+',$lamp);以前文件了转换为变量print_rvar_dump
";>
ke全部多time不轮少轮多轮各扩挑重少肯轮
htmlspecialchars函数htmlspecialchars()作用:将HTML标记中的特殊字符转换成HTML实体原型:stringhtmlspecialchars(stringstring,[intquote_style,stringcharset])第一个参数:必须<"<""$quot;>$gt;
';echo$str;echohtmlspecialchars($str,ENT_QUOTES,'utf-8');>
implode函数implode()join()别名作用:连接数组中的元素组合成为字符串原型:stringimplode(stringglue,arraypieces)第一个参数:必须第二个参数:必须返回值字符串分割explode联合implode()john()
';echojoin('=>',$arr);>
md5函数md5()作用:将一个字符串进行MD5算法加密原型:stringmd5(stringstr,[boolraw])第一个参数:str表示待处理的字符,是必须传递的参数第二个参数:raw是一布尔类型返回值str
数据库猜密码
文件加密md5_file();
md5implode-joinexplodehtmlspecialcharslist()md5_file
number_format函数number_format作用:123,456,890原型:stringnumber_format(floatnumber,[intdecimals,stringdec_point,stringthousands_sep])第一个参数:number一个数字必须数字第二个参数:decimals多少位小数第三个参数:dec_point整数.分割符中间.小数部分第四个参数:thousands_sep整数分割符返回值str
printf函数printf()直接输出到浏览器参数相同sprintf()返回字符串变量在echo..输出作用:格式化输出字符串原型:stringprintf(format,arg1,arg2...argn)%%百分百输出%b数字二进制%c字符%d数字十进制%e科学计数法%u无符号%f浮点数%F双浮点数%o八进制%s字符串%x16进制%X16进制返回值字符串12个
10jz:%d
float:%f
double:%F
8zj:%o
16zjx:%x
16zjd:%X
char:%c
string:%s
unsign:%u
kexue:%e',$num,$num,$num,$num,$num,$num,$num,$num,$num,$num,$num,$num);>字符串类%%-%c-%s进制类%b%o%d-%f-%F-%e-%u%x-%X共12
sprintfprintf()直接输出到浏览器参数相同sprintf()返回字符串变量在echo..输出sprintfphp345->sprint-返回一个格式化字符串描述stringsprint(stringformat,[]mixedargs,mixed..)b整数转成二进位.c整数转成对应的ASCI1字符d整数转成十进位f单倍精确度数字转成浮点数。.o整数转成八进位转成字符串。.s转换字符串x整数转换小写十六进位X整数转换大写十六进位
{
字节:%c
字符串:%s
进制类:
二进制:%b
八进制:%o
十进制5类:
十进制:%d
Float:%f
Double:%F
科学计数法:%e
无符号:%u
十六进制2类:十六大写:%X
十六小写:%x
",$num,$num,$num,$num,$num,$num,$num,$num,$num,$num,$num,$num);echo$tmp;>}
strip_tags函数strip_tags($str)去掉标签[保留]过滤用htmlspecialchars()标签原本输出原来用作用:删除一些对页面布局有影响的html标记原型:stringstrip_tags(stringstr,[stringallowable_tags])第一个参数:必须str对象第二个参数:可选保留标签列表''不用闭合返回值新字符串{daima
var";$newstr=strip_tags($str,'');//默认把标签清除,[保留list]echo$newstr."
";//strip_tagshtmlspecialcharsechohtmlspecialchars($str);//原本输出>}
printf-sprintstr_replace
-strip_tags()-htmlspecialchars()
strposstrpos找到第一次出现的字符串的所在位置描述intstrpos(stringhaystack,mixedneedle,[intoffset])strpos(strobj,'里面内容',编移位置)存在返回索引位置不存在返回false > strrchrstrrchr查找最后一次出现在字符串中的字符描述stringstrrchr(stringhaystack,stringneedle) 返回最后一个字符之间的字符串返回只查找需要查的字符第一个来查abb不用 strrpos找到最后一次出现字符串的所在位置描述intstrrpos(stringhaystack,mixedneedle,[intoffset]) -1最后一个0开始r返回过来-1=00=-1 strobj开始\-1长度|-1 php.substr===js.splice trim函数trim()bothltrim()leftrtrim()right作用:清除空格俩边原型:stringtrim(stringstr,[stringcharlist])第一个参数:必须require第二个参数:可选options""="\0"空"\t"\n<-默认|".."0..9中间a..z设置del目标默认空格返回值new字符串strregexpreg_ereg_ strlen长度cngwdoc... 源码工具g-bgshoptpshop书才有g-***dstp08有书有视频无g-xg linuxoldg-sp名不txt2g小直接desktopold挑重 新书在新视频|old看书+shop...ds 先linuxoldgnewtxtold配套phpdoc C:\Users\Administrator\Desktop\Linux教学视频phptiao这old更tiao 图片各有不截图文字音挑重g可以漏liunx版本随便一个模拟可以就练没就看过下ds系统 newphp..linux... 源码最好新改bug废弃... 环境php配过jdg集成 1.Linux应用与发展(一)完美应用ubuntu,PHP5项目实战详解《UNIX系统管理实用教程》、《Solaris8系统管理员指南》 bzygtz 操作系统是一个能够协调、控制计算机系统硬件和软件资源的控制程序,位于计算机硬件和应用程序之间,核心程序处于中心,提供最基本的计算功能。操作系统实现了用户与计算机之间的交互。操作系统主要提供以下基本服务程序:1·文件系统2,设备驱动程序3,用户接口4.系统服务程序 unixc语言unix俩大分类SystemVBSD bgbzy UNIX主要发行版本版本公司芯片aixibmpowerpchp-uxhppa-riscsolarissunsparclrixsgimipsdigitalUnixdecalphalinuxBSDredhatlinux-ubuntu-freebsela(intelamdcyrixrise...) 2.Linux应用与发展(二)linuxLinux主要发行版本 redhatfedoraturbolinuxcentosmandrivagentooliunxnovellsuse红旗...debianubuntuknoppix 自由软件介绍口使用的自由可以不受任何限制地使用软件口研究的自由可以获得软件源代码、研究软件运作方式口散布的自由可以自由复制软件及散布给他人口改良的自由可以自行改良软件并散布改良后的版本 软件应该是自由的,应尊重人类的自由意志,它与人类之间不应有任何隔膜。商业模式 自由软件介绍sambasendmail.orgapachemysqlphpinternetsystensconsortium deepin...ds3.Linux应用与发展(三)Linux优良特性分时的多用户、多任务的操作系统多数网络协议支持,方便的远程管理强大的内存管理和文件管理系统大量的可用软件和免费软件优良的稳定性和安全性良好的可移植性和灵活性可供选择的厂商多 Linux系统结构用户图形界面应用层图形界面shell层shell命令内核层系统调用硬件 XWindow简介oldnew其他界面kde基于....x11dsXWindow系统特点:口独立于操作系统口网络特性口源代码免费UNIX图形环境:CDE(通用桌面环境)CommonDesktopEnvironment cdekdegnomexfcemate...fvvm... Linux应用领域电子政务网络应用科学运算嵌入式应用 linuxphpmysqlperlopenoficeredofficeuosdeepin....newold...kali....随便一个都一样到时...内核一样..插件特效到时.... Linux娱乐应用wine.... 网络应用lamp基于LAMP的网站论坛及B/S架构应用基于Linux的负载均衡和集群基于Linux的防火墙及代理服务器基于Linux的网游服务器 每天一点从头到尾多打练系统靠自己基础命令 安全运维.... lgpgdsg lamp兄弟连php论坛phpchina中国开源wwwsearch cad/cam嵌入式应用生物特征识别系统智能卡系统掌上电脑、手机、信息家电路出器、机顶盒、数码相机、MP4 嵌入式应用 Linux技术认证redhatlinux-professional全国信息技术人才培养工程 5.Linux系统安装(一) zjdsxtygjg先用过以前学过忘记到时重来多练旧过到时系统过 VMware简介VMware主要产品:口VMware-ESX-ServerDVMware-GSX-ServerDVMware-WorkStation dorkbox容器到时...VMware主要特点:1、不需要分区或重新开机就能在同一台PC上使用两种以上的操作系统2、本机系统可以与虚拟机系统网络通信3、可以设定并且随时修改虚拟机操作系统的硬件环境 6.Linux系统安装(二)fedora8以前用过分区...会过 文件系统结构/hometmpetcalexjennyhlsbinnotesreportlogtree /home/alex/root /dev--devices scsi:硬盘接口/dev/sda1/dev/sda2/dev/sdb ide:硬盘接口/dev/hda/dev/hdb 分区规划必要分区:1、根分区/2.swap分区其他分区可根据需要划分 密码设置1、八位以上,大小写字母、数字、符号组合2、要容易记忆合格的密码示例:Am@ri3ln3、定期更换 密码规则Americane--@abcd--1234 7.Linux系统安装(三) 注意防火墙配置稳定就好应许通过的每天一点坚持...头到尾学位置newold selinux安全控制功能... vm快照... ifconfig=ipconfig eth-ethernet0eth1启动第一个网卡 网卡桥接... win控制面板添加硬件添加网卡设置网络适配器本地循环loop 8.Linux系统安装(四) vm网卡手动以前....g- 不错误rm-rf/ home/user/root上传位置默认liming 9.远程访问Linux服务器 redhatliunxferose.....debian...kali.deepin..arch.. win快捷键冲突...虚拟机配置...glf win添加网卡...以前现在手动配置ip回还接口ip同一个网段...ip....桥接...jdg 设置IPnetconfig-redhat系列...servicenetworkrestart重启网络服务serviceiptablesstop关闭防火墙====iptables-F防火墙有关iptables-X禁用.. iptables防火墙 vmdor容器winwc win防火墙... 系统一条龙....服务....学... tree11.Linux命令格式Linux文件的后缀.exe.ini.txt无方便查找系统文件:*.conf*.rpm程序与脚本:*.c*.php格式文件:*.wavjpghtml存档的与压缩文件:*.tar*.gz linux文件命名规则1.大小写敏感2·除了/之外,所有的字符都合法3·有些字符最好不用,如空格、制表符、退格符和字符@#$&()-[]4.避免使用加减或.作为普通文伴的名第一个学符 linux命令格式命令-选项参数命令命令-选项命令参数 绝对路径:是从根开始一级一级地进入各个子目录,最后指定该命令或文件相对路径:是从当前目录进入某目录,最后指定该命令或文件 .当前目录..上一级目录 通配符合*匹配任何字符或任何数目的字符匹配符何单学符[]匹配在何包含在括号里的单字符ls[1234].txt lslist--ls显示文件/bin/ls---/bin/*是所以用户都可以使用/sbinls-a所有ls-l列表ls-Funknown全部但是去... rm-i提示是否... 12.Linux常用命令(一) echo"33">t.txt>>最加linux+""win不用命令名称:touch功能描述:生成空文件所在路径:/bin/touch:alluser活法格武:touch[选项]文件名 命令名称:cd--changedirectory功能描述:切换目录所在路径:shell内部指令活法格武:cd[目录]cd~cdcd..cd../usercd-cd!$cd~/tecterrcd../usrcd-查看上次pwdcd!$切换到上次目录上次命令... cp拷贝 命令名称:pwdprintworkdirectory功能描述:显示目前所在的工作目录所在路径:/bin/pwdalluser活法格式:pwd 命令名称:mvmove功能描述:移动文件所在路径:/bin/mvalluser活法格式:mv-f[源文件或目录][目的文件或目录]可以重新命名....renamewinC-x剪切 命令名称:cat不管文件多长一次性读取出来more分页显示文件内容f或者空格显示下一页面f|enter下一行q|Q推出moreless同more...上下移动less语言到时...f或者空格显示下一页面f|y上一行enter下一行q|Q推出morehead开头10行看结尾-1文件tail结尾10行看开头-1-f实时查看其他用户更改同步..C-c5gcatmorelessheadtail功能描述:查看所在路径:/bin活法格式:common-[]file滚动条查看当自带cmdshell不能...catpasswd>newsave.txt读查看保存到new文件中move空格一屏幕回车放页q推出 13.Linux常用命令(二)ln产生链接文件link/bin/lnln-s[源文件][目标文件]注意:源文件和目标文件一定要使用绝对路径/a/blnfile1file2硬链接不能块分区相当备份...一个改其他不ln-sfile1file相当win快捷键软连接 manmanual查看手册帮组等等单里面提示分类...手册分类0123...其他命令--help== infols查看命令whatisls打错其他继承...whereislsmanlsls--helpwhichls查命令位置whereisls可以找到man1-3whichls 命令信息infolswhatislsmanls里面可以找到man1-3ls--help 挂钩法数字...联想法顺序..启发物比喻内在化图表法笔记流...信息压缩...简写...oldzcnewybg 14.Linux常用命令(三) gzipGUNzip默认原文件delgzip-1表示快速压缩gzip-9ninenice好压缩.gz压缩扩展名 gunzipname.gz解压...压缩del====gzip-dname.gz解压 gzip不能压缩目录 tar可以打包目录和压缩源文件存在tar-cvf-ccreate创建-vview显示-ffilename指定文件名tar打包命令,-c-v-f-cvf简写cuf可以不加-tar-cvfdirnamegzip-9dirname.tardirname.tar.gzgunzipdirname.tar.gztar-xvfdirname.tar-x解包v显示详细f文件名 加其他参数压缩好...ds... 不用gzip但tartar-zcvfname.tar.gzmydir/-zgzip压缩c创建v显示f文件名tar-zxvfname.tar.gz解压 zip-r压缩目录-f更新压缩包-F修理压缩源文件存在.zipzip-rmydir.zipmydir/unzip解压name提示不version覆盖.... 0.512...hzmed不缺少... useraddusername添加用户passwdusername设置密码其他到时创建home..配置自动...delds重新reset先用 自带vmshell不puttytoolsdiyserverunix远程...集群...都认真dkzm1topendeverydaysome rootmail>1n表示未读取>r回信>qexitquitmail1 不行了过exitlouyout ifconfigifconfigeth0:1ip192.168.1.1设置ip添加多个ip winip加虚拟网卡...本地连接 ping-c519.....-ccount次数默认继续win默认4-t继续 shutdown-h1010分钟关机init0reboot重启动=init6vm--连win..可没看过不练....麻烦其他命令也可以.... 15.文本编辑器vi的使用(一) auto壁纸动态视频卡不img小可以尽暗不动以前难不找..现在.. 启动就同步动取消覆盖壁纸...gujbyyqanby启动-取消可以1不就2缓存自动kjwifibbzy 本编辑器vigui了解vi的工作模式只是一个文本编辑器--记事本命令模式:所有在键盘打字都有可能是命令插入模式:进入插入模式i1aAoO回命令模式ESC vifilename命令模式插入模式编辑模式命令模式:所有在键盘打字都有可能是命令iaoIAO插入模式esc命令模式命令以回车结束运行编辑-命令模式shift+: 保存退出ZZ i:在光标前插入文本I:在本行开始插入文本a:在光标后附加文本A:在本行末附加文本o:在光标下插入新行O:在光标上插入新行 命令行模式定位命令h左移一个字符j下移一个字符k上移一个字符l右移一个字符方向键盘也可以 $:带空白结尾移至行尾不带g_0:带空白开头移至行首不带^ enter:下行移至下行行首 H:屏幕开头移至屏幕上端 M:屏幕中间移至屏幕中央 L:屏幕结尾移至屏幕下端 gg:到文件开头G:到文件最后一行1G:到文件第一行nG:到文件第n :20到第20行:setnu设置行号setnum:setnomu取消行号setnonum 临时有效永久当前用户home目录下.vimrc:setnu czdszm16.文本编辑器vi的使用(二) 命令行模式删除命令x:删除光标所在处的字符X:删除光标前面的字符dd:删除光标所在的行dG删除光标所在行到未尾的内容D:删除光标所在处到结尾:n1,n2d 命令行模式复制命令yy,Y复制当煎行nyy,nY夏制当前行以下n行P将已经选择复制或被除的行放到在当前行下粘贴 命令行模式替换和取消的命令r取代光标所在处的字符R从光标所在处开始替换字符,按esc结束s替换光标所在出字符,并进入文本输入方式S替换光标所在全行,按esc结束u取消上一步操作,取消到上次打开文件的点上.并不是上次保存的点,ctrl+rU取消当前行所有操作 命令行模式保存和退出命令:wwnew_filenamewqZZqq!wq!xx! 搜索和替换命令/stringstringnN上下个 替换:%s/old/new/gg全局:%s/old//g清空gii不区分大小regex :r文件名打开其他文件:r把其他文件加到光标行:e文件名bnbp上下个 :!ls操作系统命令 vi-ofile1file2打开俩个文件splitctrl+ww切换splitvsplit分屏ctrl+w+shift+_|最大化ctrl+w+-+加大 vi-Ofile1file2打开俩个文件vsplit sh进入其他shelldsxt...g-查看用户idid用户root@DESKTOP-C2CIP0J:~/demo#idrootuid=0(root)gid=0(root)groups=0(root)root@DESKTOP-C2CIP0J:~/demo#idkoouid=1000(koo)gid=1000(koo)groups=1000(koo),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev) 添加用户useradduser1passwduser1改密码实际上改足够文件 18.Linux的用户管理(二) 用户账号管理创建账户1.在/etc/passwd中添加一条记录2-创建用户主目录3.在用户主目录设置默认的配置文件4·设置用户初始口令 useradd或者adduser命令创建 versionnewoldbranch不同创建不自带home加参数del也是... suuser都可以锁也可以上切换login不行login手动输入loginkalilinuxv|v19.Linux的用户组管理用户组的管理用产组分两私有组:当在创建一个新用户user时,若没有指定他所属于的组,Linux就建立一个和该用产同名的私有组 标准组:标准组可以容纳多个用户,若使用标准组.在创建一个新用户时就应该指定该用户所属于的组 添加用户组useradd用户名user一个组和用户同名usergroupadd组帐号名该组帐号大于500 改变组账号名称groupmod-n新组名原组名 删除组帐号groupdel组帐号名称注意:该账号必须存在且不能作为私有组被用户帐号引用 useradd-gdemouser使用组了usermod-gdemokali-Gdemo:x:1002:kali组内用户列表del#gpasswd-dkalidemocat/etc/group|grepdemo uid=1001(kali)gid=1002(demo)groups=1002(demo)-g组id一个私有组-G组列表多个标准组useraddusermod-gG俩个组都可以加gpasswd-a加是的组列表 添加用户到组组列表多个标准组gpasswd-a用户账号组帐号名从组中删除用户gpasswd-d用户账号组帐号名 id-g-Gdemoid-ukali id命令默认全部功能:查看一个用户的UID和GIDid[选项]用户名 命令名称:功能描述:所在路径:活法格式: old也topbottomeverydaynolooknodayblast...这oldendtop-bottomeverydayaptinstallneofetch图标查询版本200m大不下vm真机才搭算..数dorkbox容器到时...都是查找strstrpos返回位置strposition位置strr右边posstrrchrstrrchar字符返回字符串strrchr==strstrstrstr返回字符串后面-> jdg原变 更高级截取切片php.substr===js.splice trim 其他大直接iso-多分小拷贝c 不全不系统oldg-ds一边整理笔记网络思维导图图片一边重练越来越走远长命到时g- 经验:新疆水利潘区流量计费项目开发、卫星云图监控及广播系统开发、办公自动化0A,新闻、电子商务等Web项目开发。 www.phpchina.comwww.uselib.com ****************php各种学习路线--------省电水气---**********************-----------------------------**************------------------------------**********************************************************//mysql_connect("localhost","root","root")ordie(连接失败);  空格 installThinkPHP5 手册searchip/tp5/public Tp5基础目录结构访问方式mvc模块控制器操作index.php应用入口文件可hiddensearch手册目录namelowercaseG:\phpStudy\WWW\thinkphp\application\index\controller\index.phpSourceCode{ } G:\phpStudy\WWW\thinkphp\application\config.php开启调试模式//应用调试模式'app_debug'=>true, 发布改回来安全目录信息 useframeworkdevelopmentframework 命名规范{目录使用小写+下划线;驼峰法命名(首字母大写),其它文件采用小写+下划线命名;类名和类文件名保持一致,统一采用驼峰法命名(首字母大写);以双下划线“__”打头的函数或方法作为魔术方法} MVC是一个设计模式 $phpindex.phpindex/index/hello/val/value... ThinkPHP5.0在没有启用路由的情况下典型的URL访问规则是: URL大小写默认情况下,URL是不区分大小写的,也就是说URL里面的模块/控制器/操作名会自动转换为小写,控制器在最后调用的时候会转换为驼峰法处理。 URL地址传参数不分先后MVC }> 快速入门完整-> URL传值规则MVC模式 控制器我们找到index模块的Index控制器(文件位于application/index/controller/Index.php注意大小写),我们把Index控制器类的index方法修改为Hello,World!。 //class.name=file.nameclassHelloWorldurl:hello_world 因为默认的URL访问是不区分大小写的,全部都会转换为小写的控制器名,除非你在应用配置文件中,设置了关闭url自动转换如下:'url_convert'=>false, /index/HelloWorld 如果要继承一个公共的控制器类,可以使用:{php namespaceapp\index\controller; useapp\index\controller\Base; classIndexextendsBase{publicfunctionindex(){return'Hello,World!';}}} 控制器类可以包括多个操作方法,但如果你的操作方法是protected或者private类型的话,是无法直接通过URL访问到该操作的,也就是说只有public类型的操作方法才是可以通过URL访问的。{phpnamespaceapp\index\controller; classIndex{publicfunctionhello(){return'hello,thinkphp!';} publicfunctiontest(){return'这是一个测试方法!';} protectedfunctionhello2(){return'只是protected方法!';} privatefunctionhello3(){return'这是private方法!';}}当我们访问如下URL地址的时候,前面两个是正常访问,后面两个则会显示异常。 mysql.run脚本批量 {老手推荐使用cmd指令来执行sql,因为速度比较快,首先也是连接上数据库,创建并选择好数据库:mysql>use数据库名;mysql>setnamesutf8;--设置传输编码,避免中文乱码mysql>sourced:/xxx.sql;--source文件路径就这么简单,然后就等着sql执行完毕即可.} 首先我们需要在应用的数据库配置文件application/database.php中添加数据库的连接信息如下:{return[//数据库类型'type'=>'mysql',//服务器地址'hostname'=>'127.0.0.1',//数据库名'database'=>'demo',//数据库用户名'username'=>'root',//数据库密码'password'=>'',//数据库连接端口'hostport'=>'',//数据库连接参数'params'=>[],//数据库编码默认采用utf8'charset'=>'utf8',//数据库表前缀'prefix'=>'think_',//数据库调试模式'debug'=>true,];} 接下来,我们修改下控制器方法,添加读取数据的代码:{phpnamespaceapp\index\controller; usethink\Controller;usethink\Db; classIndexextendsController{publicfunctionindex(){$data=Db::name('data')->find();$this->assign('result',$data);return$this->fetch();}}} {thinkphp/application/index/view/index/hello.html thinkphp/application/index/controller/hi.php{phpnamespaceapp\index\controller;useapp\index\controller\Index;//继承公共控制器类.php.name+class.nameclassHiextendsIndex{publicfunctionindex($id='values'){$hi=newIndex();//$hi=super.demo()return$id.'Demo 数据库插入三种方法插入后获取id和多条插入//Db::execute('insert*');调用sql语句tp5构造方法//Db::table('table_name')->insert(['name'=>'','id'=>'']);去表前缀Db::name('data')->insert(['name'=>'','id'=>'']);//dump查询数据类型数组//创建成功返回truedumpint1 phpMyAdminSqlnamesql脚本mysql-uroot-proot-Dthink_data>demo.sqlmysql>sourcedemo.sql insertintodata(id,name)values(1,'k'),(2,'kk'); //ctrl+enterEditPlus arguments``error Db::name('data')->insert(['data'=>'koo']);不用id单可以OK不用keyerror query和execute两个方法Db::query('select*fromthink_datawhereid=5');query方法返回的结果是一个数据集(数组),如果没有查询到数据则返回空数组。execute创建成功返回truedumpint1 showtablesfromdemo query方法用于查询,默认情况下返回的是数据集(二维数组),execute方法的返回值是影响的记录数。 切换数据库{$result=Db::connect([//数据库类型'type'=>'mysql',//服务器地址'hostname'=>'127.0.0.1',//数据库名'database'=>'thinkphp',//数据库用户名'username'=>'root',//数据库密码'password'=>'123456',//数据库连接端口'hostport'=>'',//数据库连接参数'params'=>[],//数据库编码默认采用utf8'charset'=>'utf8',//数据库表前缀'prefix'=>'think_',])->query('select*fromthink_data');dump($result);} {或者采用字符串方式定义(字符串方式无法定义数据表前缀和连接参数),如下: $result=Db::connect('mysql://root:123456@127.0.0.1:3306/thinkphp#utf8')->query('select*fromthink_datawhereid=1');dump($result);} 应用配置文件(application/config.php//数据库配置1,//数据库配置2{//数据库配置1'db1'=>[//数据库类型'type'=>'mysql',//服务器地址'hostname'=>'127.0.0.1',//数据库名'database'=>'thinkphp',//数据库用户名'username'=>'root',//数据库密码'password'=>'123456',//数据库连接端口'hostport'=>'',//数据库连接参数'params'=>[],//数据库编码默认采用utf8'charset'=>'utf8',//数据库表前缀'prefix'=>'think_',],//数据库配置2'db2'=>[//数据库类型'type'=>'mysql',//服务器地址'hostname'=>'127.0.0.1',//数据库名'database'=>'test',//数据库用户名'username'=>'root',//数据库密码'password'=>'',//数据库连接端口'hostport'=>'',//数据库连接参数'params'=>[],//数据库编码默认采用utf8'charset'=>'utf8',//数据库表前缀'prefix'=>'test_',],}$result=Db::connect('db1')->query('select*fromthink_datawhereid=1');$result=Db::connect('db2')->query('select*fromthink_datawhereid=1'); values(,,)',[8,'thinkphp',1]); values(:id,:name,:status)',['id'=>10,'name'=>'thinkphp','status'=>1]); 链式操作使用链式操作可以完成复杂的数据库查询操作,例如: //查询十个满足条件的数据并按照id倒序排列$list=Db::name('data')->where('status',1)->field('id,name')->order('id','desc')->limit(10)->select();dump($list); 支持链式操作的查询方法包括: 方法名描述select查询数据集find查询单个记录insert插入记录update更新记录delete删除记录value查询值column查询列chunk分块查询count等聚合查询 //插入记录-用TP5的查询构造器方法//Db::table('think_data')->insert(['id'=>9,'data'=>'data']);Db::table('think_data')->update(['id'=>4,'data'=>'dae']);//插入记录-去掉表前缀Db::name('data')->insert(['id'=>900,'data'=>'data']); //插入记录-去掉表前缀config配置里的前缀 数据库插入数据的四种写法Db::executeDb::tableDb::namedb('data')insertGetIDinsertAll($data)多条 系统提供的助手函数db dump($result);//返回插入数目 切换数据库:$res=Db::connect('mysql://root:root@127.0.0.1:3306/demo#utf8')->query('showtables'); 岔开分离操作链条操作 //参数绑定占位符Db::query('insertintothink_data(data)values(),()',['hello','world']);//带命名占位符Db::execute('insertintothink_data(data)values(:data),(:data1)',['data'=>'hh','data1'=>'ww']);field:领域 //加whereDb::table('think_data')->where('id',9)->update(['data'=>'update9']); //查询数据field('id,data')范围$list=Db::name('data')->field('id,data')->where('id',9)->select();dump($list); //链式操作可以完成复杂的数据库查询操作//链式操作不分先后,只要在查询方法(这里是select方法)之前调用就行$list=Db::name('data')->where('id',9)->field('id,data')->order('id','desc')->limit(10)->select();dump($list); column列chunk分块count集合查 创建表时指定表类型的方法createtable`data`(`id`int(88)notnullauto_incrementprimarykey,`name`varchar(255)defaultnull)engine=myisam; --也可以创建后更改:altertable`data`engine=innodb; --查看表类型(存储引擎)data是数据库名称showtablestatusfrom`data`;----结果为数据库test中所有表的信息,其中第二项type即是表的类型。 --查看表类型(存储引擎)2message是表名称showcreatetable`data`;----结果为表message创建时的信息,其中有TYPE或ENGINE一项,指定了表的类型(存储引擎)。--showtables不能得到表类型的信息。 transaction方法//事务批量处理altertable`think_data`engine=innodb;//自动transaction方法都Db::transaction(function(){Db::table('think_data')->where('id',9)->update(['data'=>'transaction']);Db::table('think_data')->insert(['data'=>'transaction']);}); //手动控制事务Db::startTrans();try{Db::table('think_data')->where('id',3)->update(['data'=>'transaction']);Db::table('think_data')->insert(['data'=>'transaction']);Db::commit();//提交事务}catch(\Exception$e){Db::rollback();//回滚事务} //插入记录-用TP5的查询构造器方法//Db::table('think_data')->insert(['id'=>9,'data'=>'data']);Db::table('think_data')->update(['id'=>4,'data'=>'dae']);//插入记录-去掉表前缀config配置里的前缀Db::name('data')->insert(['id'=>900,'data'=>'data']);//插入记录-更加简单的写法$db=db('data');//插入记录$result1=$db->insertGetId(['data'=>'database']);dump($result1); //插入记录-返回ID的方法$data=['data'=>'tp5'];$result2=Db::name('data')->insertGetId($data);dump($result2);//返回数据库的ID //插入记录-插入多条的方法$data1=[['data'=>'dataTablesid'],['data'=>'dataTablesid3'],['data'=>'dataTablesid2']];$result3=$db->insertAll($data1);dump($result3);//返回插入数目//切换数据库$res=Db::connect('mysql://root:root@127.0.0.1:3306/demo#utf8')->query('showtables');dump($res); 增删改查 数据库update更新的四种写法 Db::startTrans();try{Db::execute('updatethink_datasetdata="hello"whereid<=5');Db::commit();}catch(\Exception$e){Db::rollback();}} fetch获取 驼峰访问加_在应用配置文件中设置://关闭URL自动转换(支持驼峰访问控制器)'url_convert'=>false,ThinkPHP/application/config.php 应用配置文件中的url_param_type//按照参数顺序获取'url_param_type'=>1,默认不安顺序按顺序绑定参数的话,操作方法的参数只能使用URLpathinfo变量,而不能使用get或者post变量。 隐藏index.php隐藏入口G:\phpStudy\WWW\thinkphp\public\.htaccess 'koo/[:name]'=>'index/koo', 二:采用动态定义路由规则的方式定义application/route.phpusethink\Route;Route::rule('hello/:name','index/hello'); 闭包定义{return[//定义闭包'hello/[:name]'=>function($name){return'Hello,'.$name.'!';},]; usethink\Route; Route::rule('hello/:name',function($name){return'Hello,'.$name.'!';}); usethink\facade\Route;Route::get('blog/:id','blog/get'); //输出blog/thinkphpUrl::build('blog/read','name=thinkphp');Url::build('blog/read',['name'=>'thinkphp']); 助手函数url来简化url('blog/read','name=thinkphp');//等效于Url::build('blog/read','name=thinkphp'); //添加hello路由标识Route::rule(['hello','hello/:name'],function($name){return'Hello,'.$name;});//根据路由标识快速生成URLUrl::build('hello','name=thinkphp');//或者使用Url::build('hello',['name'=>'thinkphp']); usethink\facade\Url; //添加hello路由标识Route::rule(['kt','kt/:name'],function($name){return'Hello,'.$name;});//根据路由标识快速生成URLUrl::build('kt','name=thinkphp');//或者使用Url::build('kt',['name'=>'thinkphp']);url('kt','name=thinkphp'); return[//全局变量规则定义'__pattern__'=>['name'=>'\w+',],'koo/[:name]$'=>'index/koo',//固定路由$完整匹配'[hello]'=>[':id'=>['index/hello',['method'=>'get'],['id'=>'\d+']],':name'=>['index/hello',['method'=>'post']],],]; //插入记录-用TP5的查询构造器方法//Db::table('think_data')->insert(['id'=>9,'data'=>'data']);Db::table('think_data')->update(['id'=>4,'data'=>'dae']);//插入记录-去掉表前缀config配置里的前缀Db::name('data')->insert(['data'=>'data']);//插入记录-更加简单的写法$db=db('data');//插入记录$result1=$db->insertGetId(['data'=>'database']);dump($result1); select Db::transaction(function(){$res=Db::query('select*fromthink_datawhereid<>9');//id<>9不等9var_dump($res);//var_dump查询类型var_dump无规律散乱dump整齐}); //查询数据field('id,data')范围$list=Db::name('data')->field('id,data')->where('id',9)->select();Db::execute|::queryDb::tableDb::namedb() 三.请求和响应requestresponse require包含 ThinkPHP5的Request对象由think\Request类完成。 usethink\Controller;echo'url:'.$this->request->url().' 使用助手函数echo'url:'.request()->url().' {自动注入请求对象如果没有继承think\Controller,则可以使用Request对象注入的方式来简化调用:phpnamespaceapp\index\controller;usethink\Request;classIndex{publicfunctionhello(Request$request,$name='World'){//获取当前URL地址不含域名echo'url:'.$request->url().' echo'GET参数:';dump($request->get());echo'GET参数:name';dump($request->get('name'));echo'POST参数:name';dump($request->post('name'));echo'cookie参数:name';dump($request->cookie('name'));echo'上传文件信息:image';dump($request->file('image'));} {获取变量的方法包括:方法作用param获取请求变量get获取$_GET变量post获取$_POST变量put获取PUT请求变量delete获取DELETE请求变量patch获取PATCH请求变量request获取$_REQUEST变量route获取路由(URL)变量session获取$_SESSION变量cookie获取$_COOKIE变量server获取$_SERVER变量env获取$_ENV变量file获取上传文件信息} dump($request->method());//请求方法dump($request->type());//资源类型dump($request->ip());//访问ipdump(var_export($request->isAjax(),true));//是否Ajax请求dump($request->param());//参数dump($request->only(['name']));//参数包namedump($request->except(['name']));//参数排除name {URL请求和信息方法可以总结如下:方法作用domain获取当前的域名url获取当前的完整URL地址baseUrl获取当前的URL地址,不含QUERY_STRINGbaseFile获取当前的SCRIPT_NAMEroot获取当前URL的root地pathinfo获取当前URL的pathinfo地址path获取当前URL的pathinfo地址,不含后缀ext获取当前URL的后缀type获取当前请求的资源类型scheme获取当前请求的schemequery获取当前URL地址的QUERY_STRINGhost获取当前URL的host地址port获取当前URL的port号protocol获取当前请求的SERVER_PROTOCOLremotePort获取当前请求的REMOTE_POR} dump($request->module());//当前模块dump($request->controller());//控制器dump($request->action());//操作信息dump($request->routeInfo());//路由信息dump($request->dispatch());//调度信息 {修改配置文件,添加://默认输出类型'default_return_type'=>'json',return['name'=>'koo']修改输出类型为xml://默认输出类型'default_return_type'=>'xml', $data=['name'=>'hello','id'=>'1'];xml($data,404);json($data)->code(404)->header(['Cache-control'=>'no-cache,must-revalidate']);returnjson($data,404,['Cache-control'=>'no-cache,must-revalidate']); 引入了一个Jumptrait,这是PHP5.4版本的新特性,如果你的控制器类是继承的\think\Controller的话,系统已经自动为你引入了\traits\controller\Jump,无需再次引入 数据库删除5db('data')->where('id','<',2)->delete();//根据主键deldb('data')->delete(1);db('data')->delete([1,8,9]); 模板调用快速入门源码 模板入门调用模板,美工设计和程序分工协助VC模式 //模板输出-指定模板文件名//G:\phpStudy\WWW\thinkphp\application\index\view\index\kali.htmlreturn$this->fetch('kali');//模板输出-使用默认控制器的名字//G:\phpStudy\WWW\thinkphp\application\index\view\index\index.htmlfetch()不带值//return$this->fetch();}}} //或者批量赋值覆写前面namehtml调用用前面name{$name}//数组赋值{$data.name}//模板输出-指定模板文件名//G:\phpStudy\WWW\thinkphp\application\index\view\index\kali.htmlreturn$this->fetch('kali');//模板输出-使用默认控制器的名字//G:\phpStudy\WWW\thinkphp\application\index\view\index\index.htmlfetch()不带值//return$this->fetch(); 三方法:$this->assign('name','hellowrold');$this->assign(['tel'=>'120','phone'=>'apple']);//$data['dog']='long';$data=['dog'=>'longlong'];$this->assign('data',$data);return$this->fetch();四方法://fetch('现实html',[$name=>value])省assignreturn$this->fetch('index',['name'=>'hello']); 没有viewhtmlcreate //不带值不调用默认url没有arguments$this->assign('name');publicfunctionindex(Request$request,$name='world')//不带值不调用默认url没有arguments//+$name才用 视图实例化视图功能由\think\View类配合视图驱动(模板引擎)类一起完成,目前的内置模板引擎包含PHP原生模板和Think模板引擎。 继承\think\Controller类 //渲染模板输出return$this->fetch('hello',['name'=>'thinkphp']); 方法说明fetch渲染模板输出display渲染内容输出assign模板变量赋值engine初始化模板引擎 engine发动机引擎 $this->view对象:助手函数returnview('hello',['name'=>'thinkphp']);无需继承think\Controllerview('[模板文件]'[,'模板变量(数组)'][,模板替换(数组)]){//return先遇到的马上返回不执行后面//view()组手函数=fetch()returnview('index',['name'=>'view']);} 芒果kphp 内置模板引擎应用配置文件中配置template参数即可,例如:{'template'=>[//模板引擎类型支持phpthink支持扩展'type'=>'Think',//模板路径'view_path'=>'./template/',//模板后缀'view_suffix'=>'html',//模板文件名分隔符'view_depr'=>DS,//模板引擎普通标签开始标记'tpl_begin'=>'{',//模板引擎普通标签结束标记'tpl_end'=>'}',//标签库标签开始标记'taglib_begin'=>'{',//标签库标签结束标记'taglib_end'=>'}',],} 调用engine方法初始化视图类也提供了engine方法对模板解析引擎进行初始化或者切换不同的模板引擎return$this->engine('php')->fetch();表示当前视图的模板文件使用原生php进行解析。 display均可传入模版变量$content='{$name}-{$email}';return$this->display($content,['name'=>'ThinkPHP','email'=>'thinkphp@qq.com']); share方法V5.0.4+开始,支持在任何地方使用静态方法进行模板变量赋值think\View::share('name','value');//或者批量赋值think\View::share(['name1'=>'value','name2'=>'value2']);全局静态模板变量最终会和前面使用方法赋值的模板变量合并。 渲染模板最常用的是继承系统的控制器基类后调用fetch方法,调用格式:fetch('[模板文件]'[,'模板变量(数组)'])用法描述不带任何参数自动定位当前操作的模板文件[模块@][控制器/][操作]常用写法,支持跨模块完整的模板文件名直接使用完整的模板文件名(包括模板后缀) 当前模块/默认视图目录/当前控制器(小写)/当前操作(小写).html return$this->fetch('member/read');表示调用Member控制器下面的read模板。G:\phpStudy\WWW\thinkphp\application\index\view\directory\index.htmlG:\phpStudy\WWW\thinkphp\application\index\view\index\index.html return$this->fetch('/directory/index');//G:\phpStudy\WWW\thinkphp\application\index\view\directory\index.html 跨模块渲染模板return$this->fetch('admin@member/edit'); 渲染输出不需要写模板文件的路径和后缀。这里面的控制器和操作并不一定需要有实际对应的控制器和操作,只是一个目录名称和文件名称而已,例如,你的项目里面可能根本没有Public控制器,更没有Public控制器的menu操作,但是一样可以使用return$this->fetch('public/menu'); 支持从视图根目录开始读取模板,例如:$this->fetch('/menu');当前模块/默认视图目录/menu.html 渲染完整模板return$this->fetch('./template/public/menu.html'); 其他的后缀文件,也支持直接输出,例如:return$this->fetch('./template/public/menu.tpl'); 增加__ROOT____STATIC____JS__和__CSS__内置替换规则输出替换视图输出的内容进行字符替换$this->assign('name','thinkphp');return$this->fetch('index',[],['__PUBLIC__'=>'/public/']); 如果需要全局替换的话,可以直接在配置文件中添加:'view_replace_str'=>['__PUBLIC__'=>'/public/','__ROOT__'=>'/',] 助手函数view也支持全局配置参数view_replace_str的设置,如果需要设置不同的替换参数,可以使用:returnview('index',['name'=>'thinkphp'],['__PUBLIC__'=>'/public/']);在渲染模板或者内容输出的时候就会自动根据设置的替换规则自动替换。 分页输出可以很简单的输出用户的分页数据,控制器index方法修改为$list=UserModel::paginate(3);$this->assign('list',$list);return$this->fetch(); viewhtml导入kali.html{includefile="index/kali"title="$title"/} //模板路径'view_path'=>'../template/index/', //视图输出内容字符替换return$this->fetch('index',[],['__PUBLIC__'=>'/public/']); return$this->fetch('directory/index');//G:\phpStudy\WWW\thinkphp\application\index\view\directory\index.html //return先遇到的马上返回不执行后面//view()组手函数=fetch()returnview('index',['name'=>'view'],['__PUBLIC__'=>'/public/']);return$this->fetch();//fetch('现实html',[$name=>value])省assignreturn$this->fetch('index',['name'=>'hello']);//display均可传入模版变量$content='{$name}';return$this->display($content,['name'=>'display']);}} 模板和数据库组合操作入门 exit()退出后面不执行 viewhtml{$list.0.name}二维数组+key0 视图+数据库组合操作入门 ThinkPHP内置了一个基于XML的性能卓越的模板引擎,这是一个专门为ThinkPHP服务的内置模板引擎,使用了XML标签库技术的编译型模板引擎,支持两种类型的模板标签,使用了动态编译和缓存技术,而且支持自定义标签库。 标签类型描述普通标签主要用于输出变量、函数过滤和做一些基本的运算操作XML标签也称为标签库标签,主要完成一些逻辑判断、控制和循环输出,并且可扩展 普通标签普通标签用于变量输出和模板注释,普通模板标签默认以{和}作为开始和结束标识,并且在开始标记紧跟标签的定义,如果之间有空格或者换行则被视为非模板标签直接输出。例如:{$name}、{$vo.name}、{$vo['name']|strtoupper}都属于正确的标签,而{$name}、{$vo.name}则不属于。 要更改普通标签的起始标签和结束标签,可以更改template.php中的配置参数: //普通标签开始标记'tpl_begin'=>'<{',//普通标签结束标记'tpl_end'=>'}>' 普通标签的定界符就被修改了,原来的{$name}和{$vo.name}必须使用<{$name}>和<{$vo.name}>才能生效了。 {//标签库标签开始标签'taglib_begin'=>'<',//标签库标签结束标记'taglib_end'=>'>',{eqname="name"value="value"}相等{else/}不相等{/eq}复制就需要改成 模板标签的{}和$之间不能有任何的空格,否则标签无效 一个对象{$data->name} 常量:{$data::CONST_NAME}方法:{$data->fun()} 使用默认值{$user.name|default="default"} 默认值和函数可以同时使用,例如:{$Think.get.name|getName|default="名称为空"} 系统变量输出普通的模板变量需要首先赋值后才能在模板中输出,但是系统变量则不需要,可以直接在模板中输出,系统变量的输出通常以{$Think.}(大小写一致)打头,例如:{$Think.server.script_name}//输出$_SERVER['SCRIPT_NAME']变量{$Think.session.user_id}//输出$_SESSION['user_id']变量{$Think.get.page}//输出$_GET['page']变量{$Think.cookie.name}//输出$_COOKIE['name']变量复制支持输出$_SERVER、$_ENV、$_POST、$_GET、$_REQUEST、$_SESSION和$_COOKIE变量。 还可以输出常量{$Think.const.PHP_VERSION} 输出配置参数使用:{$Think.config.default_module}{$Think.config.default_controller} 输出语言变量可以使用:{$Think.lang.page_error}{$Think.lang.var_error} 请求变量模板支持直接输出Request请求对象的方法参数,用法如下:$Request.方法名.参数{//调用Request对象的get方法传入参数为id{$Request.get.id}//调用Request对象的param方法传入参数为name{$Request.param.name}//调用Request对象的param方法传入参数为user.nickname{$Request.param.user.nickname}//调用Request对象的root方法{$Request.root}//调用Request对象的root方法,并且传入参数true{$Request.root.true}//调用Request对象的path方法{$Request.path}//调用Request对象的module方法{$Request.module}//调用Request对象的controller方法{$Request.controller}//调用Request对象的action方法{$Request.action}//调用Request对象的ext方法{$Request.ext}//调用Request对象的host方法{$Request.host}//调用Request对象的ip方法{$Request.ip}//调用Request对象的header方法{$Request.header.accept-encoding}} 需要对模板输出使用函数进行过滤或其它处理的时候,可以使用:{$data.name|md5}{$data.name|md5} 如果你不需要转义(例如你需要输出html表格等内容),可以使用:{$data.name|raw} {$data.create_time|date='Y-m-dH:i'}{$data.number|format='%02d'} {$data.name|substr=0,3}多个函数过滤{$name|md5|strtoupper|substr=0,3}{:substr(strtoupper(md5($name)),0,3)} 可以在模板中直接使用系统的助手函数进行输出{:app('cache')->get('name')}表示调用容器中的think\Cache对象实例输出name缓存标识内容。{:}开头的变量输出表示调用函数或者类的方法及属性,如果你要带命名空间调用类的属性,例如:{:think\\App::VERSION}{:think\\facade\\Request::get('name')}类的命名空间中的\需要改成\\才能正常调用。 运算符使用示例+{$a+$b}-{$a-$b}*{$a*$b}/{$a/$b}%{$a%$b}++{$a++}或{++$a}--{$a--}或{--$a}综合运算{$a+$b*10+$c} 模板可以支持三元运算符,例如:{$status'正常':'错误'}{$info['status']$info['msg']:$info['error']}{$info.status$info.msg:$info.error} {$name'默认值'}表示如果有设置$name则输出$name,否则输出默认值。 {$name='默认值'}表示$name为真时才输出默认值。 {$name:'NO'}表示如果$name为真则输出$name,否则输出NO。 {$a==$b'yes':'no'}前面的表达式为真输出yes,否则输出no,条件可以是==、===、!=、!==、>=、<= 原样输出{可以使用literal标签来防止模板标签被解析,例如: {literal}Hello,{$name}!{/literal}上面的{$name}标签被literal标签包含,因此并不会被模板引擎解析,而是保持原样输出。 literal标签还可以用于页面的JS代码外层,确保JS代码中的某些用法和模板引擎不产生混淆。 总之,所有可能和内置模板引擎的解析规则冲突的地方都可以使用literal标签处理。} 模板注释{/*注释内容*/}或{//注释内容} 模板布局看别人打全局配置方式return['layout_on'=>true,'layout_name'=>'layout',]模板标签方式{layoutname="layout"/}动态方法布局$this->view->engine->layout(true);return$this->fetch('add');例如全局配置已经开启了布局,可以在某个页面单独关闭$this->view->engine->layout(false); 模板继承的优势其实是设计基础模板中的区块(block)和子模板中替换这些区块。{blockname="title"} {extend标签的用法和include标签一样,你也可以加载其他模板:{extendname="Public:base"/}}绝对文件路径加载{extendname="./Template/Public/base.html"/} {{extendname="./base.html"/}{blockname="title"}{$title}{/block}{blockname="menu"}首页{/block} {blockname="left"}{/block} {blockname="main"}{volistname="list"id="val"}{$val.id}=>{$val.data} {blockname="right"}{/block} {blockname="footer"}{__block__}@ThinkPHP{/block}} 包含文件{includefile='模版文件1,模版文件2,...'/}模版表达式的定义规则为:模块@控制器/操作{includefile="public/header"/}//包含头部模版header{includefile="public/menu"/}//包含菜单模版menu{includefile="blue/public/menu"/}//包含blue主题下面的menu模版一次包含多个模版{includefile="public/header,public/menu"/}直接包含一个模版文件名(包含完整路径),例如:{includefile="../application/view/default/public/header.html"/} 模板输出替换如果需要全局替换的话,可以直接在template.php配置文件中添加:'tpl_replace_string'=>['__STATIC__'=>'/static','__JS__'=>'/static/javascript',] 标签库 导入标签库{taglibname="html"/}多个{taglibname="html,article"/}{article:readname="hello"id="data"}{$data.id}:{$data.title}{/article:read}{article:readname="hello"/}就是开放标签。 内置标签无需导入即可使用{{eqname="status"value="1"}正常{/eq}复制如果Cx不是内置标签的话,可能就需要这么使用了: {cx:eqname="status"value="1"}正常{/cx:eq}} 标签库预加载{在应用或者模块的配置文件中添加: 'taglib_pre_load'=>'article,html'设置后,模板文件就不再需要使用 {taglibname="html,article"/}} 内置标签{ 循环标签{foreach$listas$key=>$vo}{$vo.id}:{$vo.name}{/foreach} 可以不通过模板变量赋值,支持使用函数或者方法获取数据循环输出:{foreach:model('user')->all()as$key=>$vo}{$vo.id}:{$vo.name}{/foreach} VOLIST标签volist标签通常用于查询数据集或者二维数组的结果输出。在控制器中首先对模版赋值:{volistname="list"id="data"}{$data.id}:{$data.name} 可以直接使用函数设定数据集,而不需要在控制器中给模板变量赋值传入数据集变量,如:{volistname=":model('user')->all()"id="vo"}{$vo.name}{/volist} 支持输出查询结果中的部分数据,例如输出其中的第5~15条记录{volistname="list"id="vo"offset="5"length='10'}{$vo.name}{/volist} 输出偶数记录{volistname="list"id="vo"mod="2"}{eqname="mod"value="1"}{$vo.name}{/eq}{/volist} 为空的时候输出提示:{volistname="list"id="vo"empty="暂时没有数据"} 输出循环变量:{volistname="list"id="vo"key="k"}{$k}.{$vo.name}{/volist} 果没有指定key属性的话,默认使用循环变量i,例如:{volistname="list"id="vo"}{$i}.{$vo.name}{/volist} FOR标签{forstart="开始值"end="结束值"comparison=""step="步进值"name="循环变量名"}{/for}开始值、结束值、步进值和循环变量都可以支持变量,开始值和结束值是必须,其他是可选。comparison的默认值是lt,name的默认值是i,步进值的默认值是1,举例如下:{forstart="1"end="100"}{$i}{/for}解析后的代码是for($i=1;$i<100;$i+=1){echo$i;} 比较标签{比较标签name="变量"value="值"}内容{/比较标签} { 标签含义eq或者equal等于neq或者notequal不等于gt大于egt大于等于lt小于elt小于等于heq恒等于nheq不恒等于} {eqname="name"value="value"}value{/eq} {else/} 当name变量的值大于5就输出{gtname="name"value="5"}value{/gt} 所有的比较标签可以统一使用compare标签(其实所有的比较标签都是compare标签的别名),例如:当name变量的值等于5就输出{comparename="name"value="5"type="eq"}value{/compare}{eqname="name"value="5"}value{/eq} 条件判断SWITCH标签{switch变量}{casevalue1}输出内容1{/case}{casevalue2}输出内容2{/case}{default/}默认情况{/switch} {casegif|png|jpg}图像格式{/case} IF标签{if表达式}value1{elseif表达式/}value2{else/}value3{/if} {if($name==1)OR($name>100)}value1 范围判断范围判断标签包括in/notin/between/notbetween四个标签,都用于判断变量是否中某个范围。 $id=1;$this->assign('id',$id);IN和NOTIN我们可以使用in标签来判断模板变量是否在某个范围内,例如:{inname="id"value="1,2,3"}id在范围内{/in} 如果判断不在某个范围内,可以使用notin标签:{notinname="id"value="1,2,3"}id不在范围内{/notin} {inname="id"value="1,2,3"}id在范围内{else/}id不在范围内{/in} BETWEEN和NOTBETWEENbetween标签来判断变量是否在某个区间范围内{betweenname="id"value="1,10"}输出内容1{/between} notbetween标签来判断变量不在某个范围内{notbetweenname="id"value="1,10"}输出内容2{/notbetween} 可以使用else标签把两个用法合并,例如:{betweenname="id"value="1,10"}输出内容1{else/}输出内容2{/between} {betweenname="id"value="A,Z"}{betweenname="Think.post.id"value="1,5"}{betweenname="id"value="$range"} PRESENT/NOTPRESENT标签present标签用于判断某个变量是否已经定义,用法:{presentname="name"}name已经赋值{/present}复制如果判断没有赋值,可以使用: {notpresentname="name"}name还没有赋值{/notpresent}可以把上面两个标签合并成为:{presentname="name"}name已经赋值{else/}name还没有赋值{/present} EMPTY/NOTEMPTY标签empty标签用于判断某个变量是否为空{emptyname="name"}name为空值{/empty}复制如果判断没有赋值,可以使用: {notemptyname="name"}name不为空{/notempty}可以把上面两个标签合并成为: {emptyname="name"}name为空{else/}name不为空{/empty} DEFINED标签DEFINED标签用于判断某个常量是否有定义,用法如下:{definedname="NAME"}NAME常量已经定义{/defined} 如果判断没有被定义,可以使用:{notdefinedname="NAME"}NAME常量未定义{/notdefined}可以把上面两个标签合并成为: {definedname="NAME"}NAME常量已经定义{else/}NAME常量未定义{/defined} 标签嵌套系统内置的标签中,volist、switch、if、elseif、else、foreach、compare(包括所有的比较标签)、(not)present、(not)empty、(not)defined等标签都可以嵌套使用 原生PHP{php}echo'Hello,world!';{/php}php标签或者php代码里面就不能再使用标签(包括普通标签和XML标签)了,因此下面的几种方式都是无效的:设置了tpl_deny_php参数为true,就不能在模板中使用原生的PHP代码,但是仍然支持PHP标签输出。 定义标签ASSIGN标签ASSIGN标签用于在模板文件中定义变量,用法如下:{assignname="var"value="123"/}在运行模板的时候,赋值了一个var的变量,值是123。var=123 DEFINE标签DEFINE标签用于中模板中定义常量,用法如下:{definename="MY_DEFINE_NAME"value="3"/}在运行模板的时候,就会定义一个MY_DEFINE_NAME的常量。 标签扩展自定义标签建议开发者将自定义标签库请放置应用目录中,请勿放在框架系统目录内,以免使用Composer更新框架时导致自定义标签库的丢失usethink\template\TagLib;classDemoextendsTagLib 这时候我们的控制器继承Controller,在配置参数中配置:在控制器中对模版赋值:在模版中调用我们已经预先加载的标签:
'.$hi->demo();}}//class.name=file.nameclassHelloWorldurl:hello_world}
';
';
';return'Hello,'.$name.'!';}}获取请求变量系统推荐使用param方法统一获取当前请求变量,该方法最大的优势是让你不需要区分当前请求类型而使用不同的全局变量或者方法,并且可以满足大部分的参数需求,下面举一个例子。{echo'请求参数:';dump($request->param());echo'name:'.$request->param('name');}
{/volist}{/block}
{/volist}Volist标签的name属性表示模板赋值的变量名称,因此不可随意在模板文件中改变。id表示当前的循环变量,可以随意指定,但确保不要和name属性冲突