<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>递归 &#8211; 个人随笔</title>
	<atom:link href="/label/%E9%80%92%E5%BD%92/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description></description>
	<lastBuildDate>Sat, 19 May 2018 06:12:53 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.1</generator>

<image>
	<url>/wp-content/uploads/2022/01/cropped-截屏2022-01-01-18.57.09-32x32.png</url>
	<title>递归 &#8211; 个人随笔</title>
	<link>/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>博客项目（三）文件上传、管理员、更改个人信息、递归、无限极联动</title>
		<link>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/2824.html</link>
					<comments>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/2824.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 06:12:53 +0000</pubDate>
				<category><![CDATA[后台框架]]></category>
		<category><![CDATA[源码Blog项目]]></category>
		<category><![CDATA[文件上传]]></category>
		<category><![CDATA[无限极联动]]></category>
		<category><![CDATA[更改个人信息]]></category>
		<category><![CDATA[管理员]]></category>
		<category><![CDATA[递归]]></category>
		<guid isPermaLink="false">/?p=2824</guid>

					<description><![CDATA[博客项目（三） 在项目中封装文件上传 在Lib文件夹下创建Upload.class.php页面 &#60;?ph [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>博客项目（三）</h1>
<h2>在项目中封装文件上传</h2>
<ol>
<li>
  在Lib文件夹下创建Upload.class.php页面
</li>
</ol>
<p>
  &lt;?php
</p>
<p>
  namespace Lib;
</p>
<p>
  class Upload{
</p>
<p>
      private $path;  //文件上传路径
</p>
<p>
      private $size;  //文件允许大小
</p>
<p>
      private $type;  //文件允许上传的类型
</p>
<p>
      private $error; //保存错误信息
</p>
<p>
      public function __construct(){
</p>
<p>
          $this-&gt;path=$GLOBALS[&#8216;config&#8217;][&#8216;app&#8217;][&#8216;upload_path&#8217;];
</p>
<p>
          $this-&gt;size=$GLOBALS[&#8216;config&#8217;][&#8216;app&#8217;][&#8216;upload_size&#8217;];
</p>
<p>
          $this-&gt;type=$GLOBALS[&#8216;config&#8217;][&#8216;app&#8217;][&#8216;upload_type&#8217;];
</p>
<p>
      }
</p>
<p>
      public function getError(){
</p>
<p>
          return $this-&gt;error;
</p>
<p>
      }
</p>
<p>
      /*
</p>
<p>
       * 文件上传的方法
</p>
<p>
       * @param $file array $_FIELS[]
</p>
<p>
       */
</p>
<p>
      public function uploadOne($file){
</p>
<p>
          if(!$this-&gt;checkError($file)){     //验证上传过程是否有误
</p>
<p>
              return false;
</p>
<p>
          }
</p>
<p>
          if(!$this-&gt;checkType($file)){       //验证格式
</p>
<p>
              return false;
</p>
<p>
          }
</p>
<p>
          if(!$this-&gt;checkSize($file)){       //验证大小
</p>
<p>
              return false;
</p>
<p>
          }
</p>
<p>
          if(!$this-&gt;checkHttpPost($file)){    //验证文件是否是http的post上传
</p>
<p>
              return false;
</p>
<p>
          }
</p>
<p>
          //创建文件夹
</p>
<p>
          $foldername=date(&#8216;Y-m-d&#8217;);      //文件夹名
</p>
<p>
          $folderpath=  $this-&gt;path.$foldername;  //文件夹路径
</p>
<p>
          if(!file_exists($folderpath))
</p>
<p>
              mkdir ($folderpath);
</p>
<p>
          //文件上传
</p>
<p>
          $filename=  uniqid(&#8221;,true).strtolower(strrchr($file[&#8216;name&#8217;],&#8217;.&#8217;));  //文件名
</p>
<p>
          $filepath=  $folderpath.DS.$filename;   //文件路径
</p>
<p>
          if(move_uploaded_file($file[&#8216;tmp_name&#8217;], $filepath))
</p>
<p>
                  return $foldername.&#8217;/&#8217;.$filename;
</p>
<p>
          else{
</p>
<p>
              $this-&gt;error=&#8217;文件上传失败&#8217;;
</p>
<p>
              return false;
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
      //检查上传过程中是否有误
</p>
<p>
      private function checkError($file){
</p>
<p>
          //$file[&#8216;error&#8217;]!=0表示文件上传有误
</p>
<p>
          if($file[&#8216;error&#8217;]!=0){
</p>
<p>
              switch ($file[&#8216;error&#8217;]){
</p>
<p>
                  case 1:
</p>
<p>
                      $this-&gt;error=&#8217;上传文件超出了PHP配置文件允许的最大值&#8217;;
</p>
<p>
                      break;
</p>
<p>
                  case 2:
</p>
<p>
                      $this-&gt;error=&#8217;上传文件超出了表单允许的最大值&#8217;;
</p>
<p>
                      break;
</p>
<p>
                  case 3:
</p>
<p>
                      $this-&gt;error=&#8217;只有部分文件上传&#8217;;
</p>
<p>
                      break;
</p>
<p>
                  case 4:
</p>
<p>
                      $this-&gt;error=&#8217;上传文件为空&#8217;;
</p>
<p>
                      break;
</p>
<p>
                  case 6:
</p>
<p>
                      $this-&gt;error=&#8217;找不到临时文件&#8217;;
</p>
<p>
                      break;
</p>
<p>
                  case 7:
</p>
<p>
                      $this-&gt;error=&#8217;文件写入失败&#8217;;
</p>
<p>
                      break;
</p>
<p>
                  default:
</p>
<p>
                      $this-&gt;error=&#8217;未知错误&#8217;;
</p>
<p>
              }
</p>
<p>
              return false;
</p>
<p>
          }
</p>
<p>
          return true;
</p>
<p>
      }
</p>
<p>
      //验证上传格式
</p>
<p>
      private function checkType($file){
</p>
<p>
          $finfo=  finfo_open(FILEINFO_MIME);
</p>
<p>
          $info=finfo_file($finfo, $file[&#8216;tmp_name&#8217;]);
</p>
<p>
          $info_array=  explode(&#8216;;&#8217;, $info); //分割
</p>
<p>
          if(!in_array($info_array[0], $this-&gt;type)){
</p>
<p>
              $this-&gt;error=&#8217;文件类型上传错误，只能允许：&#8217;.implode(&#8216;,&#8217;, $this-&gt;type);  //转化字符串
</p>
<p>
              return false;
</p>
<p>
          }
</p>
<p>
          return true;
</p>
<p>
      }
</p>
<p>
      //验证大小
</p>
<p>
      private function checkSize($file){
</p>
<p>
          if($file[&#8216;size&#8217;]&gt;$this-&gt;size){
</p>
<p>
              $this-&gt;error=&#8217;文件不能操作&#8217;.  number_format($this-&gt;size/1024,1).&#8217;K&#8217;;
</p>
<p>
              return false;
</p>
<p>
          }
</p>
<p>
          return true;
</p>
<p>
      }
</p>
<p>
      //验证是否是http的post上传
</p>
<p>
      private function checkHttpPost($file){
</p>
<p>
          if(!is_uploaded_file($file[&#8216;tmp_name&#8217;])){
</p>
<p>
              $this-&gt;error=&#8217;文件必须是HTTP上传&#8217;;
</p>
<p>
              return false;
</p>
<p>
          }
</p>
<p>
          return true;
</p>
<p>
      }
</p>
<p>
  }
</p>
<ol>
<li>
  在config.php配置中，配置文件上传的信息
</li>
</ol>
<p><img fetchpriority="high" decoding="async" width="1148" height="175" src="/wp-content/uploads/2018/05/word-image-2481.png" class="wp-image-2826" srcset="/wp-content/uploads/2018/05/word-image-2481.png 1148w, /wp-content/uploads/2018/05/word-image-2481-300x46.png 300w, /wp-content/uploads/2018/05/word-image-2481-768x117.png 768w, /wp-content/uploads/2018/05/word-image-2481-1024x156.png 1024w" sizes="(max-width: 1148px) 100vw, 1148px" /></p>
<h2>在用户注册中上传头像</h2>
<p>
  完善LoginController控制器中的register()方法
</p>
<p><img decoding="async" width="1300" height="430" src="/wp-content/uploads/2018/05/word-image-2482.png" class="wp-image-2827" srcset="/wp-content/uploads/2018/05/word-image-2482.png 1300w, /wp-content/uploads/2018/05/word-image-2482-300x99.png 300w, /wp-content/uploads/2018/05/word-image-2482-768x254.png 768w, /wp-content/uploads/2018/05/word-image-2482-1024x339.png 1024w" sizes="(max-width: 1300px) 100vw, 1300px" /></p>
<h2>登录成功后显示头像</h2>
<p><img decoding="async" width="1314" height="175" src="/wp-content/uploads/2018/05/word-image-2483.png" class="wp-image-2828" srcset="/wp-content/uploads/2018/05/word-image-2483.png 1314w, /wp-content/uploads/2018/05/word-image-2483-300x40.png 300w, /wp-content/uploads/2018/05/word-image-2483-768x102.png 768w, /wp-content/uploads/2018/05/word-image-2483-1024x136.png 1024w" sizes="(max-width: 1314px) 100vw, 1314px" /></p>
<p>
  运行结果
</p>
<p><img loading="lazy" decoding="async" width="494" height="193" src="/wp-content/uploads/2018/05/word-image-2484.png" class="wp-image-2829" srcset="/wp-content/uploads/2018/05/word-image-2484.png 494w, /wp-content/uploads/2018/05/word-image-2484-300x117.png 300w" sizes="(max-width: 494px) 100vw, 494px" /></p>
<h2>管理员登录后显示用户列表</h2>
<ol>
<li>
  在Controller\Admin文件夹下创建UserController.class.php页面
</li>
</ol>
<p><img loading="lazy" decoding="async" width="966" height="377" src="/wp-content/uploads/2018/05/word-image-2485.png" class="wp-image-2830" srcset="/wp-content/uploads/2018/05/word-image-2485.png 966w, /wp-content/uploads/2018/05/word-image-2485-300x117.png 300w, /wp-content/uploads/2018/05/word-image-2485-768x300.png 768w" sizes="(max-width: 966px) 100vw, 966px" /></p>
<ol>
<li>
  在View/Admin目录下的user_list.html中循环取出普通用户
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1184" height="296" src="/wp-content/uploads/2018/05/word-image-2486.png" class="wp-image-2831" srcset="/wp-content/uploads/2018/05/word-image-2486.png 1184w, /wp-content/uploads/2018/05/word-image-2486-300x75.png 300w, /wp-content/uploads/2018/05/word-image-2486-768x192.png 768w, /wp-content/uploads/2018/05/word-image-2486-1024x256.png 1024w" sizes="(max-width: 1184px) 100vw, 1184px" /></p>
<ol>
<li>
  在menu.html中，点击“用户管理”跳转到user_list页面中
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1157" height="227" src="/wp-content/uploads/2018/05/word-image-2487.png" class="wp-image-2832" srcset="/wp-content/uploads/2018/05/word-image-2487.png 1157w, /wp-content/uploads/2018/05/word-image-2487-300x59.png 300w, /wp-content/uploads/2018/05/word-image-2487-768x151.png 768w, /wp-content/uploads/2018/05/word-image-2487-1024x201.png 1024w" sizes="(max-width: 1157px) 100vw, 1157px" /></p>
<ol>
<li>
  运行结果
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1344" height="196" src="/wp-content/uploads/2018/05/word-image-2488.png" class="wp-image-2833" srcset="/wp-content/uploads/2018/05/word-image-2488.png 1344w, /wp-content/uploads/2018/05/word-image-2488-300x44.png 300w, /wp-content/uploads/2018/05/word-image-2488-768x112.png 768w, /wp-content/uploads/2018/05/word-image-2488-1024x149.png 1024w" sizes="(max-width: 1344px) 100vw, 1344px" /></p>
<h2>管理员删除普通用户</h2>
<ol>
<li>
  在UserController.class.php页面中，添加接受删除用户的请求
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1196" height="357" src="/wp-content/uploads/2018/05/word-image-2489.png" class="wp-image-2834" srcset="/wp-content/uploads/2018/05/word-image-2489.png 1196w, /wp-content/uploads/2018/05/word-image-2489-300x90.png 300w, /wp-content/uploads/2018/05/word-image-2489-768x229.png 768w, /wp-content/uploads/2018/05/word-image-2489-1024x306.png 1024w" sizes="(max-width: 1196px) 100vw, 1196px" /></p>
<ol>
<li>
  在user_list中，点击“删除”
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1172" height="173" src="/wp-content/uploads/2018/05/word-image-2490.png" class="wp-image-2835" srcset="/wp-content/uploads/2018/05/word-image-2490.png 1172w, /wp-content/uploads/2018/05/word-image-2490-300x44.png 300w, /wp-content/uploads/2018/05/word-image-2490-768x113.png 768w, /wp-content/uploads/2018/05/word-image-2490-1024x151.png 1024w" sizes="(max-width: 1172px) 100vw, 1172px" /></p>
<h2>更改个人信息</h2>
<h3>显示个人信息</h3>
<p>
  模型
</p>
<p>
  无
</p>
<p>
  控制器（UserController）
</p>
<p><img loading="lazy" decoding="async" width="991" height="325" src="/wp-content/uploads/2018/05/word-image-2491.png" class="wp-image-2836" srcset="/wp-content/uploads/2018/05/word-image-2491.png 991w, /wp-content/uploads/2018/05/word-image-2491-300x98.png 300w, /wp-content/uploads/2018/05/word-image-2491-768x252.png 768w" sizes="(max-width: 991px) 100vw, 991px" /></p>
<p>
  视图（user_edit.html）
</p>
<p><img loading="lazy" decoding="async" width="852" height="139" src="/wp-content/uploads/2018/05/word-image-2492.png" class="wp-image-2837" srcset="/wp-content/uploads/2018/05/word-image-2492.png 852w, /wp-content/uploads/2018/05/word-image-2492-300x49.png 300w, /wp-content/uploads/2018/05/word-image-2492-768x125.png 768w" sizes="(max-width: 852px) 100vw, 852px" /></p>
<p>
  点击menu.html中的“个人设置”
</p>
<p><img loading="lazy" decoding="async" width="1056" height="208" src="/wp-content/uploads/2018/05/word-image-2493.png" class="wp-image-2838" srcset="/wp-content/uploads/2018/05/word-image-2493.png 1056w, /wp-content/uploads/2018/05/word-image-2493-300x59.png 300w, /wp-content/uploads/2018/05/word-image-2493-768x151.png 768w, /wp-content/uploads/2018/05/word-image-2493-1024x202.png 1024w" sizes="(max-width: 1056px) 100vw, 1056px" /></p>
<p>
  运行结果
</p>
<p><img loading="lazy" decoding="async" width="816" height="338" src="/wp-content/uploads/2018/05/word-image-2494.png" class="wp-image-2839" srcset="/wp-content/uploads/2018/05/word-image-2494.png 816w, /wp-content/uploads/2018/05/word-image-2494-300x124.png 300w, /wp-content/uploads/2018/05/word-image-2494-768x318.png 768w" sizes="(max-width: 816px) 100vw, 816px" /></p>
<h3>更改个人信息</h3>
<p>
  在UserController的edit()方法中，更改个人信息
</p>
<p>
  public function editAction(){
</p>
<p>
      $id=$_SESSION[&#8216;user&#8217;][&#8216;user_id&#8217;];
</p>
<p>
      $model=new \Model\UserModel();
</p>
<p>
      //更改个人信息
</p>
<p>
      if(!empty($_POST)){
</p>
<p>
          if(!empty($_POST[&#8216;password&#8217;]))      //更改密码
</p>
<p>
              $data[&#8216;user_pwd&#8217;]=md5($_POST[&#8216;password&#8217;]);
</p>
<p>
          if($_FILES[&#8216;face&#8217;][&#8216;error&#8217;]!=4){    //更改头像
</p>
<p>
              $upload=new \Lib\Upload();
</p>
<p>
               if(!$data[&#8216;user_face&#8217;]=$upload-&gt;uploadOne($_FILES[&#8216;face&#8217;]))
</p>
<p>
                   $this-&gt;error (&#8216;index.php?p=Admin&amp;c=User&amp;a=edit&#8217;,$upload-&gt;getError ());
</p>
<p>
               //删除原来的头像
</p>
<p>
               $old_face=$GLOBALS[&#8216;config&#8217;][&#8216;app&#8217;][&#8216;upload_path&#8217;].$_SESSION[&#8216;user&#8217;][&#8216;user_face&#8217;];
</p>
<p>
               if(file_exists($old_face))
</p>
<p>
                   unlink ($old_face);
</p>
<p>
          }
</p>
<p>
          //如果有$data就说明需要修改
</p>
<p>
          if(isset($data)){
</p>
<p>
              $data[&#8216;user_id&#8217;]=$id;
</p>
<p>
              if($model-&gt;update($data)){
</p>
<p>
                  session_destroy();
</p>
<p>
                  echo &#8216;&lt;div style=&#8221;text-align:center&#8221;&gt;修改成功，重新登录&lt;/div&gt;&#8217;;
</p>
<p>
                  echo &lt;&lt;&lt;str
</p>
<p>
  &lt;script type=&#8221;text/javascript&#8221;&gt;
</p>
<p>
  setTimeout(function(){
</p>
<p>
          top.window.location.href=&#8217;index.php?p=Admin&amp;c=Login&amp;a=login&#8217;;	//top表示框架的最顶端窗口
</p>
<p>
  },3000)
</p>
<p>
  &lt;/script&gt;
</p>
<p>
  str;
</p>
<p>
                  exit;
</p>
<p>
              }
</p>
<p>
              else
</p>
<p>
                  $this-&gt;error (&#8216;index.php?p=Admin&amp;c=User&amp;a=edit&#8217;, &#8216;修改失败&#8217;);
</p>
<p>
          }
</p>
<p>
      }
</p>
<p>
  //个人设置修改结束
</p>
<p>
      $info=$model-&gt;find($id);
</p>
<p>
      $this-&gt;smarty-&gt;assign(&#8216;info&#8217;,$info);
</p>
<p>
      $this-&gt;smarty-&gt;display(&#8216;user_edit.html&#8217;);
</p>
<p>
  }
</p>
<h2>博客类别模块</h2>
<h3>多级联动</h3>
<p>
  多级联动在网站开发中非常常见。
</p>
<p><img loading="lazy" decoding="async" width="971" height="167" src="/wp-content/uploads/2018/05/word-image-2495.png" class="wp-image-2840" srcset="/wp-content/uploads/2018/05/word-image-2495.png 971w, /wp-content/uploads/2018/05/word-image-2495-300x52.png 300w, /wp-content/uploads/2018/05/word-image-2495-768x132.png 768w" sizes="(max-width: 971px) 100vw, 971px" /></p>
<p>
  思考：如何使用一个表实现无限极联动？
</p>
<table>
<tr>
<td>
<p>
  id
</p>
</td>
<td>
<p>
  name
</p>
</td>
<td>
<p>
  parent_id
</p>
</td>
</tr>
<tr>
<td>
<p>
  1
</p>
</td>
<td>
<p>
  江苏
</p>
</td>
<td>
<p>
  0
</p>
</td>
</tr>
<tr>
<td>
<p>
  2
</p>
</td>
<td>
<p>
  安徽
</p>
</td>
<td>
<p>
  0
</p>
</td>
</tr>
<tr>
<td>
<p>
  3
</p>
</td>
<td>
<p>
  苏州
</p>
</td>
<td>
<p>
  1
</p>
</td>
</tr>
<tr>
<td>
<p>
  4
</p>
</td>
<td>
<p>
  昆山
</p>
</td>
<td>
<p>
  3
</p>
</td>
</tr>
<tr>
<td>
<p>
  5
</p>
</td>
<td>
<p>
  花桥
</p>
</td>
<td>
<p>
  4
</p>
</td>
</tr>
</table>
<p>
  实现无限极联动主要在于表设计
</p>
<h3>创建类别表</h3>
<p>
  create table category(
</p>
<p>
         cat_id int unsigned auto_increment primary key comment &#8216;类别id&#8217;,
</p>
<p>
         cat_name varchar(20) not null comment &#8216;类别名称&#8217;,
</p>
<p>
         parent_id int unsigned not null comment &#8216;父级id&#8217;,
</p>
<p>
         sort_order int default 50 comment &#8216;排序&#8217;
</p>
<p>
  )engine=innodb charset=utf8 comment &#8216;类别表&#8217;;
</p>
<p>
  表结构
</p>
<p><img loading="lazy" decoding="async" width="747" height="98" src="/wp-content/uploads/2018/05/word-image-2496.png" class="wp-image-2841" srcset="/wp-content/uploads/2018/05/word-image-2496.png 747w, /wp-content/uploads/2018/05/word-image-2496-300x39.png 300w" sizes="(max-width: 747px) 100vw, 747px" /></p>
<p>
  插入测试数据
</p>
<p>
  insert into category values (null,&#8217;计算机&#8217;,0,default),(null,&#8217;文学&#8217;,0,default);
</p>
<p>
  insert into category values (null,&#8217;硬件&#8217;,1,default),(null,&#8217;软件&#8217;,1,default);
</p>
<p>
  insert into category values (null,&#8217;国内文学&#8217;,2,default),(null,&#8217;国外文件&#8217;,2,default)
</p>
<p>
  insert into category values (null,&#8217;PHP&#8217;,4,default),(null,&#8217;java&#8217;,4,default)
</p>
<p>
  查看数据并按层次摆放
</p>
<p><img loading="lazy" decoding="async" width="904" height="248" src="/wp-content/uploads/2018/05/word-image-2497.png" class="wp-image-2842" srcset="/wp-content/uploads/2018/05/word-image-2497.png 904w, /wp-content/uploads/2018/05/word-image-2497-300x82.png 300w, /wp-content/uploads/2018/05/word-image-2497-768x211.png 768w" sizes="(max-width: 904px) 100vw, 904px" /></p>
<h3>通过递归创建多级联动的树形结构</h3>
<p>
  &lt;?php
</p>
<p>
  mysql_connect(&#8216;localhost&#8217;,&#8217;root&#8217;,&#8217;root&#8217;);
</p>
<p>
  mysql_select_db(&#8216;data&#8217;);
</p>
<p>
  mysql_query(&#8216;set names utf8&#8217;);
</p>
<p>
  $rs=mysql_query(&#8216;select * from category order by sort_order,cat_id&#8217;);
</p>
<p>
  $array=array();
</p>
<p>
  while($rows=mysql_fetch_assoc($rs)) {
</p>
<p>
  	$array[]=$rows;
</p>
<p>
  }
</p>
<p>
  header(&#8216;content-type:text/html;charset=utf-8&#8217;);
</p>
<p>
  /**
</p>
<p>
  *$list array 需要创建树形结构的数组
</p>
<p>
  *$parent_id int 指定的父级下的元素创建树形结构
</p>
<p>
  *$deep int 当前元素的深度级别
</p>
<p>
  */
</p>
<p>
  function createTree($list,$parent_id=0,$deep=0) {
</p>
<p>
  	static $tree=array();
</p>
<p>
  	foreach($list as $rows){
</p>
<p>
  		if($rows[&#8216;parent_id&#8217;]==$parent_id){
</p>
<p>
  			$rows[&#8216;deep&#8217;]=$deep;
</p>
<p>
  			$tree[]=$rows;
</p>
<p>
  			createTree($list,$rows[&#8216;cat_id&#8217;],$deep+1);
</p>
<p>
  		}
</p>
<p>
  	}
</p>
<p>
  	return $tree;
</p>
<p>
  }
</p>
<p>
  $tree=createTree($array);
</p>
<p>
  //输出
</p>
<p>
  foreach($tree as $rows) {
</p>
<p>
  	echo str_repeat(&#8216;&amp;nbsp;&#8217;,$rows[&#8216;deep&#8217;]*8),$rows[&#8216;cat_name&#8217;],'&lt;br&gt;&#8217;;
</p>
<p>
  }
</p>
<p>
  运行结果
</p>
<p><img loading="lazy" decoding="async" width="440" height="216" src="/wp-content/uploads/2018/05/word-image-2498.png" class="wp-image-2843" srcset="/wp-content/uploads/2018/05/word-image-2498.png 440w, /wp-content/uploads/2018/05/word-image-2498-300x147.png 300w" sizes="(max-width: 440px) 100vw, 440px" /></p>
<h2>博客中显示类别列表</h2>
<ol>
<li>
  在Model文件夹中创建CategoryModel.class.php页面
</li>
</ol>
<p>
  &lt;?php
</p>
<p>
  namespace Model;
</p>
<p>
  class CategoryModel extends \Core\Model{
</p>
<p>
      //获取类别的树
</p>
<p>
      public function getCategoryTree($parent_id=0){
</p>
<p>
          $list=  $this-&gt;select();
</p>
<p>
          $list=  $this-&gt;createTree($list,$parent_id);
</p>
<p>
          return $list;
</p>
<p>
      }
</p>
<p>
      //创建树形结构
</p>
<p>
      private function createTree($list,$parent_id=0,$deep=0) {
</p>
<p>
  	static $tree=array();
</p>
<p>
  	foreach($list as $rows){
</p>
<p>
              if($rows[&#8216;parent_id&#8217;]==$parent_id){
</p>
<p>
                  $rows[&#8216;deep&#8217;]=$deep;
</p>
<p>
                  $tree[]=$rows;
</p>
<p>
                  $this-&gt;createTree($list,$rows[&#8216;cat_id&#8217;],$deep+1);
</p>
<p>
              }
</p>
<p>
  	}
</p>
<p>
  	return $tree;
</p>
<p>
      }
</p>
<p>
  }
</p>
<ol>
<li>
  在Controller\Admin目录下创建CategoryController.class.php页面
</li>
</ol>
<p><img loading="lazy" decoding="async" width="966" height="381" src="/wp-content/uploads/2018/05/word-image-2499.png" class="wp-image-2844" srcset="/wp-content/uploads/2018/05/word-image-2499.png 966w, /wp-content/uploads/2018/05/word-image-2499-300x118.png 300w, /wp-content/uploads/2018/05/word-image-2499-768x303.png 768w" sizes="(max-width: 966px) 100vw, 966px" /></p>
<ol>
<li>
  在menu.html页面中点击“类别管理”
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1043" height="200" src="/wp-content/uploads/2018/05/word-image-2500.png" class="wp-image-2845" srcset="/wp-content/uploads/2018/05/word-image-2500.png 1043w, /wp-content/uploads/2018/05/word-image-2500-300x58.png 300w, /wp-content/uploads/2018/05/word-image-2500-768x147.png 768w, /wp-content/uploads/2018/05/word-image-2500-1024x196.png 1024w" sizes="(max-width: 1043px) 100vw, 1043px" /></p>
<ol>
<li>
  在cat_list.html页面中取出类别
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1274" height="238" src="/wp-content/uploads/2018/05/word-image-2501.png" class="wp-image-2846" srcset="/wp-content/uploads/2018/05/word-image-2501.png 1274w, /wp-content/uploads/2018/05/word-image-2501-300x56.png 300w, /wp-content/uploads/2018/05/word-image-2501-768x143.png 768w, /wp-content/uploads/2018/05/word-image-2501-1024x191.png 1024w" sizes="(max-width: 1274px) 100vw, 1274px" /></p>
<p>
  运行结果
</p>
<p><img loading="lazy" decoding="async" width="1348" height="453" src="/wp-content/uploads/2018/05/word-image-2502.png" class="wp-image-2847" srcset="/wp-content/uploads/2018/05/word-image-2502.png 1348w, /wp-content/uploads/2018/05/word-image-2502-300x101.png 300w, /wp-content/uploads/2018/05/word-image-2502-768x258.png 768w, /wp-content/uploads/2018/05/word-image-2502-1024x344.png 1024w" sizes="(max-width: 1348px) 100vw, 1348px" /></p>
<h2>添加类别</h2>
<h3>入口位置</h3>
<p><img loading="lazy" decoding="async" width="985" height="136" src="/wp-content/uploads/2018/05/word-image-2503.png" class="wp-image-2848" srcset="/wp-content/uploads/2018/05/word-image-2503.png 985w, /wp-content/uploads/2018/05/word-image-2503-300x41.png 300w, /wp-content/uploads/2018/05/word-image-2503-768x106.png 768w" sizes="(max-width: 985px) 100vw, 985px" /><br />
<img loading="lazy" decoding="async" width="1108" height="122" src="/wp-content/uploads/2018/05/word-image-2504.png" class="wp-image-2849" srcset="/wp-content/uploads/2018/05/word-image-2504.png 1108w, /wp-content/uploads/2018/05/word-image-2504-300x33.png 300w, /wp-content/uploads/2018/05/word-image-2504-768x85.png 768w, /wp-content/uploads/2018/05/word-image-2504-1024x113.png 1024w" sizes="(max-width: 1108px) 100vw, 1108px" /></p>
<h3>显示添加类别</h3>
<p>
  模型
</p>
<p>
  无
</p>
<p>
  控制器（CategoryController）
</p>
<p><img loading="lazy" decoding="async" width="1010" height="335" src="/wp-content/uploads/2018/05/word-image-2505.png" class="wp-image-2850" srcset="/wp-content/uploads/2018/05/word-image-2505.png 1010w, /wp-content/uploads/2018/05/word-image-2505-300x100.png 300w, /wp-content/uploads/2018/05/word-image-2505-768x255.png 768w" sizes="(max-width: 1010px) 100vw, 1010px" /></p>
<p>
  视图（cat_add.html）
</p>
<p><img loading="lazy" decoding="async" width="1186" height="218" src="/wp-content/uploads/2018/05/word-image-2506.png" class="wp-image-2851" srcset="/wp-content/uploads/2018/05/word-image-2506.png 1186w, /wp-content/uploads/2018/05/word-image-2506-300x55.png 300w, /wp-content/uploads/2018/05/word-image-2506-768x141.png 768w, /wp-content/uploads/2018/05/word-image-2506-1024x188.png 1024w" sizes="(max-width: 1186px) 100vw, 1186px" /></p>
<p>
  运行结果
</p>
<p><img loading="lazy" decoding="async" width="697" height="314" src="/wp-content/uploads/2018/05/word-image-2507.png" class="wp-image-2852" srcset="/wp-content/uploads/2018/05/word-image-2507.png 697w, /wp-content/uploads/2018/05/word-image-2507-300x135.png 300w" sizes="(max-width: 697px) 100vw, 697px" /></p>
<h3>实现添加的业务逻辑</h3>
<p>
  模型
</p>
<p>
  无
</p>
<p>
  控制器
</p>
<p><img loading="lazy" decoding="async" width="1268" height="570" src="/wp-content/uploads/2018/05/word-image-2508.png" class="wp-image-2853" srcset="/wp-content/uploads/2018/05/word-image-2508.png 1268w, /wp-content/uploads/2018/05/word-image-2508-300x135.png 300w, /wp-content/uploads/2018/05/word-image-2508-768x345.png 768w, /wp-content/uploads/2018/05/word-image-2508-1024x460.png 1024w" sizes="(max-width: 1268px) 100vw, 1268px" /></p>
<p>
  视图
</p>
<p>
  无
</p>
<h2>修改类别</h2>
<h3>修改入口</h3>
<p><img loading="lazy" decoding="async" width="1185" height="187" src="/wp-content/uploads/2018/05/word-image-2509.png" class="wp-image-2854" srcset="/wp-content/uploads/2018/05/word-image-2509.png 1185w, /wp-content/uploads/2018/05/word-image-2509-300x47.png 300w, /wp-content/uploads/2018/05/word-image-2509-768x121.png 768w, /wp-content/uploads/2018/05/word-image-2509-1024x162.png 1024w" sizes="(max-width: 1185px) 100vw, 1185px" /><br />
<img loading="lazy" decoding="async" width="1338" height="120" src="/wp-content/uploads/2018/05/word-image-2510.png" class="wp-image-2855" srcset="/wp-content/uploads/2018/05/word-image-2510.png 1338w, /wp-content/uploads/2018/05/word-image-2510-300x27.png 300w, /wp-content/uploads/2018/05/word-image-2510-768x69.png 768w, /wp-content/uploads/2018/05/word-image-2510-1024x92.png 1024w" sizes="(max-width: 1338px) 100vw, 1338px" /></p>
<h3>显示修改页面</h3>
<p>
  模型
</p>
<p>
  无
</p>
<p>
  控制器
</p>
<p><img loading="lazy" decoding="async" width="1082" height="367" src="/wp-content/uploads/2018/05/word-image-2511.png" class="wp-image-2856" srcset="/wp-content/uploads/2018/05/word-image-2511.png 1082w, /wp-content/uploads/2018/05/word-image-2511-300x102.png 300w, /wp-content/uploads/2018/05/word-image-2511-768x260.png 768w, /wp-content/uploads/2018/05/word-image-2511-1024x347.png 1024w" sizes="(max-width: 1082px) 100vw, 1082px" /></p>
<p>
  视图（将cat_add.html页面复制一份，改名为cat_edit.html）
</p>
<p><img loading="lazy" decoding="async" width="1345" height="592" src="/wp-content/uploads/2018/05/word-image-2512.png" class="wp-image-2857" srcset="/wp-content/uploads/2018/05/word-image-2512.png 1345w, /wp-content/uploads/2018/05/word-image-2512-300x132.png 300w, /wp-content/uploads/2018/05/word-image-2512-768x338.png 768w, /wp-content/uploads/2018/05/word-image-2512-1024x451.png 1024w" sizes="(max-width: 1345px) 100vw, 1345px" /></p>
<h3>执行修改的业务逻辑（CategoryController控制器中实现）</h3>
<p>
  public function editAction(){
</p>
<p>
      $cat_id=(int)$_GET[&#8216;cat_id&#8217;];
</p>
<p>
      $model=new \Model\CategoryModel();
</p>
<p>
      //修改业务逻辑
</p>
<p>
      if(!empty($_POST)){
</p>
<p>
          $data[&#8216;cat_name&#8217;]=$_POST[&#8216;cat_name&#8217;];
</p>
<p>
          $data[&#8216;parent_id&#8217;]=$_POST[&#8216;parentid&#8217;];
</p>
<p>
          $data[&#8216;sort_order&#8217;]=$_POST[&#8216;sort_order&#8217;];
</p>
<p>
          $data[&#8216;cat_id&#8217;]=$cat_id;
</p>
<p>
          //错误一：指定的父级是自己
</p>
<p>
          if($data[&#8216;parent_id&#8217;]==$cat_id){
</p>
<p>
              $this-&gt;error (&#8216;index.php?p=Admin&amp;c=Category&amp;a=edit&amp;cat_id=&#8217;.$cat_id, &#8216;自己不能做自己的父亲&#8217;);
</p>
<p>
          }
</p>
<p>
          //错误二：指定的父级是自己的后代
</p>
<p>
          $sublist=$model-&gt;getCategoryTree($cat_id);
</p>
<p>
          foreach($sublist as $rows){
</p>
<p>
              if($rows[&#8216;cat_id&#8217;]==$data[&#8216;parent_id&#8217;])
</p>
<p>
                  $this-&gt;error (&#8216;index.php?p=Admin&amp;c=Category&amp;a=edit&amp;cat_id=&#8217;.$cat_id, &#8216;指定的父级是自己的后代&#8217;);
</p>
<p>
          }
</p>
<p>
          //更新操作
</p>
<p>
          if($model-&gt;update($data))
</p>
<p>
              $this-&gt;success (&#8216;index.php?p=Admin&amp;c=Category&amp;a=list&#8217;,&#8217;修改成功&#8217;);
</p>
<p>
          else
</p>
<p>
              $this-&gt;error (&#8216;index.php?p=Admin&amp;c=Category&amp;a=edit&amp;cat_id=&#8217;.$cat_id, &#8216;修改失败&#8217;);
</p>
<p>
      }
</p>
<p>
      $info=$model-&gt;find($cat_id);
</p>
<p>
      $cat_list=$model-&gt;getCategoryTree();
</p>
<p>
      $this-&gt;smarty-&gt;assign(&#8216;cat_list&#8217;,$cat_list);
</p>
<p>
      $this-&gt;smarty-&gt;assign(&#8216;info&#8217;,$info);
</p>
<p>
      $this-&gt;smarty-&gt;display(&#8216;cat_edit.html&#8217;);
</p>
<p>
  }
</p>
<h2>删除类别</h2>
<h3>删除入口</h3>
<p><img loading="lazy" decoding="async" width="1280" height="205" src="/wp-content/uploads/2018/05/word-image-2513.png" class="wp-image-2858" srcset="/wp-content/uploads/2018/05/word-image-2513.png 1280w, /wp-content/uploads/2018/05/word-image-2513-300x48.png 300w, /wp-content/uploads/2018/05/word-image-2513-768x123.png 768w, /wp-content/uploads/2018/05/word-image-2513-1024x164.png 1024w" sizes="(max-width: 1280px) 100vw, 1280px" /></p>
<p>
  模型
</p>
<p><img loading="lazy" decoding="async" width="1171" height="246" src="/wp-content/uploads/2018/05/word-image-2514.png" class="wp-image-2859" srcset="/wp-content/uploads/2018/05/word-image-2514.png 1171w, /wp-content/uploads/2018/05/word-image-2514-300x63.png 300w, /wp-content/uploads/2018/05/word-image-2514-768x161.png 768w, /wp-content/uploads/2018/05/word-image-2514-1024x215.png 1024w" sizes="(max-width: 1171px) 100vw, 1171px" /></p>
<p>
  视图
</p>
<p>
  无
</p>
<p>
  控制器
</p>
<p><img loading="lazy" decoding="async" width="1299" height="437" src="/wp-content/uploads/2018/05/word-image-2515.png" class="wp-image-2860" srcset="/wp-content/uploads/2018/05/word-image-2515.png 1299w, /wp-content/uploads/2018/05/word-image-2515-300x101.png 300w, /wp-content/uploads/2018/05/word-image-2515-768x258.png 768w, /wp-content/uploads/2018/05/word-image-2515-1024x344.png 1024w" sizes="(max-width: 1299px) 100vw, 1299px" /></p>
<h2>作业：</h2>
<p>
  在项目中上传头像，可能这个头像尺寸会很大，在项目中封装一个生成缩略图的方法来处理头像。</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%90%8e%e5%8f%b0%e6%a1%86%e6%9e%b6/2824.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PHP 语法（四）二分法、 传参、 全局变量、 函数、 匿名函数、 变量作用域、 变量生命周期、 终止脚本、 递归、 静态变量</title>
		<link>/php/848.html</link>
					<comments>/php/848.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Thu, 17 May 2018 16:45:14 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP基本语法]]></category>
		<category><![CDATA[二分法]]></category>
		<category><![CDATA[传参]]></category>
		<category><![CDATA[全局变量]]></category>
		<category><![CDATA[函数]]></category>
		<category><![CDATA[匿名函数]]></category>
		<category><![CDATA[变量作用域]]></category>
		<category><![CDATA[变量生命周期]]></category>
		<category><![CDATA[终止脚本]]></category>
		<category><![CDATA[递归]]></category>
		<category><![CDATA[静态变量]]></category>
		<guid isPermaLink="false">/?p=848</guid>

					<description><![CDATA[PHP语法（四） 包含文件 include和require：包含多次 include_once和require [&#8230;]]]></description>
										<content:encoded><![CDATA[</p>
<h1>PHP语法（四）</h1>
<h2>包含文件</h2>
<ol>
<li>
  include和require：包含多次
</li>
<li>
  include_once和require_once：包含一次
</li>
<li>
  包含文件就相当于将包含文件中的代码拷贝粘贴到PHP页面中（魔术常量除外，魔术常量显示所在文件的文件信息），所以后缀是.html的包含文件中的PHP代码被文件包含后也是会执行的。
</li>
</ol>
<h3>路径</h3>
<p>
  路径分为绝对路径和相对路径
</p>
<p>
  绝对路径：从盘符开始  c:\aa\bb.txt
</p>
<p>
  相对路径：从当前文件所在的目录开始   aa\bb.txt    ../aa.txt
</p>
<p>
  ../表示上一级目录     ./当前目录
</p>
<p><img loading="lazy" decoding="async" width="865" height="65" src="/wp-content/uploads/2018/05/word-image-747.png" class="wp-image-850" srcset="/wp-content/uploads/2018/05/word-image-747.png 865w, /wp-content/uploads/2018/05/word-image-747-300x23.png 300w, /wp-content/uploads/2018/05/word-image-747-768x58.png 768w" sizes="(max-width: 865px) 100vw, 865px" /></p>
<p>
  区别：
</p>
<p>
  ./就表示在当前目录下找
</p>
<p>
  不带./受include_path配置的影响
</p>
<p><img loading="lazy" decoding="async" width="1029" height="32" src="/wp-content/uploads/2018/05/word-image-748.png" class="wp-image-851" srcset="/wp-content/uploads/2018/05/word-image-748.png 1029w, /wp-content/uploads/2018/05/word-image-748-300x9.png 300w, /wp-content/uploads/2018/05/word-image-748-768x24.png 768w, /wp-content/uploads/2018/05/word-image-748-1024x32.png 1024w" sizes="(max-width: 1029px) 100vw, 1029px" /></p>
<p>
  作用：将项目中的包含文件统一放置到指定目录内，然后利用include_path指向这个目录。可以提高安全性，也可以不用写很长的地址字符串。
</p>
<p>
  include_path的值可以写多个路径，从前往后找文件。
</p>
<p>
  set_include_path(&#8220;F:\www1;d:\www2;c:\&#8221;);
</p>
<p><strong>获取虚拟目录地址</strong>
</p>
<p><img loading="lazy" decoding="async" width="650" height="54" src="/wp-content/uploads/2018/05/word-image-749.png" class="wp-image-852" srcset="/wp-content/uploads/2018/05/word-image-749.png 650w, /wp-content/uploads/2018/05/word-image-749-300x25.png 300w" sizes="(max-width: 650px) 100vw, 650px" /></p>
<p><strong>文件包含</strong>
</p>
<p><img loading="lazy" decoding="async" width="944" height="113" src="/wp-content/uploads/2018/05/word-image-750.png" class="wp-image-853" srcset="/wp-content/uploads/2018/05/word-image-750.png 944w, /wp-content/uploads/2018/05/word-image-750-300x36.png 300w, /wp-content/uploads/2018/05/word-image-750-768x92.png 768w" sizes="(max-width: 944px) 100vw, 944px" /></p>
<p><strong>路径中“/”和“\”的区别</strong>
</p>
<p>
  /：斜杠，用于web路径			http://www.php.com/aa/bb/index.html
</p>
<p>
  \：反斜杠 用于文件物理地址路径  C:\aa\bb\index.html
</p>
<p>
  在windows中可以相互混淆，但是在Linux中不可以，Linux中严格区分。
</p>
<h2>函数</h2>
<p>
  函数是一个固定的代码块，也称为子程序，一个函数可以被多次调用，函数可以很好的实现计算机的模块化编程。
</p>
<h3>定义语法</h3>
<p>
  function 函数名(参数1,参数2,&#8230;){
</p>
<p>
  	//函数体
</p>
<p>
  }
</p>
<p>
  函数的命名规则：
</p>
<ol>
<li>
  以字母、下划线开头，后面跟的是字母、数字、下划线
</li>
<li>
  函数名不区分大小写（JS是区分大小写的）
</li>
</ol>
<h3>调用函数</h3>
<p>
  通过函数名来调研函数。
</p>
<p>
  例题：打印斐波那契数列
</p>
<p><img loading="lazy" decoding="async" width="996" height="401" src="/wp-content/uploads/2018/05/word-image-751.png" class="wp-image-854" srcset="/wp-content/uploads/2018/05/word-image-751.png 996w, /wp-content/uploads/2018/05/word-image-751-300x121.png 300w, /wp-content/uploads/2018/05/word-image-751-768x309.png 768w" sizes="(max-width: 996px) 100vw, 996px" /></p>
<h3>参数的概念</h3>
<p>
  函数括号里面的数称为参数
</p>
<p>
  参数分为形式参数和实际参数
</p>
<p>
  形式参数没有具体的值，只起一个形式的作用，用来告诉调用者需要传递几个参数给函数。函数定义时候的参数是形式参数
</p>
<p>
  实际参数：函数调用的时候传递给函数的参数。
</p>
<h3>可变函数</h3>
<p>
  将函数名保持在变量中。
</p>
<p>
  &lt;?php
</p>
<p>
  function fun1() {
</p>
<p>
  	echo &#8216;处理一年级的事情&lt;br&gt;&#8217;;
</p>
<p>
  }
</p>
<p>
  function fun2() {
</p>
<p>
  	echo &#8216;处理二年级的事情&lt;br&gt;&#8217;;
</p>
<p>
  }
</p>
<p>
  function fun3() {
</p>
<p>
  	echo &#8216;处理三年级的事情&lt;br&gt;&#8217;;
</p>
<p>
  }
</p>
<p>
  function fun($grade) {
</p>
<p>
  	$f=&#8217;fun&#8217;.$grade;	//可变函数
</p>
<p>
  	$f();
</p>
<p>
  }
</p>
<p>
  fun(1);
</p>
<p>
  fun(2);
</p>
<p>
  fun(3);
</p>
<p><img loading="lazy" decoding="async" width="233" height="59" src="/wp-content/uploads/2018/05/word-image-752.png" class="wp-image-855" /></p>
<h3>匿名函数</h3>
<p>
  没有名字的函数，PHP5.3以后才支持的。
</p>
<p><img loading="lazy" decoding="async" width="490" height="148" src="/wp-content/uploads/2018/05/word-image-753.png" class="wp-image-856" srcset="/wp-content/uploads/2018/05/word-image-753.png 490w, /wp-content/uploads/2018/05/word-image-753-300x91.png 300w" sizes="(max-width: 490px) 100vw, 490px" /></p>
<h3>函数的传值与传址</h3>
<p>
  默认情况下，函数参数传递是值传递，在定义函数的时候参数前面加上“&amp;”表示地址传递。
</p>
<p><img loading="lazy" decoding="async" width="501" height="153" src="/wp-content/uploads/2018/05/word-image-754.png" class="wp-image-857" srcset="/wp-content/uploads/2018/05/word-image-754.png 501w, /wp-content/uploads/2018/05/word-image-754-300x92.png 300w" sizes="(max-width: 501px) 100vw, 501px" /></p>
<p>
  脚下留心：如果函数的参数是引用传递，调用函数的时候不能直接写值，只能写变量，因为地址总是保存在变量中。
</p>
<p><img loading="lazy" decoding="async" width="967" height="99" src="/wp-content/uploads/2018/05/word-image-755.png" class="wp-image-858" srcset="/wp-content/uploads/2018/05/word-image-755.png 967w, /wp-content/uploads/2018/05/word-image-755-300x31.png 300w, /wp-content/uploads/2018/05/word-image-755-768x79.png 768w" sizes="(max-width: 967px) 100vw, 967px" /></p>
<h3>参数的默认值</h3>
<p>
  如果参数有默认值的情况下，传递了参数就使用传递的值，没有传递参数就使用默认值。
</p>
<p><img loading="lazy" decoding="async" width="707" height="196" src="/wp-content/uploads/2018/05/word-image-756.png" class="wp-image-859" srcset="/wp-content/uploads/2018/05/word-image-756.png 707w, /wp-content/uploads/2018/05/word-image-756-300x83.png 300w" sizes="(max-width: 707px) 100vw, 707px" /></p>
<p>
  注意事项
</p>
<ol>
<li>
  默认值必须在一个存在的值，不能用变量来代替
</li>
</ol>
<p><img loading="lazy" decoding="async" width="846" height="110" src="/wp-content/uploads/2018/05/word-image-757.png" class="wp-image-860" srcset="/wp-content/uploads/2018/05/word-image-757.png 846w, /wp-content/uploads/2018/05/word-image-757-300x39.png 300w, /wp-content/uploads/2018/05/word-image-757-768x100.png 768w" sizes="(max-width: 846px) 100vw, 846px" /></p>
<ol>
<li>
  常量可以做默认值
</li>
</ol>
<p><img loading="lazy" decoding="async" width="509" height="108" src="/wp-content/uploads/2018/05/word-image-758.png" class="wp-image-861" srcset="/wp-content/uploads/2018/05/word-image-758.png 509w, /wp-content/uploads/2018/05/word-image-758-300x64.png 300w" sizes="(max-width: 509px) 100vw, 509px" /></p>
<ol>
<li>
  在定义函数的时候，没有默认值的参数写前面，有默认值的参数写后面。
</li>
<li>
  形参合实参不匹配
</li>
</ol>
<p><img loading="lazy" decoding="async" width="739" height="118" src="/wp-content/uploads/2018/05/word-image-759.png" class="wp-image-862" srcset="/wp-content/uploads/2018/05/word-image-759.png 739w, /wp-content/uploads/2018/05/word-image-759-300x48.png 300w" sizes="(max-width: 739px) 100vw, 739px" /></p>
<ul>
<li>
<ol>
<li>
      实际参数少于形式参数，报错，没有对应值的参数为null
    </li>
<li>
      实际参数少于形式参数，只取前面对应的值。
    </li>
</ol>
</li>
</ul>
<h3>传递不确定参数</h3>
<p><img loading="lazy" decoding="async" width="940" height="170" src="/wp-content/uploads/2018/05/word-image-760.png" class="wp-image-863" srcset="/wp-content/uploads/2018/05/word-image-760.png 940w, /wp-content/uploads/2018/05/word-image-760-300x54.png 300w, /wp-content/uploads/2018/05/word-image-760-768x139.png 768w" sizes="(max-width: 940px) 100vw, 940px" /></p>
<p>
  在js中通过arguments关键字来获取传递的参数。
</p>
<h3>判断函数是否存在</h3>
<p><img loading="lazy" decoding="async" width="503" height="139" src="/wp-content/uploads/2018/05/word-image-761.png" class="wp-image-864" srcset="/wp-content/uploads/2018/05/word-image-761.png 503w, /wp-content/uploads/2018/05/word-image-761-300x83.png 300w" sizes="(max-width: 503px) 100vw, 503px" /></p>
<h2>return</h2>
<h3>作用1：在函数中使用</h3>
<ol>
<li>
  终止函数的执行
</li>
<li>
  从函数内部将数据返回出来
</li>
</ol>
<p><img loading="lazy" decoding="async" width="516" height="231" src="/wp-content/uploads/2018/05/word-image-762.png" class="wp-image-865" srcset="/wp-content/uploads/2018/05/word-image-762.png 516w, /wp-content/uploads/2018/05/word-image-762-300x134.png 300w" sizes="(max-width: 516px) 100vw, 516px" /></p>
<h3>作用2：在页面中使用</h3>
<p>
  第一步：创建9-config.php
</p>
<p>
  &lt;?php
</p>
<p>
  return array(
</p>
<p>
  	&#8216;host&#8217;=&gt;&#8217;lolcalhost&#8217;,
</p>
<p>
  	&#8216;username&#8217;=&gt;&#8217;root&#8217;,
</p>
<p>
  	&#8216;pwd&#8217;=&gt;&#8217;root&#8217;
</p>
<p>
  );
</p>
<p>
  第二步：在9-demo.php页面中包含9-config.php
</p>
<p>
  &lt;?php
</p>
<p>
  $config=require &#8216;./9-config.php&#8217;;
</p>
<p>
  var_dump($config);
</p>
<p><img loading="lazy" decoding="async" width="685" height="26" src="/wp-content/uploads/2018/05/word-image-763.png" class="wp-image-866" srcset="/wp-content/uploads/2018/05/word-image-763.png 685w, /wp-content/uploads/2018/05/word-image-763-300x11.png 300w" sizes="(max-width: 685px) 100vw, 685px" /></p>
<p>
  作用：用来做框架的配置文件。
</p>
<h3>作用3：终止脚本的执行</h3>
<p><img loading="lazy" decoding="async" width="411" height="81" src="/wp-content/uploads/2018/05/word-image-764.png" class="wp-image-867" srcset="/wp-content/uploads/2018/05/word-image-764.png 411w, /wp-content/uploads/2018/05/word-image-764-300x59.png 300w" sizes="(max-width: 411px) 100vw, 411px" /></p>
<h2>终止脚本的执行的方法</h2>
<ol>
<li>
  return
</li>
<li>
  exit——等同于die
</li>
<li>
  die
</li>
</ol>
<p>
  区别：
</p>
<ol>
<li>
  return只能终止当前脚本，如果包含文件中含有return，只能终止包含文件。
</li>
<li>
  exit和die用来终止所有脚本执行
</li>
<li>
  exit和die后面都能跟参数（程序中有一个潜规则，没有参数用exit，有参数用die）。
</li>
</ol>
<p><img loading="lazy" decoding="async" width="677" height="30" src="/wp-content/uploads/2018/05/word-image-765.png" class="wp-image-868" srcset="/wp-content/uploads/2018/05/word-image-765.png 677w, /wp-content/uploads/2018/05/word-image-765-300x13.png 300w" sizes="(max-width: 677px) 100vw, 677px" /></p>
<p>
  测试
</p>
<ol>
<li>
  写一个包含文件
</li>
</ol>
<p>
  echo &#8216;包含文件开始&lt;br&gt;&#8217;;
</p>
<p>
  return;
</p>
<p>
  echo &#8216;包含文件结束&lt;br&gt;&#8217;;
</p>
<ol>
<li>
  写一个测试文件
</li>
</ol>
<p><img loading="lazy" decoding="async" width="644" height="71" src="/wp-content/uploads/2018/05/word-image-766.png" class="wp-image-869" srcset="/wp-content/uploads/2018/05/word-image-766.png 644w, /wp-content/uploads/2018/05/word-image-766-300x33.png 300w" sizes="(max-width: 644px) 100vw, 644px" /></p>
<ol>
<li>
  将return换成exit或die，运行结果
</li>
</ol>
<p><img loading="lazy" decoding="async" width="403" height="56" src="/wp-content/uploads/2018/05/word-image-767.png" class="wp-image-870" srcset="/wp-content/uploads/2018/05/word-image-767.png 403w, /wp-content/uploads/2018/05/word-image-767-300x42.png 300w" sizes="(max-width: 403px) 100vw, 403px" /><br />
<img loading="lazy" decoding="async" width="615" height="61" src="/wp-content/uploads/2018/05/word-image-768.png" class="wp-image-871" srcset="/wp-content/uploads/2018/05/word-image-768.png 615w, /wp-content/uploads/2018/05/word-image-768-300x30.png 300w" sizes="(max-width: 615px) 100vw, 615px" /></p>
<h2>变量的作用域</h2>
<ol>
<li>
  全局变量：作用范围在函数的外部
</li>
<li>
  局部变量：作用范围在函数内部
</li>
<li>
  超全局变量：在整个页面访问（函数内，函数外都能访问）
</li>
</ol>
<p><img loading="lazy" decoding="async" width="738" height="116" src="/wp-content/uploads/2018/05/word-image-769.png" class="wp-image-872" srcset="/wp-content/uploads/2018/05/word-image-769.png 738w, /wp-content/uploads/2018/05/word-image-769-300x47.png 300w" sizes="(max-width: 738px) 100vw, 738px" /><br />
<img loading="lazy" decoding="async" width="721" height="103" src="/wp-content/uploads/2018/05/word-image-770.png" class="wp-image-873" srcset="/wp-content/uploads/2018/05/word-image-770.png 721w, /wp-content/uploads/2018/05/word-image-770-300x43.png 300w" sizes="(max-width: 721px) 100vw, 721px" /><br />
<img loading="lazy" decoding="async" width="575" height="107" src="/wp-content/uploads/2018/05/word-image-771.png" class="wp-image-874" srcset="/wp-content/uploads/2018/05/word-image-771.png 575w, /wp-content/uploads/2018/05/word-image-771-300x56.png 300w" sizes="(max-width: 575px) 100vw, 575px" /></p>
<h3>在函数内部使用全局变量</h3>
<p><strong>方法一：使用$GLOBALS</strong>
</p>
<p><img loading="lazy" decoding="async" width="1043" height="50" src="/wp-content/uploads/2018/05/word-image-772.png" class="wp-image-875" srcset="/wp-content/uploads/2018/05/word-image-772.png 1043w, /wp-content/uploads/2018/05/word-image-772-300x14.png 300w, /wp-content/uploads/2018/05/word-image-772-768x37.png 768w, /wp-content/uploads/2018/05/word-image-772-1024x49.png 1024w" sizes="(max-width: 1043px) 100vw, 1043px" /></p>
<p>
  例题：
</p>
<p>
  例题一：
</p>
<p><img loading="lazy" decoding="async" width="603" height="148" src="/wp-content/uploads/2018/05/word-image-773.png" class="wp-image-876" srcset="/wp-content/uploads/2018/05/word-image-773.png 603w, /wp-content/uploads/2018/05/word-image-773-300x74.png 300w" sizes="(max-width: 603px) 100vw, 603px" /></p>
<p>
  例题二：
</p>
<p><img loading="lazy" decoding="async" width="453" height="113" src="/wp-content/uploads/2018/05/word-image-774.png" class="wp-image-877" srcset="/wp-content/uploads/2018/05/word-image-774.png 453w, /wp-content/uploads/2018/05/word-image-774-300x75.png 300w" sizes="(max-width: 453px) 100vw, 453px" /></p>
<p><strong>方法二：使用global关键字</strong>
</p>
<p><img loading="lazy" decoding="async" width="768" height="128" src="/wp-content/uploads/2018/05/word-image-775.png" class="wp-image-878" srcset="/wp-content/uploads/2018/05/word-image-775.png 768w, /wp-content/uploads/2018/05/word-image-775-300x50.png 300w" sizes="(max-width: 768px) 100vw, 768px" /></p>
<p>
  注意：只有变量有作用域的概念，常量没有作用域的概念
</p>
</p>
<p><img loading="lazy" decoding="async" width="357" height="110" src="/wp-content/uploads/2018/05/word-image-776.png" class="wp-image-879" srcset="/wp-content/uploads/2018/05/word-image-776.png 357w, /wp-content/uploads/2018/05/word-image-776-300x92.png 300w" sizes="(max-width: 357px) 100vw, 357px" /><br />
<img loading="lazy" decoding="async" width="348" height="107" src="/wp-content/uploads/2018/05/word-image-777.png" class="wp-image-880" srcset="/wp-content/uploads/2018/05/word-image-777.png 348w, /wp-content/uploads/2018/05/word-image-777-300x92.png 300w" sizes="(max-width: 348px) 100vw, 348px" /></p>
<p><strong>方法三：匿名函数use()</strong>
</p>
<p>
  use()将匿名函数外部的变量引入到匿名函数的内部。
</p>
<p><img loading="lazy" decoding="async" width="850" height="107" src="/wp-content/uploads/2018/05/word-image-778.png" class="wp-image-881" srcset="/wp-content/uploads/2018/05/word-image-778.png 850w, /wp-content/uploads/2018/05/word-image-778-300x38.png 300w, /wp-content/uploads/2018/05/word-image-778-768x97.png 768w" sizes="(max-width: 850px) 100vw, 850px" /></p>
<p>
  练习
</p>
<p><img loading="lazy" decoding="async" width="552" height="194" src="/wp-content/uploads/2018/05/word-image-779.png" class="wp-image-882" srcset="/wp-content/uploads/2018/05/word-image-779.png 552w, /wp-content/uploads/2018/05/word-image-779-300x105.png 300w" sizes="(max-width: 552px) 100vw, 552px" /></p>
<h2>变量的生命周期</h2>
<p>
  全局变量声明的时候产生，页面执行完毕后销毁
</p>
<p>
  局部变量调用函数的时候产生，函数执行完毕销毁。
</p>
<p>
  静态变量程序加载的时候产生，只被初始化一次，页面执行完毕销毁
</p>
<h2>静态变量（static）</h2>
<p>
  静态变量一般指的是局部静态变量，PHP中没有全局的静态变量，因为全局的静态变量就是全局变量。
</p>
<table>
<tr>
<td><img loading="lazy" decoding="async" width="377" height="150" src="/wp-content/uploads/2018/05/word-image-780.png" class="wp-image-883" srcset="/wp-content/uploads/2018/05/word-image-780.png 377w, /wp-content/uploads/2018/05/word-image-780-300x119.png 300w" sizes="(max-width: 377px) 100vw, 377px" /></td>
<td><img loading="lazy" decoding="async" width="417" height="161" src="/wp-content/uploads/2018/05/word-image-781.png" class="wp-image-884" srcset="/wp-content/uploads/2018/05/word-image-781.png 417w, /wp-content/uploads/2018/05/word-image-781-300x116.png 300w" sizes="(max-width: 417px) 100vw, 417px" /></td>
</tr>
</table>
<p>
  注意：静态变量是有作用域的
</p>
<p><img loading="lazy" decoding="async" width="496" height="192" src="/wp-content/uploads/2018/05/word-image-782.png" class="wp-image-885" srcset="/wp-content/uploads/2018/05/word-image-782.png 496w, /wp-content/uploads/2018/05/word-image-782-300x116.png 300w" sizes="(max-width: 496px) 100vw, 496px" /></p>
<h2>递归</h2>
<p>
  在函数的内部自己调用自己。
</p>
<p>
  递归的要素
</p>
<ol>
<li>
  递归点：函数内部调用自己的地方
</li>
<li>
  递归出口：递归结束
</li>
</ol>
<h3>例题：用递归实现从1加到任意一个数</h3>
<p><img loading="lazy" decoding="async" width="663" height="340" src="/wp-content/uploads/2018/05/word-image-783.png" class="wp-image-886" srcset="/wp-content/uploads/2018/05/word-image-783.png 663w, /wp-content/uploads/2018/05/word-image-783-300x154.png 300w" sizes="(max-width: 663px) 100vw, 663px" /></p>
<h3>例题：打印前十个斐波那契数列</h3>
<p>
  第n个斐波那契数等于第n-1和n-2的和
</p>
<p>
  &lt;?php
</p>
<p>
  /**
</p>
<p>
  *$n是第n个斐波那契数
</p>
<p>
  */
</p>
<p>
  function fun($n) {
</p>
<p>
  	if($n==1 || $n==2) {
</p>
<p>
  		return 1;
</p>
<p>
  	}
</p>
<p>
  	return fun($n-1)+fun($n-2);
</p>
<p>
  }
</p>
<p>
  //打印前10个斐波那契数列
</p>
<p>
  for($i=1;$i&lt;=10;$i++)
</p>
<p>
  	echo fun($i),&#8217;&amp;nbsp;&#8217;;
</p>
<p>
  /**
</p>
<p>
  *分析第四个斐波那契数
</p>
<p>
  fun(4)	=fun(3)+fun(2)
</p>
<p>
  		=fun(2)+fun(1)+1
</p>
<p>
  		=1+1+1
</p>
<p>
  		=3
</p>
<p>
  */
</p>
<p>
  ?&gt;
</p>
<p><img loading="lazy" decoding="async" width="235" height="31" src="/wp-content/uploads/2018/05/word-image-784.png" class="wp-image-887" /></p>
<h2>算法：二分法查找</h2>
<ol>
<li>
  前提：一个有序的数组
</li>
<li>
  功能：在有序的数组中查找是否存在某个数
</li>
</ol>
<p>
  在1,5,9,12,56,78,102数组中查找102
</p>
<p>
  第一步：找出数组中间的数12，12&lt;102，在12右边查找
</p>
<p>
  第二步：剩下的数据有56,78,102，找中间的数是78，78&lt;102，在78的右边找
</p>
<p>
  第三步：剩下的数据有102，找到了。
</p>
<h3>实现代码</h3>
<p>
  &lt;?php
</p>
<p>
  /**
</p>
<p>
  *@param $array array 查找的数组
</p>
<p>
  *@param $min int 最小下标
</p>
<p>
  *@param $max int 最大下标
</p>
<p>
  *@param $search number 查询的数字
</p>
<p>
  */
</p>
<p>
  function binary($array,$min,$max,$search) {
</p>
<p>
  	while($min&lt;=$max){
</p>
<p>
  		$mid=floor(($min+$max)/2);	//计算中间元素的下表
</p>
<p>
  		if($array[$mid]==$search)	//找到查找的元素
</p>
<p>
  		{
</p>
<p>
  			return $mid;	//返回下标
</p>
<p>
  		}
</p>
<p>
  		elseif($array[$mid]&lt;$search) {	//查找的元素比中间值大
</p>
<p>
  			$min=$mid+1;		//更改最小下标值
</p>
<p>
  		}
</p>
<p>
  		else {
</p>
<p>
  			$max=$mid-1;		//更改最大下标值
</p>
<p>
  		}
</p>
<p>
  	}
</p>
<p>
  	return -1;	//没有找到
</p>
<p>
  }
</p>
<p>
  $num=array(1,5,9,12,56,78,102);
</p>
<p>
  echo binary($num,0,count($num)-1,8),'&lt;br&gt;&#8217;;
</p>
<h2>作业：</h2>
<ol>
<li>
  猴子吃桃子，第一天吃了一半又多吃一个，第二天一样，到第十天就剩下一个桃子，请问原来有几个桃子？
</li>
<li>
  用递归实在二分法
</li>
</ol>
]]></content:encoded>
					
					<wfw:commentRss>/php/848.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
