<?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/%E7%BB%A7%E6%89%BF/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description></description>
	<lastBuildDate>Sun, 20 May 2018 01:23:47 +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>JS高级（四）原型链、定义类或对象、私有和封装、静态属性和方法、继承、操作符 instanceof、for…in、顶层函数、贪吃蛇</title>
		<link>/%e5%89%8d%e7%ab%af%e6%8a%80%e6%9c%af/3053.html</link>
					<comments>/%e5%89%8d%e7%ab%af%e6%8a%80%e6%9c%af/3053.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 06:50:44 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[前端技术]]></category>
		<category><![CDATA[for…in]]></category>
		<category><![CDATA[原型链]]></category>
		<category><![CDATA[定义类或对象]]></category>
		<category><![CDATA[操作符 instanceof]]></category>
		<category><![CDATA[私有和封装]]></category>
		<category><![CDATA[继承]]></category>
		<category><![CDATA[贪吃蛇]]></category>
		<category><![CDATA[静态属性和方法]]></category>
		<category><![CDATA[顶层函数]]></category>
		<guid isPermaLink="false">/?p=3053</guid>

					<description><![CDATA[JavaScript面向对象（4） https://developer.mozilla.org/zh-CN/d [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>
  JavaScript面向对象（4）
</p>
<p>
  https://developer.mozilla.org/zh-CN/docs/Web/JavaScript
</p>
<p>
  http://javascript.ruanyifeng.com/
</p>
<h1>一、原型（原型链）</h1>
<p>
  1、原型对象
</p>
<p>
  案例：根据构造方法创建两个对象，看内存中的存在形式
</p>
<p>
  <img fetchpriority="high" decoding="async" width="547" height="264" src="/wp-content/uploads/2018/05/word-image-2679.png" class="wp-image-3054" srcset="/wp-content/uploads/2018/05/word-image-2679.png 547w, /wp-content/uploads/2018/05/word-image-2679-300x145.png 300w" sizes="(max-width: 547px) 100vw, 547px" />
</p>
<p>
  内存存在形式：
</p>
<p>
  <img decoding="async" width="460" height="290" src="/wp-content/uploads/2018/05/word-image-2680.png" class="wp-image-3055" srcset="/wp-content/uploads/2018/05/word-image-2680.png 460w, /wp-content/uploads/2018/05/word-image-2680-300x189.png 300w" sizes="(max-width: 460px) 100vw, 460px" />
</p>
<p>
  根据内存图，可以看出，在内存中，两个对象的成员方法占用了两个空间，但实际上这两个方法完全一样，没有必要占用两个空间。
</p>
<p><strong>解决的办法就是使用原型对象。把两个对象相同的内容都放到构造方法的原型对象中</strong>。
</p>
<p>
  <img decoding="async" width="619" height="288" src="/wp-content/uploads/2018/05/word-image-2681.png" class="wp-image-3056" srcset="/wp-content/uploads/2018/05/word-image-2681.png 619w, /wp-content/uploads/2018/05/word-image-2681-300x140.png 300w" sizes="(max-width: 619px) 100vw, 619px" />
</p>
<p>
  原型对象和构造器的关系：
</p>
<p>
  <img loading="lazy" decoding="async" width="481" height="96" src="/wp-content/uploads/2018/05/word-image-2682.png" class="wp-image-3057" srcset="/wp-content/uploads/2018/05/word-image-2682.png 481w, /wp-content/uploads/2018/05/word-image-2682-300x60.png 300w" sizes="(max-width: 481px) 100vw, 481px" />
</p>
<p>
  原型对象和构造器的关系：
</p>
<p>
  <img loading="lazy" decoding="async" width="930" height="253" src="/wp-content/uploads/2018/05/word-image-2683.png" class="wp-image-3058" srcset="/wp-content/uploads/2018/05/word-image-2683.png 930w, /wp-content/uploads/2018/05/word-image-2683-300x82.png 300w, /wp-content/uploads/2018/05/word-image-2683-768x209.png 768w" sizes="(max-width: 930px) 100vw, 930px" />
</p>
<p>
  将person中的jineng方法放到它的原型对象中。
</p>
<p>
  <img loading="lazy" decoding="async" width="995" height="421" src="/wp-content/uploads/2018/05/word-image-2684.png" class="wp-image-3059" srcset="/wp-content/uploads/2018/05/word-image-2684.png 995w, /wp-content/uploads/2018/05/word-image-2684-300x127.png 300w, /wp-content/uploads/2018/05/word-image-2684-768x325.png 768w" sizes="(max-width: 995px) 100vw, 995px" />
</p>
<p>
  2、原型链
</p>
<p>
  原型对象也是对象。它也可以充当其他构造器的原型对象。
</p>
<p>
  <img loading="lazy" decoding="async" width="749" height="324" src="/wp-content/uploads/2018/05/word-image-2685.png" class="wp-image-3060" srcset="/wp-content/uploads/2018/05/word-image-2685.png 749w, /wp-content/uploads/2018/05/word-image-2685-300x130.png 300w" sizes="(max-width: 749px) 100vw, 749px" />
</p>
<p>
  上图中，Object对象是person的原型对象，根据person实例化得到p1对象，p1对象是Boy构造器的原型对象，根据Boy实例化得到b1.
</p>
<p>
  <img loading="lazy" decoding="async" width="693" height="336" src="/wp-content/uploads/2018/05/word-image-2686.png" class="wp-image-3061" srcset="/wp-content/uploads/2018/05/word-image-2686.png 693w, /wp-content/uploads/2018/05/word-image-2686-300x145.png 300w" sizes="(max-width: 693px) 100vw, 693px" />
</p>
<p>
  在查找一个对象的成员属性的时候，优先从对象自身查找，如果没有从它的构造方法中查找，如果构造方法中也没有，那么去构造方法的原型对象中查找，如果还没有，那么都构造器的原型对象的构造器中查找，一直找到Object对象为止。这种链式的查找方式就是原型链。
</p>
<p>
  3、扩展内置对象
</p>
<p>
  内置对象有：String、Array、Date、Math、等。
</p>
<p>
  比如使用String对象的方法：
</p>
<p>
  var s = new String(&#8216;hello&#8217;);
</p>
<p>
  s.substr();
</p>
<p>
  String是JavaScript内置的一个构造函数。
</p>
<p>
  如果在String这个构造函数的原型对象上绑定一个方法的话，那么所有的字符串都可以使用这个方法。
</p>
<p>
  其他我们所学的哪些String对象中的方法，都是String的原型中的方法。
</p>
<p>
  <img loading="lazy" decoding="async" width="1114" height="276" src="/wp-content/uploads/2018/05/word-image-2687.png" class="wp-image-3062" srcset="/wp-content/uploads/2018/05/word-image-2687.png 1114w, /wp-content/uploads/2018/05/word-image-2687-300x74.png 300w, /wp-content/uploads/2018/05/word-image-2687-768x190.png 768w, /wp-content/uploads/2018/05/word-image-2687-1024x254.png 1024w" sizes="(max-width: 1114px) 100vw, 1114px" />
</p>
<p>
  4、DOM对象的原型对象
</p>
<p>
  DOM对象实际上就是通过getElement….这类方法获取页面中的元素、属性等生产的对象。
</p>
<p>
  <img loading="lazy" decoding="async" width="834" height="180" src="/wp-content/uploads/2018/05/word-image-2688.png" class="wp-image-3063" srcset="/wp-content/uploads/2018/05/word-image-2688.png 834w, /wp-content/uploads/2018/05/word-image-2688-300x65.png 300w, /wp-content/uploads/2018/05/word-image-2688-768x166.png 768w" sizes="(max-width: 834px) 100vw, 834px" />
</p>
<p>
  完成链式的设置dom对象的css的方法：
</p>
<p>
  <img loading="lazy" decoding="async" width="1065" height="462" src="/wp-content/uploads/2018/05/word-image-2689.png" class="wp-image-3064" srcset="/wp-content/uploads/2018/05/word-image-2689.png 1065w, /wp-content/uploads/2018/05/word-image-2689-300x130.png 300w, /wp-content/uploads/2018/05/word-image-2689-768x333.png 768w, /wp-content/uploads/2018/05/word-image-2689-1024x444.png 1024w" sizes="(max-width: 1065px) 100vw, 1065px" />
</p>
<h1>三、定义类或对象多种方式</h1>
<p>
  手册位置：上面JavaScript  左侧的JavaScript  到页面最下方点击“马上学生JavaScript高级教程吧”  左侧找到定义类或对象
</p>
<p>
  1、原始的定义对象的方式（构造函数方式）
</p>
<p>
  <img loading="lazy" decoding="async" width="706" height="204" src="/wp-content/uploads/2018/05/word-image-2690.png" class="wp-image-3065" srcset="/wp-content/uploads/2018/05/word-image-2690.png 706w, /wp-content/uploads/2018/05/word-image-2690-300x87.png 300w" sizes="(max-width: 706px) 100vw, 706px" />
</p>
<p>
  这种方式创建对象，如果创建多个对象的话，会为每个对象在内存中生成一个新的空间，比较占内存。
</p>
<p>
  2、原型对象方式
</p>
<p>
  <img loading="lazy" decoding="async" width="837" height="292" src="/wp-content/uploads/2018/05/word-image-2691.png" class="wp-image-3066" srcset="/wp-content/uploads/2018/05/word-image-2691.png 837w, /wp-content/uploads/2018/05/word-image-2691-300x105.png 300w, /wp-content/uploads/2018/05/word-image-2691-768x268.png 768w" sizes="(max-width: 837px) 100vw, 837px" />
</p>
<p>
  3、混合方式（构造方法方式+原型对象方式）
</p>
<p>
  原则是：
</p>
<p>
  把所有的对象的成员属性全部写到构造方法中，
</p>
<p>
  把所有的对象的成员方法全部写到原型对象上。
</p>
<p>
  <img loading="lazy" decoding="async" width="771" height="288" src="/wp-content/uploads/2018/05/word-image-2692.png" class="wp-image-3067" srcset="/wp-content/uploads/2018/05/word-image-2692.png 771w, /wp-content/uploads/2018/05/word-image-2692-300x112.png 300w, /wp-content/uploads/2018/05/word-image-2692-768x287.png 768w" sizes="(max-width: 771px) 100vw, 771px" />
</p>
<p>
  4、动态混合方式
</p>
<p>
  有些开发人员认为混合方式看起来不想是一个类，因为成员方法的绑定在构造函数外面，使用动态混合方式可以解决。
</p>
<p>
  <img loading="lazy" decoding="async" width="785" height="492" src="/wp-content/uploads/2018/05/word-image-2693.png" class="wp-image-3068" srcset="/wp-content/uploads/2018/05/word-image-2693.png 785w, /wp-content/uploads/2018/05/word-image-2693-300x188.png 300w, /wp-content/uploads/2018/05/word-image-2693-768x481.png 768w" sizes="(max-width: 785px) 100vw, 785px" />
</p>
<p>
  5、到底采用哪种方式
</p>
<p>
  在开发中，用的最多的就是混合方式和动态混合方式。
</p>
<h1>四、私有和封装</h1>
<p>
  在JavaScript中，没有类，那么只能模拟私有的成员。
</p>
<p>
  <img loading="lazy" decoding="async" width="599" height="358" src="/wp-content/uploads/2018/05/word-image-2694.png" class="wp-image-3069" srcset="/wp-content/uploads/2018/05/word-image-2694.png 599w, /wp-content/uploads/2018/05/word-image-2694-300x179.png 300w" sizes="(max-width: 599px) 100vw, 599px" />
</p>
<h1>五、静态属性和方法</h1>
<p>
  PHP中调用静态成员：类名::成员
</p>
<p>
  <img loading="lazy" decoding="async" width="747" height="189" src="/wp-content/uploads/2018/05/word-image-2695.png" class="wp-image-3070" srcset="/wp-content/uploads/2018/05/word-image-2695.png 747w, /wp-content/uploads/2018/05/word-image-2695-300x76.png 300w" sizes="(max-width: 747px) 100vw, 747px" />
</p>
<h1>六、继承</h1>
<p>
  1、原型链方式继承
</p>
<p>
  通过指定构造函数的原型对象方式，可以实现继承。
</p>
<p>
  <img loading="lazy" decoding="async" width="749" height="272" src="/wp-content/uploads/2018/05/word-image-2696.png" class="wp-image-3071" srcset="/wp-content/uploads/2018/05/word-image-2696.png 749w, /wp-content/uploads/2018/05/word-image-2696-300x109.png 300w" sizes="(max-width: 749px) 100vw, 749px" />
</p>
<p>
  2、对象冒充方式继承
</p>
<p>
  1、原始的对象冒充
</p>
<p>
  <img loading="lazy" decoding="async" width="906" height="470" src="/wp-content/uploads/2018/05/word-image-2697.png" class="wp-image-3072" srcset="/wp-content/uploads/2018/05/word-image-2697.png 906w, /wp-content/uploads/2018/05/word-image-2697-300x156.png 300w, /wp-content/uploads/2018/05/word-image-2697-768x398.png 768w" sizes="(max-width: 906px) 100vw, 906px" />
</p>
<p>
  2、call和apply完成继承
</p>
<p>
  <img loading="lazy" decoding="async" width="1076" height="317" src="/wp-content/uploads/2018/05/word-image-2698.png" class="wp-image-3073" srcset="/wp-content/uploads/2018/05/word-image-2698.png 1076w, /wp-content/uploads/2018/05/word-image-2698-300x88.png 300w, /wp-content/uploads/2018/05/word-image-2698-768x226.png 768w, /wp-content/uploads/2018/05/word-image-2698-1024x302.png 1024w" sizes="(max-width: 1076px) 100vw, 1076px" />
</p>
<p>
  3、实际开发中，使用哪种方式实现继承
</p>
<p>
  答案是使用混合方式，对于成员属性，使用对象冒充方式，对于成员方法，使用原型链方式
</p>
<p>
  <img loading="lazy" decoding="async" width="757" height="320" src="/wp-content/uploads/2018/05/word-image-2699.png" class="wp-image-3074" srcset="/wp-content/uploads/2018/05/word-image-2699.png 757w, /wp-content/uploads/2018/05/word-image-2699-300x127.png 300w" sizes="(max-width: 757px) 100vw, 757px" />
</p>
<h1>七、操作符instanceof</h1>
<p>
  用来判断一个对象的构造器是否是xxx
</p>
<p>
  语法：Obj instanceof Constructor
</p>
<p>
  <img loading="lazy" decoding="async" width="680" height="335" src="/wp-content/uploads/2018/05/word-image-2700.png" class="wp-image-3075" srcset="/wp-content/uploads/2018/05/word-image-2700.png 680w, /wp-content/uploads/2018/05/word-image-2700-300x148.png 300w" sizes="(max-width: 680px) 100vw, 680px" />
</p>
<p>
  person的prototype是Object对象，Object对象的构造器是Object函数，所以检测p1的构造器的时候，person和Object都返回true。
</p>
<h1>八、for…in</h1>
<p>
  用来遍历数组和对象的。
</p>
<p>
  语法：
</p>
<p>
  for(var x in arr){
</p>
<p>
  	//通过指定下标的形式，找到数组的每个单元，如 arr[x];
</p>
<p>
  }
</p>
<p>
  <img loading="lazy" decoding="async" width="973" height="352" src="/wp-content/uploads/2018/05/word-image-2701.png" class="wp-image-3076" srcset="/wp-content/uploads/2018/05/word-image-2701.png 973w, /wp-content/uploads/2018/05/word-image-2701-300x109.png 300w, /wp-content/uploads/2018/05/word-image-2701-768x278.png 768w" sizes="(max-width: 973px) 100vw, 973px" />
</p>
<h1>九、顶层函数</h1>
<p>
  顶层函数也就是全局函数，这些函数的调用不需要使用对象去调用。
</p>
<p>
  比如有Number()、String()。
</p>
<p>
  在手册的位置：上方的JavaScript  左侧的JavaScript  右侧的参考书  左侧JavaScript对象列表中有一个Functions.
</p>
<p>
  <img loading="lazy" decoding="async" width="1218" height="181" src="/wp-content/uploads/2018/05/word-image-2702.png" class="wp-image-3077" srcset="/wp-content/uploads/2018/05/word-image-2702.png 1218w, /wp-content/uploads/2018/05/word-image-2702-300x45.png 300w, /wp-content/uploads/2018/05/word-image-2702-768x114.png 768w, /wp-content/uploads/2018/05/word-image-2702-1024x152.png 1024w" sizes="(max-width: 1218px) 100vw, 1218px" />
</p>
<p>
  encodeURI()不会对“：;/?:@&amp;=+$,#”进行编码，如果要对这些字符进行编码的话，使用encodeURIComponent()；
</p>
<p>
  <img loading="lazy" decoding="async" width="800" height="184" src="/wp-content/uploads/2018/05/word-image-2703.png" class="wp-image-3078" srcset="/wp-content/uploads/2018/05/word-image-2703.png 800w, /wp-content/uploads/2018/05/word-image-2703-300x69.png 300w, /wp-content/uploads/2018/05/word-image-2703-768x177.png 768w" sizes="(max-width: 800px) 100vw, 800px" />
</p>
<h1>十、面向对象应用案例 – 贪吃蛇</h1>
<p>
  1、分析
</p>
<p>
  游戏有有三个对象，一个地图、一个食物、一条蛇。
</p>
<p>
  所以默认先创建三个对象。
</p>
<p>
  <img loading="lazy" decoding="async" width="400" height="261" src="/wp-content/uploads/2018/05/word-image-2704.png" class="wp-image-3079" srcset="/wp-content/uploads/2018/05/word-image-2704.png 400w, /wp-content/uploads/2018/05/word-image-2704-300x196.png 300w" sizes="(max-width: 400px) 100vw, 400px" />
</p>
<p>
  2、完成地图类（构造函数）
</p>
<p>
  地图有宽、高、背景颜色。这都是地图这个对象属性。
</p>
<p>
  <img loading="lazy" decoding="async" width="900" height="551" src="/wp-content/uploads/2018/05/word-image-2705.png" class="wp-image-3080" srcset="/wp-content/uploads/2018/05/word-image-2705.png 900w, /wp-content/uploads/2018/05/word-image-2705-300x184.png 300w, /wp-content/uploads/2018/05/word-image-2705-768x470.png 768w" sizes="(max-width: 900px) 100vw, 900px" />
</p>
<p>
  3、完成食物类
</p>
<p>
  <img loading="lazy" decoding="async" width="939" height="565" src="/wp-content/uploads/2018/05/word-image-2706.png" class="wp-image-3081" srcset="/wp-content/uploads/2018/05/word-image-2706.png 939w, /wp-content/uploads/2018/05/word-image-2706-300x181.png 300w, /wp-content/uploads/2018/05/word-image-2706-768x462.png 768w" sizes="(max-width: 939px) 100vw, 939px" />
</p>
<p>
  计算食物的left和top的方案：
</p>
<p>
  <img loading="lazy" decoding="async" width="1143" height="603" src="/wp-content/uploads/2018/05/word-image-2707.png" class="wp-image-3082" srcset="/wp-content/uploads/2018/05/word-image-2707.png 1143w, /wp-content/uploads/2018/05/word-image-2707-300x158.png 300w, /wp-content/uploads/2018/05/word-image-2707-768x405.png 768w, /wp-content/uploads/2018/05/word-image-2707-1024x540.png 1024w" sizes="(max-width: 1143px) 100vw, 1143px" />
</p>
<p>
  把食物放到地图中：
</p>
<p>
  首先把Map类的对象，升级为全局变量。
</p>
<p>
  <img loading="lazy" decoding="async" width="596" height="106" src="/wp-content/uploads/2018/05/word-image-2708.png" class="wp-image-3083" srcset="/wp-content/uploads/2018/05/word-image-2708.png 596w, /wp-content/uploads/2018/05/word-image-2708-300x53.png 300w" sizes="(max-width: 596px) 100vw, 596px" />
</p>
<p>
  <img loading="lazy" decoding="async" width="570" height="149" src="/wp-content/uploads/2018/05/word-image-2709.png" class="wp-image-3084" srcset="/wp-content/uploads/2018/05/word-image-2709.png 570w, /wp-content/uploads/2018/05/word-image-2709-300x78.png 300w" sizes="(max-width: 570px) 100vw, 570px" />
</p>
<p>
  在地图类中用一个成员属性_map表示地图那个div
</p>
<p>
  <img loading="lazy" decoding="async" width="829" height="416" src="/wp-content/uploads/2018/05/word-image-2710.png" class="wp-image-3085" srcset="/wp-content/uploads/2018/05/word-image-2710.png 829w, /wp-content/uploads/2018/05/word-image-2710-300x151.png 300w, /wp-content/uploads/2018/05/word-image-2710-768x385.png 768w" sizes="(max-width: 829px) 100vw, 829px" />
</p>
<p>
  把食物放到地图上：
</p>
<p>
  <img loading="lazy" decoding="async" width="762" height="389" src="/wp-content/uploads/2018/05/word-image-2711.png" class="wp-image-3086" srcset="/wp-content/uploads/2018/05/word-image-2711.png 762w, /wp-content/uploads/2018/05/word-image-2711-300x153.png 300w" sizes="(max-width: 762px) 100vw, 762px" />
</p>
<p>
  4、开发一条静态的小蛇
</p>
<p>
  蛇是由三个小div组成，每个小div都有宽度、高度、背景颜色、定位。
</p>
<p>
  <img loading="lazy" decoding="async" width="1028" height="523" src="/wp-content/uploads/2018/05/word-image-2712.png" class="wp-image-3087" srcset="/wp-content/uploads/2018/05/word-image-2712.png 1028w, /wp-content/uploads/2018/05/word-image-2712-300x153.png 300w, /wp-content/uploads/2018/05/word-image-2712-768x391.png 768w, /wp-content/uploads/2018/05/word-image-2712-1024x521.png 1024w" sizes="(max-width: 1028px) 100vw, 1028px" />
</p>
<p>
  将蛇显示在地图上：
</p>
<p>
  <img loading="lazy" decoding="async" width="612" height="180" src="/wp-content/uploads/2018/05/word-image-2713.png" class="wp-image-3088" srcset="/wp-content/uploads/2018/05/word-image-2713.png 612w, /wp-content/uploads/2018/05/word-image-2713-300x88.png 300w" sizes="(max-width: 612px) 100vw, 612px" />
</p>
<p>
  5、蛇移动
</p>
<p>
  写一个蛇移动的方法，这个方法实际上就是改变蛇的坐标即可。
</p>
<p>
  <img loading="lazy" decoding="async" width="817" height="393" src="/wp-content/uploads/2018/05/word-image-2714.png" class="wp-image-3089" srcset="/wp-content/uploads/2018/05/word-image-2714.png 817w, /wp-content/uploads/2018/05/word-image-2714-300x144.png 300w, /wp-content/uploads/2018/05/word-image-2714-768x369.png 768w" sizes="(max-width: 817px) 100vw, 817px" />
</p>
<p>
  每隔两秒调用一个move方法，并重新生成蛇。
</p>
<p>
  <img loading="lazy" decoding="async" width="650" height="249" src="/wp-content/uploads/2018/05/word-image-2715.png" class="wp-image-3090" srcset="/wp-content/uploads/2018/05/word-image-2715.png 650w, /wp-content/uploads/2018/05/word-image-2715-300x115.png 300w" sizes="(max-width: 650px) 100vw, 650px" />
</p>
<p>
  从新显示蛇的时候，会发现蛇越来越长，原因是每次显示蛇（show方法调用的时候），都会重新创建一个div，这样的话，div会越来越多，解决的办法是判断：
</p>
<p>
  <img loading="lazy" decoding="async" width="1051" height="557" src="/wp-content/uploads/2018/05/word-image-2716.png" class="wp-image-3091" srcset="/wp-content/uploads/2018/05/word-image-2716.png 1051w, /wp-content/uploads/2018/05/word-image-2716-300x159.png 300w, /wp-content/uploads/2018/05/word-image-2716-768x407.png 768w, /wp-content/uploads/2018/05/word-image-2716-1024x543.png 1024w" sizes="(max-width: 1051px) 100vw, 1051px" />
</p>
<p>
  6、控制蛇的方向
</p>
<p>
  通过按键（上下左右键）控制蛇的运动方向
</p>
<p>
  1、通过按键获取键盘的keyCode
</p>
<p>
  2、将keyCode传递给snake类的direct方法<br />
  <img loading="lazy" decoding="async" width="574" height="332" src="/wp-content/uploads/2018/05/word-image-2717.png" class="wp-image-3092" srcset="/wp-content/uploads/2018/05/word-image-2717.png 574w, /wp-content/uploads/2018/05/word-image-2717-300x174.png 300w" sizes="(max-width: 574px) 100vw, 574px" />
</p>
<p>
  3、direct方法设置蛇的方向的属性directtion
</p>
<p>
  <img loading="lazy" decoding="async" width="746" height="505" src="/wp-content/uploads/2018/05/word-image-2718.png" class="wp-image-3093" srcset="/wp-content/uploads/2018/05/word-image-2718.png 746w, /wp-content/uploads/2018/05/word-image-2718-300x203.png 300w, /wp-content/uploads/2018/05/word-image-2718-220x150.png 220w" sizes="(max-width: 746px) 100vw, 746px" />
</p>
<p>
  4、在move方法中，根据directtion属性，设置蛇头的坐标
</p>
<p>
  <img loading="lazy" decoding="async" width="795" height="512" src="/wp-content/uploads/2018/05/word-image-2719.png" class="wp-image-3094" srcset="/wp-content/uploads/2018/05/word-image-2719.png 795w, /wp-content/uploads/2018/05/word-image-2719-300x193.png 300w, /wp-content/uploads/2018/05/word-image-2719-768x495.png 768w" sizes="(max-width: 795px) 100vw, 795px" />
</p>
<p>
  7、吃食物
</p>
<p>
  判断，如果蛇头的坐标和食物的坐标一致，就表示吃到了
</p>
<p>
  <img loading="lazy" decoding="async" width="900" height="215" src="/wp-content/uploads/2018/05/word-image-2720.png" class="wp-image-3095" srcset="/wp-content/uploads/2018/05/word-image-2720.png 900w, /wp-content/uploads/2018/05/word-image-2720-300x72.png 300w, /wp-content/uploads/2018/05/word-image-2720-768x183.png 768w" sizes="(max-width: 900px) 100vw, 900px" />
</p>
<p>
  解决食物不会减少的问题：
</p>
<p>
  <img loading="lazy" decoding="async" width="804" height="537" src="/wp-content/uploads/2018/05/word-image-2721.png" class="wp-image-3096" srcset="/wp-content/uploads/2018/05/word-image-2721.png 804w, /wp-content/uploads/2018/05/word-image-2721-300x200.png 300w, /wp-content/uploads/2018/05/word-image-2721-768x513.png 768w" sizes="(max-width: 804px) 100vw, 804px" />
</p>
<p>
  8、其他问题还有，越来越快，快到某一个点应该保持这个速度就可以了
</p>
<p>
  9、边界问题，判断蛇头的坐标是否超出边界的坐标
</p>
<p>
  10、不能撞自身，判断蛇头坐标是否和蛇身中的某一节坐标相同</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e5%89%8d%e7%ab%af%e6%8a%80%e6%9c%af/3053.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>面向对象（一）$This、 子类、 实例化、 对象、 封装、 属性操作、 构造函数、 析构函数、 父类、 类、 继承、 访问修饰符</title>
		<link>/php/1789.html</link>
					<comments>/php/1789.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Fri, 18 May 2018 13:04:34 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[面向对象]]></category>
		<category><![CDATA[面向对象编程]]></category>
		<category><![CDATA[$This]]></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>
		<category><![CDATA[访问修饰符]]></category>
		<guid isPermaLink="false">/?p=1789</guid>

					<description><![CDATA[面向对象（一） 常见的编程思想 面向过程思想 通过程序的执行顺序为主线开发代码 优点：简单，易学，上手快。 缺 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>面向对象（一）</h1>
<h2>常见的编程思想</h2>
<h3>面向过程思想</h3>
<p>
  通过程序的执行顺序为主线开发代码
</p>
<p>
  优点：简单，易学，上手快。
</p>
<p>
  缺点：多人合作不方便
</p>
<h3>面向对象思想</h3>
<p>
  以组成项目的对象为主线进行开发。在面向对象的思想里面，所有的事物都看成对象。
</p>
<p>
  优点：多人合作方便，代码冗余很少
</p>
<p>
  缺点：学起来比面向过程复杂。
</p>
<h2>面向对象简介</h2>
<p>
  OOP：面向对象编程（Object Oriented Programming），OOP，面向对象编程
</p>
<p>
  OOAD：OOA和OOD
</p>
<p>
  OOA: 面向对象分析(Object-Oriented Analysis,OOA)
</p>
<p>
  OOD: 面向对象设计（Object-Oriented Design，OOD）
</p>
<h3>对象</h3>
<p>
  对象是由属性和方法组成的
</p>
<p>
  属性的本质就是变量
</p>
<p>
  方法的本质就是函数
</p>
<p><img loading="lazy" decoding="async" width="666" height="269" src="/wp-content/uploads/2018/05/word-image-1568.png" class="wp-image-1791" srcset="/wp-content/uploads/2018/05/word-image-1568.png 666w, /wp-content/uploads/2018/05/word-image-1568-300x121.png 300w" sizes="(max-width: 666px) 100vw, 666px" /></p>
<h3>类</h3>
<p>
  类是所有对象共同的属性和方法的组合。
</p>
<p>
  我们在开发时候是通过调用对象的方法或属性来实现某个效果，要调用方法必须先有对象，要想有对象必须先有类。
</p>
<p>
  开发顺序：类——（实例化）对象——调用对象的方法和属性。
</p>
<h3>类和对象的关系</h3>
<p>
  通过类可以创建多个对象，类就类似于模具，一个模具制造很多形状一致的对象。
</p>
<p><img loading="lazy" decoding="async" width="456" height="304" src="/wp-content/uploads/2018/05/word-image-1569.png" class="wp-image-1792" srcset="/wp-content/uploads/2018/05/word-image-1569.png 456w, /wp-content/uploads/2018/05/word-image-1569-300x200.png 300w" sizes="(max-width: 456px) 100vw, 456px" /></p>
<h3>类是有父类和子类之分的</h3>
<p><img loading="lazy" decoding="async" width="692" height="245" src="/wp-content/uploads/2018/05/word-image-1570.png" class="wp-image-1793" srcset="/wp-content/uploads/2018/05/word-image-1570.png 692w, /wp-content/uploads/2018/05/word-image-1570-300x106.png 300w" sizes="(max-width: 692px) 100vw, 692px" /></p>
<p>
  再比如：老师是类，语文老师也是类，老师是父类，语文老师是子类。
</p>
<h2>在PHP中实现类</h2>
<h3>语法</h3>
<p>
  class 类名{
</p>
<p>
  	//属性
</p>
<p>
  	//方法
</p>
<p>
  	//常量
</p>
<p>
  }
</p>
<h3>类名的命名规则</h3>
<ol>
<li>
  以字母、下划线开头，后面跟的是字母、数字、下划线
</li>
<li>
  一般用帕斯卡命名法
</li>
<li>
  不能用PHP关键字做类名
</li>
<li>
  类名不区分大小写
</li>
</ol>
<h3>实例化对象</h3>
<p>
  实例化：创造实例（对象）的过程
</p>
<p>
  通过new关键字实例化
</p>
<p>
  $对象名=new 类名()
</p>
<p>
  例题
</p>
<p><img loading="lazy" decoding="async" width="542" height="248" src="/wp-content/uploads/2018/05/word-image-1571.png" class="wp-image-1794" srcset="/wp-content/uploads/2018/05/word-image-1571.png 542w, /wp-content/uploads/2018/05/word-image-1571-300x137.png 300w" sizes="(max-width: 542px) 100vw, 542px" /></p>
<h2>对象的传递</h2>
<p>
  对象的传递的地址传递
</p>
<p><img loading="lazy" decoding="async" width="839" height="206" src="/wp-content/uploads/2018/05/word-image-1572.png" class="wp-image-1795" srcset="/wp-content/uploads/2018/05/word-image-1572.png 839w, /wp-content/uploads/2018/05/word-image-1572-300x74.png 300w, /wp-content/uploads/2018/05/word-image-1572-768x189.png 768w" sizes="(max-width: 839px) 100vw, 839px" /></p>
<h2>操作属性</h2>
<p>
  对象调用属性和方法使用“-&gt;”，
</p>
<p>
  语法：
</p>
<p>
  对象名-&gt;属性
</p>
<p>
  对象名-&gt;方法名()
</p>
<p>
  &lt;?php
</p>
<p>
  //类
</p>
<p>
  class Student {
</p>
<p>
  	public $name;	     //语法结构：访问修饰符+变量名
</p>
<p>
  }
</p>
<p>
  //实例化
</p>
<p>
  $stu1=new Student;						//类名后不加()也可以
</p>
<p>
  $stu2=new Student();					//类名后加()也可以
</p>
<p>
  $stu1-&gt;name=&#8217;tom&#8217;;						//操作1、给属性赋值
</p>
<p>
  echo $stu1-&gt;name,'&lt;br&gt;&#8217;;	//tom		//操作2、显示属性的值
</p>
<p>
  $stu1-&gt;add=&#8217;beijing&#8217;;					//操作3、给stu1对象添加add属性
</p>
<p>
  unset($stu2-&gt;name);						//操作4、删除stu2对象的name属性
</p>
<p>
  var_dump(isset($stu1-&gt;name));//bool(true) 	//操作5：判断属性是否存在
</p>
<h2>定义方法</h2>
<p>
  语法结构
</p>
<p>
  访问修饰符 function 方法名(参数){
</p>
<p>
  	//方法体
</p>
<p>
  }
</p>
<p>
  例题
</p>
<p><img loading="lazy" decoding="async" width="567" height="214" src="/wp-content/uploads/2018/05/word-image-1573.png" class="wp-image-1796" srcset="/wp-content/uploads/2018/05/word-image-1573.png 567w, /wp-content/uploads/2018/05/word-image-1573-300x113.png 300w" sizes="(max-width: 567px) 100vw, 567px" /></p>
<h2>对象的比较</h2>
<p>
  全等：指向同一个对象是全等
</p>
<p>
  相等：只要属于同一个类，结构和属性值都一致才相等
</p>
<p><img loading="lazy" decoding="async" width="777" height="345" src="/wp-content/uploads/2018/05/word-image-1574.png" class="wp-image-1797" srcset="/wp-content/uploads/2018/05/word-image-1574.png 777w, /wp-content/uploads/2018/05/word-image-1574-300x133.png 300w, /wp-content/uploads/2018/05/word-image-1574-768x341.png 768w" sizes="(max-width: 777px) 100vw, 777px" /><br />
<img loading="lazy" decoding="async" width="724" height="381" src="/wp-content/uploads/2018/05/word-image-1575.png" class="wp-image-1798" srcset="/wp-content/uploads/2018/05/word-image-1575.png 724w, /wp-content/uploads/2018/05/word-image-1575-300x158.png 300w" sizes="(max-width: 724px) 100vw, 724px" /></p>
<h2>访问修饰符</h2>
<p>
  用来修饰属性和方法，控制属性和方法的权限
</p>
<table>
<tr>
<td>
<p>
  访问修饰符
</p>
</td>
<td>
<p>
  描述
</p>
</td>
</tr>
<tr>
<td>
<p>
   Public（公有的）
</p>
</td>
<td>
<p>
  在类的内部和外部都能访问
</p>
</td>
</tr>
<tr>
<td>
<p>
   private（私有的）
</p>
</td>
<td>
<p>
  只能在类的内部访问
</p>
</td>
</tr>
<tr>
<td>
<p>
  protected（受保护的）
</p>
</td>
<td>
<p>
  在整个继承链上访问
</p>
</td>
</tr>
</table>
<p>
  例题一
</p>
<p><img loading="lazy" decoding="async" width="1080" height="240" src="/wp-content/uploads/2018/05/word-image-1576.png" class="wp-image-1799" srcset="/wp-content/uploads/2018/05/word-image-1576.png 1080w, /wp-content/uploads/2018/05/word-image-1576-300x67.png 300w, /wp-content/uploads/2018/05/word-image-1576-768x171.png 768w, /wp-content/uploads/2018/05/word-image-1576-1024x228.png 1024w" sizes="(max-width: 1080px) 100vw, 1080px" /></p>
<p>
  脚下留心：一般来说，属性都是私有的，通过公有的方法对私有的属性进行赋值和取值。这样做可以在方法中对数据进行过滤，提高数据安全性。
</p>
<p>
  &lt;?php
</p>
<p>
  class Student {
</p>
<p>
  	public $name;	//私有属性
</p>
<p>
  	public $sex;	//私有属性
</p>
<p>
  	//通过公有的方法进行赋值
</p>
<p>
  	public function setInfo($name,$sex) {
</p>
<p>
  		if($sex!=&#8217;男&#8217; &amp;&amp; $sex!=&#8217;女&#8217;){
</p>
<p>
  			echo &#8216;性别只能是男或女&lt;br&gt;&#8217;;
</p>
<p>
  			return;
</p>
<p>
  		}
</p>
<p>
  		$this-&gt;name=$name;  //$this表示调用当前方法的对象
</p>
<p>
  		$this-&gt;sex=$sex;
</p>
<p>
  	}
</p>
<p>
  	//通过公有的方法进行取值
</p>
<p>
  	public function getInfo() {
</p>
<p>
  		echo &#8216;姓名：&#8217;.$this-&gt;name,'&lt;br&gt;&#8217;;
</p>
<p>
  		echo &#8216;性别：&#8217;.$this-&gt;sex.'&lt;hr&gt;&#8217;;
</p>
<p>
  	}
</p>
<p>
  }
</p>
<p>
  //调用
</p>
<p>
  header(&#8216;Content-Type:text/html;charset=utf-8&#8217;);
</p>
<p>
  $stu1=new Student;
</p>
<p>
  $stu1-&gt;setInfo(&#8216;tom&#8217;,&#8217;男&#8217;);
</p>
<p>
  $stu1-&gt;getInfo();
</p>
<p>
  $stu2=new Student;
</p>
<p>
  $stu2-&gt;setInfo(&#8216;berry&#8217;,&#8217;女&#8217;);
</p>
<p>
  $stu2-&gt;getInfo();
</p>
<p><img loading="lazy" decoding="async" width="510" height="189" src="/wp-content/uploads/2018/05/word-image-1577.png" class="wp-image-1800" srcset="/wp-content/uploads/2018/05/word-image-1577.png 510w, /wp-content/uploads/2018/05/word-image-1577-300x111.png 300w" sizes="(max-width: 510px) 100vw, 510px" /></p>
<h2>$this</h2>
<p>
  $this在方法的内部使用，表示调用当前方法的对象。
</p>
<h2>构造函数</h2>
<p>
  普通方法不调用就不执行
</p>
<p>
  构造函数也叫构造方法，在实例化对象的时候自动调用执行
</p>
<h3>语法一：</h3>
<p>
  Public function __construct(){
</p>
<p>
  }
</p>
<p>
  脚下留心：__construct()前面是两个下划线。
</p>
<p><img loading="lazy" decoding="async" width="597" height="171" src="/wp-content/uploads/2018/05/word-image-1578.png" class="wp-image-1801" srcset="/wp-content/uploads/2018/05/word-image-1578.png 597w, /wp-content/uploads/2018/05/word-image-1578-300x86.png 300w" sizes="(max-width: 597px) 100vw, 597px" /></p>
<h3>语法二：和类名同名的函数是构造函数</h3>
<p>
  Public function 类名(){
</p>
<p>
  }
</p>
<p>
  例题
</p>
<p><img loading="lazy" decoding="async" width="660" height="173" src="/wp-content/uploads/2018/05/word-image-1579.png" class="wp-image-1802" srcset="/wp-content/uploads/2018/05/word-image-1579.png 660w, /wp-content/uploads/2018/05/word-image-1579-300x79.png 300w" sizes="(max-width: 660px) 100vw, 660px" /></p>
<p>
  脚下留心：推荐使用__construct(),因为__construct()的优先级最高。
</p>
<p><img loading="lazy" decoding="async" width="843" height="198" src="/wp-content/uploads/2018/05/word-image-1580.png" class="wp-image-1803" srcset="/wp-content/uploads/2018/05/word-image-1580.png 843w, /wp-content/uploads/2018/05/word-image-1580-300x70.png 300w, /wp-content/uploads/2018/05/word-image-1580-768x180.png 768w" sizes="(max-width: 843px) 100vw, 843px" /></p>
<h3>构造函数用来初始化成员变量</h3>
<p>
  成员变量就是属性
</p>
<p><img loading="lazy" decoding="async" width="845" height="415" src="/wp-content/uploads/2018/05/word-image-1581.png" class="wp-image-1804" srcset="/wp-content/uploads/2018/05/word-image-1581.png 845w, /wp-content/uploads/2018/05/word-image-1581-300x147.png 300w, /wp-content/uploads/2018/05/word-image-1581-768x377.png 768w" sizes="(max-width: 845px) 100vw, 845px" /></p>
<h2>析构函数</h2>
<p>
  当对象销毁的时候自动调用
</p>
<h3>语法</h3>
<p>
  Public function __destruct(){
</p>
<p>
  }
</p>
<h3>代码</h3>
<p><img loading="lazy" decoding="async" width="788" height="419" src="/wp-content/uploads/2018/05/word-image-1582.png" class="wp-image-1805" srcset="/wp-content/uploads/2018/05/word-image-1582.png 788w, /wp-content/uploads/2018/05/word-image-1582-300x160.png 300w, /wp-content/uploads/2018/05/word-image-1582-768x408.png 768w" sizes="(max-width: 788px) 100vw, 788px" /></p>
<p>
  脚下留心：
</p>
<ol>
<li>
  构造函数和析构函数是PHP自己调用，不能手动调用
</li>
<li>
  构造函数可以带有参数，析构函数不能带有参数。
</li>
</ol>
<p>
  多学一招：数据的存储和销毁分为两种情况:先进先出（队列）
</p>
<p><img loading="lazy" decoding="async" width="643" height="124" src="/wp-content/uploads/2018/05/word-image-1583.png" class="wp-image-1806" srcset="/wp-content/uploads/2018/05/word-image-1583.png 643w, /wp-content/uploads/2018/05/word-image-1583-300x58.png 300w" sizes="(max-width: 643px) 100vw, 643px" /></p>
<p>
  先进后出（出入栈）
</p>
<p><img loading="lazy" decoding="async" width="311" height="189" src="/wp-content/uploads/2018/05/word-image-1584.png" class="wp-image-1807" srcset="/wp-content/uploads/2018/05/word-image-1584.png 311w, /wp-content/uploads/2018/05/word-image-1584-300x182.png 300w" sizes="(max-width: 311px) 100vw, 311px" /></p>
<h2>对象在内存中的分布</h2>
<p>
  对象的本质就是复杂变量
</p>
<p>
  类的本质就是复杂的数据类型
</p>
<p>
  分析如下代码
</p>
<p>
  &lt;?php
</p>
<p>
  class Student {
</p>
<p>
  	private $name;
</p>
<p>
  	private $sex;
</p>
<p>
  	public function show() {
</p>
<p>
  		echo &#8216;i am a student&lt;br&gt;&#8217;;
</p>
<p>
  	}
</p>
<p>
  }
</p>
<p>
  $stu1=new Student();	//将堆区的地址付给栈区的$stu1
</p>
<p>
  $stu1-&gt;show();
</p>
<p>
  $stu2=new Student();
</p>
<p>
  $stu2-&gt;show();
</p>
<p>
  在内存中结构
</p>
<p><img loading="lazy" decoding="async" width="1032" height="281" src="/wp-content/uploads/2018/05/word-image-1585.png" class="wp-image-1808" srcset="/wp-content/uploads/2018/05/word-image-1585.png 1032w, /wp-content/uploads/2018/05/word-image-1585-300x82.png 300w, /wp-content/uploads/2018/05/word-image-1585-768x209.png 768w, /wp-content/uploads/2018/05/word-image-1585-1024x279.png 1024w" sizes="(max-width: 1032px) 100vw, 1032px" /></p>
<p>
  堆区特点：体积大，查询速度慢
</p>
<p>
  栈区特点：体积小，查询速度快
</p>
<p>
  基本数据类型的数据都存放在栈区中；复杂数据类型都存储在堆区中，但是堆区中的地址保存到栈区中。
</p>
<h2>继承</h2>
<ol>
<li>
  代码具有层次结构
</li>
<li>
  子类继承了父类的属性和方法，实现了代码的可重用性。
</li>
</ol>
<h3>语法</h3>
<p>
  Class 子类 extends 父类{
</p>
<p>
  }
</p>
<h3>继承的例题</h3>
<p>
  &lt;?php
</p>
<p>
  //父类
</p>
<p>
  class Person {
</p>
<p>
  	public $name=&#8217;tom&#8217;;
</p>
<p>
  	public function show() {
</p>
<p>
  		echo &#8216;i am a boy!&#8217;;
</p>
<p>
  	}
</p>
<p>
  }
</p>
<p>
  //子类
</p>
<p>
  class Student extends Person {
</p>
<p>
  }
</p>
<p>
  //测试
</p>
<p>
  $stu=new Student();
</p>
<p>
  echo $stu-&gt;name,'&lt;br&gt;&#8217;;
</p>
<p>
  $stu-&gt;show();
</p>
<p><img loading="lazy" decoding="async" width="375" height="66" src="/wp-content/uploads/2018/05/word-image-1586.png" class="wp-image-1809" srcset="/wp-content/uploads/2018/05/word-image-1586.png 375w, /wp-content/uploads/2018/05/word-image-1586-300x53.png 300w" sizes="(max-width: 375px) 100vw, 375px" /></p>
<p>
  分析：$stu-&gt;name执行过程，首先在Student中寻找$name,如果找到就访问，如果找不到，就到Person类中找$name。
</p>
<h3>调用父类的属性和方法</h3>
<p>
  在子类中通过$this关键字可以调用父类属性和方法
</p>
<p><img loading="lazy" decoding="async" width="964" height="398" src="/wp-content/uploads/2018/05/word-image-1587.png" class="wp-image-1810" srcset="/wp-content/uploads/2018/05/word-image-1587.png 964w, /wp-content/uploads/2018/05/word-image-1587-300x124.png 300w, /wp-content/uploads/2018/05/word-image-1587-768x317.png 768w" sizes="(max-width: 964px) 100vw, 964px" /></p>
<h3>调用父类的构造方法</h3>
<table>
<tr>
<td>
<p>
  父类的构造方法
</p>
</td>
<td>
<p>
  子类的构造方法
</p>
</td>
<td>
<p>
  实例化子类
</p>
</td>
</tr>
<tr>
<td>
<p>
  没有
</p>
</td>
<td>
<p>
  有
</p>
</td>
<td>
<p>
  调用子类构造方法
</p>
</td>
</tr>
<tr>
<td>
<p>
  有
</p>
</td>
<td>
<p>
  没有
</p>
</td>
<td>
<p>
  调用父类构造方法
</p>
</td>
</tr>
<tr>
<td>
<p>
  有
</p>
</td>
<td>
<p>
  有
</p>
</td>
<td>
<p>
  调用子类构造方法
</p>
</td>
</tr>
</table>
<p>
  总结一句话：如果子类有构造方法就调用子类的，如果子类没有就调用父类的。
</p>
<p>
  通过parent::__construct()调用父类的构造函数
</p>
<p><img loading="lazy" decoding="async" width="993" height="430" src="/wp-content/uploads/2018/05/word-image-1588.png" class="wp-image-1811" srcset="/wp-content/uploads/2018/05/word-image-1588.png 993w, /wp-content/uploads/2018/05/word-image-1588-300x130.png 300w, /wp-content/uploads/2018/05/word-image-1588-768x333.png 768w" sizes="(max-width: 993px) 100vw, 993px" /></p>
<p>
  Parent表示父类的名字
</p>
<h3>给父类传递参数</h3>
<p>
  &lt;?php
</p>
<p>
  //父类
</p>
<p>
  class Person {
</p>
<p>
  	protected $name;
</p>
<p>
  	protected $sex;
</p>
<p>
  	public function __construct($name,$sex) {
</p>
<p>
  		$this-&gt;name=$name;
</p>
<p>
  		$this-&gt;sex=$sex;
</p>
<p>
  	}
</p>
<p>
  }
</p>
<p>
  //子类
</p>
<p>
  class Student extends Person {
</p>
<p>
  	private $score;
</p>
<p>
  	public function __construct($name,$sex,$score) {
</p>
<p>
  		parent::__construct($name,$sex);//调用父类的构造函数
</p>
<p>
  		$this-&gt;score=$score;
</p>
<p>
  	}
</p>
<p>
  	public function show() {
</p>
<p>
  		echo &#8220;姓名：{$this-&gt;name}&lt;br&gt;&#8221;;
</p>
<p>
  		echo &#8220;性别：{$this-&gt;sex}&lt;br&gt;&#8221;;
</p>
<p>
  		echo &#8220;成绩：{$this-&gt;score}&lt;br&gt;&#8221;;
</p>
<p>
  	}
</p>
<p>
  }
</p>
<p>
  //测试
</p>
<p>
  header(&#8216;Content-Type:text/html;charset=utf-8&#8217;);
</p>
<p>
  $stu=new Student(&#8216;tom&#8217;,&#8217;男&#8217;,88);
</p>
<p>
  $stu-&gt;show();
</p>
<p>
  运行结果
</p>
<p><img loading="lazy" decoding="async" width="204" height="76" src="/wp-content/uploads/2018/05/word-image-1589.png" class="wp-image-1812" /></p>
<h2>parent表示父类的名字</h2>
<p><img loading="lazy" decoding="async" width="653" height="280" src="/wp-content/uploads/2018/05/word-image-1590.png" class="wp-image-1813" srcset="/wp-content/uploads/2018/05/word-image-1590.png 653w, /wp-content/uploads/2018/05/word-image-1590-300x129.png 300w" sizes="(max-width: 653px) 100vw, 653px" /></p>
<p>
  提醒：使用parent关键字可以降低程序的耦合性。
</p>
<h2> protected（受保护的）</h2>
<p>
  protected修饰的在整个继承链上访问
</p>
<p><img loading="lazy" decoding="async" width="711" height="257" src="/wp-content/uploads/2018/05/word-image-1591.png" class="wp-image-1814" srcset="/wp-content/uploads/2018/05/word-image-1591.png 711w, /wp-content/uploads/2018/05/word-image-1591-300x108.png 300w" sizes="(max-width: 711px) 100vw, 711px" /></p>
<h2>$this</h2>
<p>
  $this表示当前对象的引用（地址）
</p>
<p><img loading="lazy" decoding="async" width="488" height="228" src="/wp-content/uploads/2018/05/word-image-1592.png" class="wp-image-1815" srcset="/wp-content/uploads/2018/05/word-image-1592.png 488w, /wp-content/uploads/2018/05/word-image-1592-300x140.png 300w" sizes="(max-width: 488px) 100vw, 488px" /></p>
<h2>封装</h2>
<p>
  通过访问修饰符来封装，有选择性的提供数据。
</p>
<p><img loading="lazy" decoding="async" width="956" height="565" src="/wp-content/uploads/2018/05/word-image-1593.png" class="wp-image-1816" srcset="/wp-content/uploads/2018/05/word-image-1593.png 956w, /wp-content/uploads/2018/05/word-image-1593-300x177.png 300w, /wp-content/uploads/2018/05/word-image-1593-768x454.png 768w" sizes="(max-width: 956px) 100vw, 956px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/php/1789.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>面向对象（二）分页、 多态、 封装、 接口、 方法修饰符、 方法重写、 方法重载、 类常量、 继承</title>
		<link>/php/1759.html</link>
					<comments>/php/1759.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Fri, 18 May 2018 13:01:26 +0000</pubDate>
				<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>
		<category><![CDATA[继承]]></category>
		<guid isPermaLink="false">/?p=1759</guid>

					<description><![CDATA[面向对象（二） 多态 多种形态，多态分为两种，方法重写和方法重载，PHP不支持方法重载 方法重写 子类重写了父 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>面向对象（二）</h1>
<h2>多态</h2>
<p>
  多种形态，多态分为两种，方法重写和方法重载，PHP不支持方法重载
</p>
<h3>方法重写</h3>
<p>
  子类重写了父类的同名方法
</p>
<p><img loading="lazy" decoding="async" width="849" height="364" src="/wp-content/uploads/2018/05/word-image-1540.png" class="wp-image-1761" srcset="/wp-content/uploads/2018/05/word-image-1540.png 849w, /wp-content/uploads/2018/05/word-image-1540-300x129.png 300w, /wp-content/uploads/2018/05/word-image-1540-768x329.png 768w" sizes="(max-width: 849px) 100vw, 849px" /></p>
<p>
  规则：
</p>
<ol>
<li>
  子类中的方法必须和父类中的方法同名
</li>
<li>
  子类可以拥有和父类不同数量的参数
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1099" height="362" src="/wp-content/uploads/2018/05/word-image-1541.png" class="wp-image-1762" srcset="/wp-content/uploads/2018/05/word-image-1541.png 1099w, /wp-content/uploads/2018/05/word-image-1541-300x99.png 300w, /wp-content/uploads/2018/05/word-image-1541-768x253.png 768w, /wp-content/uploads/2018/05/word-image-1541-1024x337.png 1024w" sizes="(max-width: 1099px) 100vw, 1099px" /></p>
<ol>
<li>
  子类中覆盖的方法不能比父类中被覆盖的方法更加严格
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1010" height="261" src="/wp-content/uploads/2018/05/word-image-1542.png" class="wp-image-1763" srcset="/wp-content/uploads/2018/05/word-image-1542.png 1010w, /wp-content/uploads/2018/05/word-image-1542-300x78.png 300w, /wp-content/uploads/2018/05/word-image-1542-768x198.png 768w" sizes="(max-width: 1010px) 100vw, 1010px" /></p>
<h3>方法重载</h3>
<p>
  通过参数的个数来区分不同的方法，PHP不支持。
</p>
<p><img loading="lazy" decoding="async" width="938" height="169" src="/wp-content/uploads/2018/05/word-image-1543.png" class="wp-image-1764" srcset="/wp-content/uploads/2018/05/word-image-1543.png 938w, /wp-content/uploads/2018/05/word-image-1543-300x54.png 300w, /wp-content/uploads/2018/05/word-image-1543-768x138.png 768w" sizes="(max-width: 938px) 100vw, 938px" /></p>
<h2>面向对象的三大特性</h2>
<ol>
<li>
  封装，通过访问修饰符来实现封装</p>
<ol>
<li>
    Public
  </li>
<li>
    Private
  </li>
<li>
    protected
  </li>
</ol>
</li>
<li>
  继承：子类继承了父类的属性和方法
</li>
<li>
  多态：多种形态</p>
<ol>
<li>
    方法重写
  </li>
<li>
    方法重载（PHP不支持）
  </li>
</ol>
</li>
</ol>
<h2>私有属性的继承和重写</h2>
<p>
  私有属性可以被继承，但是不能被重写
</p>
<p><img loading="lazy" decoding="async" width="688" height="273" src="/wp-content/uploads/2018/05/word-image-1544.png" class="wp-image-1765" srcset="/wp-content/uploads/2018/05/word-image-1544.png 688w, /wp-content/uploads/2018/05/word-image-1544-300x119.png 300w" sizes="(max-width: 688px) 100vw, 688px" /></p>
<p>
  思考如下例题
</p>
<p><img loading="lazy" decoding="async" width="745" height="280" src="/wp-content/uploads/2018/05/word-image-1545.png" class="wp-image-1766" srcset="/wp-content/uploads/2018/05/word-image-1545.png 745w, /wp-content/uploads/2018/05/word-image-1545-300x113.png 300w" sizes="(max-width: 745px) 100vw, 745px" /></p>
<h2>方法修饰符</h2>
<ol>
<li>
  static：静态的
</li>
<li>
  final：最终的
</li>
<li>
  abstract：抽象的
</li>
</ol>
<h2>static修饰符</h2>
<ol>
<li>
  static修饰属性叫静态属性，static修饰方法叫静态方法
</li>
<li>
  静态属性在加载类的时候分配空间（普通属性在实例化的时候分配空间）,所以不需要实例化就可以访问
</li>
<li>
  因为静态成员属于类，不属于某个对象，所以通过类名来调用静态成员</p>
<ol>
<li>
    类名::静态属性
  </li>
<li>
    类名::静态方法()
  </li>
</ol>
</li>
<li>
  静态成员在内存中就一份。
</li>
</ol>
<p><img loading="lazy" decoding="async" width="944" height="191" src="/wp-content/uploads/2018/05/word-image-1546.png" class="wp-image-1767" srcset="/wp-content/uploads/2018/05/word-image-1546.png 944w, /wp-content/uploads/2018/05/word-image-1546-300x61.png 300w, /wp-content/uploads/2018/05/word-image-1546-768x155.png 768w" sizes="(max-width: 944px) 100vw, 944px" /></p>
<p>
  多学一招： 由于普通方法在加载类的时候也加载了，所以也可以通过静态调用的方式来调用普通方法。
</p>
<p><img loading="lazy" decoding="async" width="1009" height="158" src="/wp-content/uploads/2018/05/word-image-1547.png" class="wp-image-1768" srcset="/wp-content/uploads/2018/05/word-image-1547.png 1009w, /wp-content/uploads/2018/05/word-image-1547-300x47.png 300w, /wp-content/uploads/2018/05/word-image-1547-768x120.png 768w" sizes="(max-width: 1009px) 100vw, 1009px" /></p>
<h3>静态成员可以被继承</h3>
<p><img loading="lazy" decoding="async" width="743" height="301" src="/wp-content/uploads/2018/05/word-image-1548.png" class="wp-image-1769" srcset="/wp-content/uploads/2018/05/word-image-1548.png 743w, /wp-content/uploads/2018/05/word-image-1548-300x122.png 300w" sizes="(max-width: 743px) 100vw, 743px" /></p>
<h3>静态延时绑定</h3>
<p>
  static也可以表示类名，表示调用当前访问的对象所属的类。
</p>
<p><img loading="lazy" decoding="async" width="771" height="469" src="/wp-content/uploads/2018/05/word-image-1549.png" class="wp-image-1770" srcset="/wp-content/uploads/2018/05/word-image-1549.png 771w, /wp-content/uploads/2018/05/word-image-1549-300x182.png 300w, /wp-content/uploads/2018/05/word-image-1549-768x467.png 768w" sizes="(max-width: 771px) 100vw, 771px" /></p>
<h2>self：当前类的名字</h2>
<p><img loading="lazy" decoding="async" width="727" height="396" src="/wp-content/uploads/2018/05/word-image-1550.png" class="wp-image-1771" srcset="/wp-content/uploads/2018/05/word-image-1550.png 727w, /wp-content/uploads/2018/05/word-image-1550-300x163.png 300w" sizes="(max-width: 727px) 100vw, 727px" /></p>
<h3>self总是表示当前类的名字</h3>
<p><img loading="lazy" decoding="async" width="626" height="204" src="/wp-content/uploads/2018/05/word-image-1551.png" class="wp-image-1772" srcset="/wp-content/uploads/2018/05/word-image-1551.png 626w, /wp-content/uploads/2018/05/word-image-1551-300x98.png 300w" sizes="(max-width: 626px) 100vw, 626px" /></p>
<h2>final修饰符</h2>
<p>
  final修饰的类不能被继承
</p>
<p><img loading="lazy" decoding="async" width="899" height="91" src="/wp-content/uploads/2018/05/word-image-1552.png" class="wp-image-1773" srcset="/wp-content/uploads/2018/05/word-image-1552.png 899w, /wp-content/uploads/2018/05/word-image-1552-300x30.png 300w, /wp-content/uploads/2018/05/word-image-1552-768x78.png 768w" sizes="(max-width: 899px) 100vw, 899px" /></p>
<p>
  final修饰的方法不能被重写
</p>
<p><img loading="lazy" decoding="async" width="824" height="172" src="/wp-content/uploads/2018/05/word-image-1553.png" class="wp-image-1774" srcset="/wp-content/uploads/2018/05/word-image-1553.png 824w, /wp-content/uploads/2018/05/word-image-1553-300x63.png 300w, /wp-content/uploads/2018/05/word-image-1553-768x160.png 768w" sizes="(max-width: 824px) 100vw, 824px" /></p>
<h2>abstract修饰符</h2>
<ol>
<li>
  abstract修饰的方法叫抽象方法，abstract修饰的类叫抽象类
</li>
<li>
  只有方法的声明，没有方法的实现称为抽象方法。
</li>
<li>
  一个类中只要只要有一个方法是抽象方法，这个类必须是抽象类
</li>
</ol>
<p><img loading="lazy" decoding="async" width="799" height="90" src="/wp-content/uploads/2018/05/word-image-1554.png" class="wp-image-1775" srcset="/wp-content/uploads/2018/05/word-image-1554.png 799w, /wp-content/uploads/2018/05/word-image-1554-300x34.png 300w, /wp-content/uploads/2018/05/word-image-1554-768x87.png 768w" sizes="(max-width: 799px) 100vw, 799px" /></p>
<ol>
<li>
  抽象类不可以被实例化，必须在子类中重新实现抽象方法
</li>
<li>
  抽象方法的作用：用来定义命名规范的。
</li>
</ol>
<p>
  &lt;?php
</p>
<p>
  //类中只要有一个方法是抽象的，这个类就是抽象类
</p>
<p>
  abstract class Goods {
</p>
<p>
  	protected $name;	//商品名
</p>
<p>
  	public function setName($name) {
</p>
<p>
  		$this-&gt;name=$name;
</p>
<p>
  	}
</p>
<p>
  	public abstract function show();	//只有方法的声明，没有方法的实现
</p>
<p>
  }
</p>
<p>
  //手机类继承商品类
</p>
<p>
  class Mobile extends Goods {
</p>
<p>
  	public function show() {	//实现父类的抽象方法
</p>
<p>
  		echo $this-&gt;name,'&lt;br&gt;&#8217;;
</p>
<p>
  	}
</p>
<p>
  }
</p>
<p>
  //图书类继承商品类
</p>
<p>
  class Book extends Goods {
</p>
<p>
  	public function show() {	//实现父类的抽象方法
</p>
<p>
  		echo &#8220;《{$this-&gt;name}》&lt;br&gt;&#8221;;
</p>
<p>
  	}
</p>
<p>
  }
</p>
<p>
  //测试
</p>
<p>
  header(&#8216;Content-Type:text/html;charset=utf-8&#8217;);
</p>
<p>
  $mobile=new Mobile();
</p>
<p>
  $mobile-&gt;setName(&#8216;iPhone7&#8217;);
</p>
<p>
  $mobile-&gt;show();
</p>
<p>
  $book=new Book();
</p>
<p>
  $book-&gt;setName(&#8216;PHP入门与精通&#8217;);
</p>
<p>
  $book-&gt;show();
</p>
<p><img loading="lazy" decoding="async" width="175" height="52" src="/wp-content/uploads/2018/05/word-image-1555.png" class="wp-image-1776" /></p>
<p>
  多学一招：类中一个抽象方法都没有也可以声明成抽象类。可以通过这种方法阻止类的实例化。
</p>
<p><img loading="lazy" decoding="async" width="591" height="148" src="/wp-content/uploads/2018/05/word-image-1556.png" class="wp-image-1777" srcset="/wp-content/uploads/2018/05/word-image-1556.png 591w, /wp-content/uploads/2018/05/word-image-1556-300x75.png 300w" sizes="(max-width: 591px) 100vw, 591px" /></p>
<h2>接口（interface）</h2>
<ol>
<li>
  如果一个类中所有的方法都是抽象方法，这个类就可以声明成接口。
</li>
<li>
  使用interface关键字声明接口
</li>
<li>
  接口中的抽象方法只能是public的，默认也是public。
</li>
<li>
  接口不能继承，而是实现接口（implements）
</li>
<li>
  abstract和final不能修饰接口中的抽象方法
</li>
<li>
  接口的作用也是用来定义命名规范
</li>
</ol>
<p><img loading="lazy" decoding="async" width="789" height="407" src="/wp-content/uploads/2018/05/word-image-1557.png" class="wp-image-1778" srcset="/wp-content/uploads/2018/05/word-image-1557.png 789w, /wp-content/uploads/2018/05/word-image-1557-300x155.png 300w, /wp-content/uploads/2018/05/word-image-1557-768x396.png 768w" sizes="(max-width: 789px) 100vw, 789px" /></p>
<h3>类不允许多重继承</h3>
<p>
  一个父类可以有多个子类
</p>
<p><img loading="lazy" decoding="async" width="803" height="227" src="/wp-content/uploads/2018/05/word-image-1558.png" class="wp-image-1779" srcset="/wp-content/uploads/2018/05/word-image-1558.png 803w, /wp-content/uploads/2018/05/word-image-1558-300x85.png 300w, /wp-content/uploads/2018/05/word-image-1558-768x217.png 768w" sizes="(max-width: 803px) 100vw, 803px" /></p>
<p>
  一个子类不能有多个父类（只有c++可以多重继承，其他语言都不允许多重继承。）
</p>
<p><img loading="lazy" decoding="async" width="732" height="169" src="/wp-content/uploads/2018/05/word-image-1559.png" class="wp-image-1780" srcset="/wp-content/uploads/2018/05/word-image-1559.png 732w, /wp-content/uploads/2018/05/word-image-1559-300x69.png 300w" sizes="(max-width: 732px) 100vw, 732px" /></p>
<p>
  多学一招：为什么很多语言不支持多重继承，因为多重继承容易产生二义性。
</p>
<h3>接口的多重实现</h3>
<p><img loading="lazy" decoding="async" width="966" height="429" src="/wp-content/uploads/2018/05/word-image-1560.png" class="wp-image-1781" srcset="/wp-content/uploads/2018/05/word-image-1560.png 966w, /wp-content/uploads/2018/05/word-image-1560-300x133.png 300w, /wp-content/uploads/2018/05/word-image-1560-768x341.png 768w" sizes="(max-width: 966px) 100vw, 966px" /></p>
<h3>继承类同时实现接口</h3>
<p>
  必须是先继承类再实现接口
</p>
<p><img loading="lazy" decoding="async" width="952" height="427" src="/wp-content/uploads/2018/05/word-image-1561.png" class="wp-image-1782" srcset="/wp-content/uploads/2018/05/word-image-1561.png 952w, /wp-content/uploads/2018/05/word-image-1561-300x135.png 300w, /wp-content/uploads/2018/05/word-image-1561-768x344.png 768w" sizes="(max-width: 952px) 100vw, 952px" /></p>
<h2>类常量</h2>
<p>
  常量也是加载代码的时候加载，所以也是通过类名来方法
</p>
<p>
  类常量用const声明
</p>
<p><img loading="lazy" decoding="async" width="716" height="167" src="/wp-content/uploads/2018/05/word-image-1562.png" class="wp-image-1783" srcset="/wp-content/uploads/2018/05/word-image-1562.png 716w, /wp-content/uploads/2018/05/word-image-1562-300x70.png 300w" sizes="(max-width: 716px) 100vw, 716px" /></p>
<p>
  const常量也可以放在接口中（接口中只能放抽象方法和常量）
</p>
<p><img loading="lazy" decoding="async" width="338" height="100" src="/wp-content/uploads/2018/05/word-image-1563.png" class="wp-image-1784" srcset="/wp-content/uploads/2018/05/word-image-1563.png 338w, /wp-content/uploads/2018/05/word-image-1563-300x89.png 300w" sizes="(max-width: 338px) 100vw, 338px" /></p>
<h2>参数约束</h2>
<ol>
<li>
  参数约束在PHP5.3以后才支持
</li>
<li>
  只能约束对象，不能约束基本类型
</li>
</ol>
<p><img loading="lazy" decoding="async" width="596" height="172" src="/wp-content/uploads/2018/05/word-image-1564.png" class="wp-image-1785" srcset="/wp-content/uploads/2018/05/word-image-1564.png 596w, /wp-content/uploads/2018/05/word-image-1564-300x87.png 300w" sizes="(max-width: 596px) 100vw, 596px" /></p>
<h2>父类可以指向子类的引用</h2>
<p>
  父类可以保存子类对象的地址
</p>
<p>
  &lt;?php
</p>
<p>
  class Person {
</p>
<p>
  }
</p>
<p>
  class Student extends Person {
</p>
<p>
  }
</p>
<p>
  class Employee extends Person {
</p>
<p>
  }
</p>
<p>
  function show(Person $obj) {
</p>
<p>
  }
</p>
<p>
  //测试
</p>
<p>
  show(new Student);
</p>
<p>
  show(new Employee);
</p>
<h2>分页功能</h2>
<p>
  知识点：select * from 表名 limit 起始位置，记录数
</p>
<p>
  起始位置从0开始。
</p>
<h3>分析：起始位置和页码的关系</h3>
<p>
  一页放10条记录（$pagesize=10）
</p>
<table>
<tr>
<td>
<p>
  页码（$pageno）
</p>
</td>
<td>
<p>
  SQL语句
</p>
</td>
</tr>
<tr>
<td>
<p>
  1
</p>
</td>
<td>
<p>
  select * from contents limit 0,10
</p>
</td>
</tr>
<tr>
<td>
<p>
  2
</p>
</td>
<td>
<p>
  select * from contents limit 10,10
</p>
</td>
</tr>
<tr>
<td>
<p>
  3
</p>
</td>
<td>
<p>
  select * from contents limit 20,10
</p>
</td>
</tr>
</table>
<p>
  推导公式：$startno(起始位置)=($pageno-1)*$pagesize;
</p>
<h3>分析：总共有多少页</h3>
<table>
<tr>
<td>
<p>
  记录数($rowcount)
</p>
</td>
<td>
<p>
  页面总数($pagecount)
</p>
</td>
</tr>
<tr>
<td>
<p>
  30
</p>
</td>
<td>
<p>
  3
</p>
</td>
</tr>
<tr>
<td>
<p>
  31
</p>
</td>
<td>
<p>
  4
</p>
</td>
</tr>
<tr>
<td>
<p>
  1
</p>
</td>
<td>
<p>
  1
</p>
</td>
</tr>
</table>
<p>
  推导公式：$pagecount=ceil($rowcount/$pagesize)
</p>
<h3>实现第一步：输出页码</h3>
<p>
  点击页码——获取页码——通过页码获取页码的内容
</p>
<p><img loading="lazy" decoding="async" width="706" height="31" src="/wp-content/uploads/2018/05/word-image-1565.png" class="wp-image-1786" srcset="/wp-content/uploads/2018/05/word-image-1565.png 706w, /wp-content/uploads/2018/05/word-image-1565-300x13.png 300w" sizes="(max-width: 706px) 100vw, 706px" /></p>
<p>
  代码实现
</p>
<p>
  //第一步：获取总记录数
</p>
<p>
  $sql=&#8221;select count(*) from contents where title=$titleid&#8221;;
</p>
<p>
  $rs=mysql_query($sql);
</p>
<p>
  $rows=mysql_fetch_row($rs);
</p>
<p>
  $rowcount=$rows[0];	//获取到总记录数
</p>
<p>
  //第二步：求得总页数
</p>
<p>
  $pagesize=10;		//页码大小
</p>
<p>
  $pagecount=ceil($rowcount/$pagesize);	//求得总页数
</p>
<p>
  在页码底部循环输出页码
</p>
<p>
  &lt;tr&gt;
</p>
<p>
  	&lt;td colspan=&#8217;3&#8242;&gt;
</p>
<p>
  	&lt;?php for($i=1;$i&lt;=$pagecount;$i++):?&gt;
</p>
<p>
  		&lt;?php if($pageno==$i):?&gt;
</p>
<p>
  			&lt;span class=&#8221;pageno&#8221;&gt;&lt;?php echo $i?&gt;&lt;/span&gt; &amp;nbsp;
</p>
<p>
  		&lt;?php else:?&gt;
</p>
<p>
  			&lt;a href=&#8221;?pageno=&lt;?php echo $i?&gt;&amp;titleid=&lt;?php echo $titleid?&gt;&#8221;&gt;&lt;?php echo $i?&gt;&lt;/a&gt;&amp;nbsp;
</p>
<p>
  		&lt;?php endif;?&gt;
</p>
</p>
<p>
  	&lt;?php endfor;?&gt;
</p>
<p>
  	&lt;a href=&#8221;?pageno=1&amp;titleid=&lt;?php echo $titleid?&gt;&#8221;&gt;【首页】&lt;/a&gt;
</p>
<p>
  	&lt;a href=&#8221;?pageno=&lt;?php echo $pageno-1?&gt;&amp;titleid=&lt;?php echo $titleid?&gt;&#8221;&gt;【上一页】&lt;/a&gt;
</p>
<p>
  	&lt;a href=&#8221;?pageno=&lt;?php echo $pageno+1?&gt;&amp;titleid=&lt;?php echo $titleid?&gt;&#8221;&gt;【下一页】&lt;/a&gt;
</p>
<p>
  	&lt;a href=&#8221;?pageno=&lt;?php echo $pagecount?&gt;&amp;titleid=&lt;?php echo $titleid?&gt;&#8221;&gt;【末页】&lt;/a&gt;
</p>
<p>
  	&lt;/td&gt;
</p>
<p>
  &lt;/tr&gt;
</p>
<h3>实现第二步：获取页码，并取出当前页面中的内容</h3>
<p>
  代码
</p>
<p>
  //第三步：获取当前页的内容
</p>
<p>
  $pageno=isset($_GET[&#8216;pageno&#8217;])?$_GET[&#8216;pageno&#8217;]:1;		//获取当前页码
</p>
<p>
  $pageno=$pageno&lt;1?1:$pageno;		//如果页码小于1，定位到第一页
</p>
<p>
  $pageno=$pageno&gt;$pagecount?$pagecount:$pageno; //页码大于总页数，定位到最后一页
</p>
<p>
  $startno=($pageno-1)*$pagesize;	//计算当前页的起始位置
</p>
<p>
  $sql=&#8221;select * from contents where title=$titleid limit {$startno},{$pagesize}&#8221;;
</p>
<p>
  $rs=mysql_query($sql);
</p>
<h3>完整代码</h3>
<p>
  &lt;!doctype html&gt;
</p>
<p>
  &lt;html&gt;
</p>
<p>
  &lt;head&gt;
</p>
<p>
  &lt;meta charset=&#8221;utf-8&#8243;&gt;
</p>
<p>
  &lt;title&gt;无标题文档&lt;/title&gt;
</p>
<p>
  &lt;style type=&#8221;text/css&#8221;&gt;
</p>
<p>
  	table{
</p>
<p>
  		width:980px;
</p>
<p>
  	}
</p>
<p>
  	table,td,th{
</p>
<p>
  		border:solid 1px #000;
</p>
<p>
  		margin:auto;
</p>
<p>
  		font-size:14px;
</p>
<p>
  	}
</p>
<p>
  	.pageno{
</p>
<p>
  		font-size:24px;
</p>
<p>
  		color:#FF0000;
</p>
<p>
  	}
</p>
<p>
  &lt;/style&gt;
</p>
<p>
  &lt;/head&gt;
</p>
<p>
  &lt;body&gt;
</p>
<p>
  &lt;?php
</p>
<p>
  //连接数据库
</p>
<p>
  mysql_connect(&#8216;localhost&#8217;,&#8217;root&#8217;,&#8217;root&#8217;) or die(&#8216;数据库连接失败&#8217;);
</p>
<p>
  mysql_select_db(&#8216;jokedb&#8217;);
</p>
<p>
  mysql_query(&#8216;set names utf8&#8217;);
</p>
<p>
  ?&gt;
</p>
<p>
  &lt;!&#8211;显示分类&#8211;&gt;
</p>
<p>
  &lt;?php
</p>
<p>
  	$rs=mysql_query(&#8216;select * from title&#8217;);
</p>
<p>
  ?&gt;
</p>
<p>
  &lt;table&gt;
</p>
<p>
  	&lt;tr&gt;
</p>
<p>
  	&lt;?php
</p>
<p>
  	$n=0;
</p>
<p>
  	while($rows=mysql_fetch_assoc($rs)):
</p>
<p>
  	?&gt;
</p>
<p>
  		&lt;td&gt;&lt;a href=&#8221;?titleid=&lt;?php echo $rows[&#8216;Id&#8217;]?&gt;&#8221;&gt;&lt;?php echo $rows[&#8216;Title&#8217;]?&gt;&lt;/a&gt;&lt;/td&gt;
</p>
<p>
  	&lt;?php
</p>
<p>
  		if(++$n%9==0)
</p>
<p>
  			echo &#8216;&lt;/tr&gt;&lt;tr&gt;&#8217;;
</p>
<p>
  	endwhile;
</p>
<p>
  	?&gt;
</p>
<p>
  	&lt;/tr&gt;
</p>
<p>
  &lt;/table&gt;
</p>
<p>
  &lt;!&#8211;显示内容&#8211;&gt;
</p>
<p>
  &lt;?php
</p>
<p>
  	$titleid=isset($_GET[&#8216;titleid&#8217;])?$_GET[&#8216;titleid&#8217;]:1;
</p>
<p>
  	//第一步：获取总记录数
</p>
<p>
  	$sql=&#8221;select count(*) from contents where title=$titleid&#8221;;
</p>
<p>
  	$rs=mysql_query($sql);
</p>
<p>
  	$rows=mysql_fetch_row($rs);
</p>
<p>
  	$rowcount=$rows[0];	//获取到总记录数
</p>
<p>
  	//第二步：求得总页数
</p>
<p>
  	$pagesize=10;		//页码大小
</p>
<p>
  	$pagecount=ceil($rowcount/$pagesize);	//求得总页数
</p>
<p>
  	//第三步：获取当前页的内容
</p>
<p>
  	$pageno=isset($_GET[&#8216;pageno&#8217;])?$_GET[&#8216;pageno&#8217;]:1;		//获取当前页码
</p>
<p>
  	$pageno=$pageno&lt;1?1:$pageno;		//如果页码小于1，定位到第一页
</p>
<p>
  	$pageno=$pageno&gt;$pagecount?$pagecount:$pageno; //页码大于总页数，定位到最后一页
</p>
<p>
  	$startno=($pageno-1)*$pagesize;	//计算当前页的起始位置
</p>
<p>
  	$sql=&#8221;select * from contents where title=$titleid limit {$startno},{$pagesize}&#8221;;
</p>
<p>
  	$rs=mysql_query($sql);
</p>
<p>
  ?&gt;
</p>
<p>
  &lt;table&gt;
</p>
<p>
  	&lt;tr&gt;
</p>
<p>
  		&lt;th&gt;编号&lt;/th&gt; &lt;th&gt;内容&lt;/th&gt; &lt;th&gt;作者&lt;/th&gt;
</p>
<p>
  	&lt;/tr&gt;
</p>
<p>
  	&lt;?php while($rows=mysql_fetch_assoc($rs)):?&gt;
</p>
<p>
  	&lt;tr&gt;
</p>
<p>
  		&lt;td&gt;&lt;?php echo $rows[&#8216;Id&#8217;]?&gt;&lt;/td&gt;
</p>
<p>
  		&lt;td&gt;&lt;?php echo $rows[&#8216;Contents&#8217;]?&gt;&lt;/td&gt;
</p>
<p>
  		&lt;td&gt;&lt;?php echo $rows[&#8216;Author&#8217;]?&gt;&lt;/td&gt;
</p>
<p>
  	&lt;/tr&gt;
</p>
<p>
  	&lt;?php endwhile;?&gt;
</p>
<p>
  &lt;!&#8211;输出页码&#8211;&gt;
</p>
<p>
  	&lt;tr&gt;
</p>
<p>
  		&lt;td colspan=&#8217;3&#8242;&gt;
</p>
<p>
  		&lt;?php for($i=1;$i&lt;=$pagecount;$i++):?&gt;
</p>
<p>
  			&lt;?php if($pageno==$i):?&gt;
</p>
<p>
  				&lt;span class=&#8221;pageno&#8221;&gt;&lt;?php echo $i?&gt;&lt;/span&gt; &amp;nbsp;
</p>
<p>
  			&lt;?php else:?&gt;
</p>
<p>
  				&lt;a href=&#8221;?pageno=&lt;?php echo $i?&gt;&amp;titleid=&lt;?php echo $titleid?&gt;&#8221;&gt;&lt;?php echo $i?&gt;&lt;/a&gt;&amp;nbsp;
</p>
<p>
  			&lt;?php endif;?&gt;
</p>
</p>
<p>
  		&lt;?php endfor;?&gt;
</p>
<p>
  		&lt;a href=&#8221;?pageno=1&amp;titleid=&lt;?php echo $titleid?&gt;&#8221;&gt;【首页】&lt;/a&gt;
</p>
<p>
  		&lt;a href=&#8221;?pageno=&lt;?php echo $pageno-1?&gt;&amp;titleid=&lt;?php echo $titleid?&gt;&#8221;&gt;【上一页】&lt;/a&gt;
</p>
<p>
  		&lt;a href=&#8221;?pageno=&lt;?php echo $pageno+1?&gt;&amp;titleid=&lt;?php echo $titleid?&gt;&#8221;&gt;【下一页】&lt;/a&gt;
</p>
<p>
  		&lt;a href=&#8221;?pageno=&lt;?php echo $pagecount?&gt;&amp;titleid=&lt;?php echo $titleid?&gt;&#8221;&gt;【末页】&lt;/a&gt;
</p>
<p>
  		&lt;/td&gt;
</p>
<p>
  	&lt;/tr&gt;
</p>
<p>
  &lt;/table&gt;
</p>
<p>
  &lt;/body&gt;
</p>
<p>
  &lt;/html&gt;
</p>
<p><img loading="lazy" decoding="async" width="1023" height="423" src="/wp-content/uploads/2018/05/word-image-1566.png" class="wp-image-1787" srcset="/wp-content/uploads/2018/05/word-image-1566.png 1023w, /wp-content/uploads/2018/05/word-image-1566-300x124.png 300w, /wp-content/uploads/2018/05/word-image-1566-768x318.png 768w" sizes="(max-width: 1023px) 100vw, 1023px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/php/1759.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
