-
Notifications
You must be signed in to change notification settings - Fork 0
/
db.json
1 lines (1 loc) · 230 KB
/
db.json
1
{"meta":{"version":1,"warehouse":"2.2.0"},"models":{"Asset":[{"_id":"source/CNAME","path":"CNAME","modified":0,"renderable":0}],"Cache":[{"_id":"source/CNAME","hash":"99d7a043c95168b64b811d4ef37ffeb85125366a","modified":1527417487628},{"_id":"source/_posts/Linux 常用的机构命令.md","hash":"166f5428ece8ebb645b90a695d7e36bb195b46a7","modified":1527417487628},{"_id":"source/_posts/Ubuntu17.04+github+hexo 搭建博客.md","hash":"61d488004de8600b337a21053d9d7720717f0270","modified":1527417487628},{"_id":"source/_posts/hello-world.md","hash":"d18a990b1475df6f5cfc32f83442fe3e7570eaa2","modified":1527417487628},{"_id":"source/_posts/interface.md","hash":"891b458eee799299f2f796c63e05279462f6f6f4","modified":1527417487628},{"_id":"source/_posts/jqweui_toast.md","hash":"bde508de479ed7252c0cc558a2f4672969d1e1bf","modified":1527417487628},{"_id":"source/_posts/mysql-lock.md","hash":"63e97af288f8171d031f25d30f2f95e7d7de2b41","modified":1527417487628},{"_id":"source/_posts/mysql建立索引.md","hash":"4fdcd1fe44cb49b17ea0347469c3351e16bb2ff2","modified":1527417487628},{"_id":"source/_posts/php学习笔记.md","hash":"532b6809fd8200002347284bdc6f9bd87165e794","modified":1527417487628},{"_id":"source/_posts/sql会引起全表扫码的语句.md","hash":"7f0266e496196d369872cd87cede44cc3446740a","modified":1527417487628},{"_id":"source/_posts/佛渡有缘人.md","hash":"f6131e4a162dcd15a5b650a1eaa0f5990d0f4740","modified":1527417487628},{"_id":"source/_posts/正则学习笔记.md","hash":"18ad213dd25ecc11f7a391bf6e80e5345ee8c58e","modified":1527417487628},{"_id":"source/_posts/面试题总结.md","hash":"16acdedf4d6c62c570c57b490e11daa3527fcbb9","modified":1527417487628},{"_id":"source/_posts/高级php总结.md","hash":"82bb378ac2df59145d631f1d7a0bc5b3310e486f","modified":1527417487628},{"_id":"source/about/index.md","hash":"a00853c63dc4a594e3d67f3e54751cc05a07ff18","modified":1527417487628},{"_id":"public/baidusitemap.xml","hash":"b332795cb181440a1f1fcb0f26963864c8789471","modified":1527417680499},{"_id":"public/content.json","hash":"ac116016aab7aafb456c18e912d08f803378dd26","modified":1527417680500},{"_id":"public/sitemap.xml","hash":"943c22749d72caa4dda5d48680a30e966488e44f","modified":1527417680501},{"_id":"public/about/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680512},{"_id":"public/2018/04/28/mysql建立索引/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680512},{"_id":"public/2018/04/18/sql会引起全表扫码的语句/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680512},{"_id":"public/2018/04/16/高级php总结/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680512},{"_id":"public/2018/04/16/正则学习笔记/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680513},{"_id":"public/2018/04/13/面试题总结/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680513},{"_id":"public/2017/12/05/佛渡有缘人/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680513},{"_id":"public/2017/12/05/Linux 常用的机构命令/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680513},{"_id":"public/2017/11/30/jqweui_toast/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680514},{"_id":"public/2017/11/11/Ubuntu17.04+github+hexo 搭建博客/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680514},{"_id":"public/2017/10/06/mysql-lock/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680514},{"_id":"public/2017/10/05/hello-world/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680514},{"_id":"public/2017/06/02/interface/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680515},{"_id":"public/2015/04/05/php学习笔记/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680517},{"_id":"public/archives/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680517},{"_id":"public/archives/page/2/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680517},{"_id":"public/archives/2015/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680517},{"_id":"public/archives/2015/04/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680518},{"_id":"public/archives/2017/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680518},{"_id":"public/archives/2017/06/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680519},{"_id":"public/archives/2017/10/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680519},{"_id":"public/archives/2017/11/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680519},{"_id":"public/archives/2017/12/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680520},{"_id":"public/archives/2018/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680520},{"_id":"public/archives/2018/04/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680521},{"_id":"public/categories/Linux/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680526},{"_id":"public/categories/PHP/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680527},{"_id":"public/categories/MySQL/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680527},{"_id":"public/categories/正则/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680527},{"_id":"public/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680528},{"_id":"public/page/2/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680530},{"_id":"public/tags/Linux/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680531},{"_id":"public/tags/github/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680531},{"_id":"public/tags/hexo/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680531},{"_id":"public/tags/接口/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680531},{"_id":"public/tags/设计模式/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680532},{"_id":"public/tags/jqweui/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680532},{"_id":"public/tags/weui/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680533},{"_id":"public/tags/MySQl/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680533},{"_id":"public/tags/高并发/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680533},{"_id":"public/tags/数据库锁/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680534},{"_id":"public/tags/MySQL/index.html","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1527417680534},{"_id":"public/CNAME","hash":"99d7a043c95168b64b811d4ef37ffeb85125366a","modified":1527417680539}],"Category":[{"name":"Linux","_id":"cjhop1sly0002cmyys0vhlp3b"},{"name":"PHP","_id":"cjhop1smk000ccmyyqgy9weof"},{"name":"MySQL","_id":"cjhop1smv000mcmyyyxc11n6l"},{"name":"正则","_id":"cjhop1sng001ecmyy7mg5nnao"}],"Data":[],"Page":[{"title":"about","date":"2017-11-11T14:42:35.000Z","_content":"","source":"about/index.md","raw":"---\ntitle: about\ndate: 2017-11-11 22:42:35\n---\n","updated":"2018-05-27T10:38:07.628Z","path":"about/index.html","comments":1,"layout":"page","_id":"cjhop1sna001acmyysthpitax","content":"","site":{"data":{}},"excerpt":"","more":""}],"Post":[{"title":"Linux 的几个常用的命令","date":"2017-12-05T03:01:01.000Z","top":90,"_content":"\n给某个文件权限(以后有时间总结一篇关于权限的文章)\n```bash\nchown -R www:www /home/wwwroot \n```\n\n查看链接服务器的ip\n```bash\n netstat -an | grep ESTABLISHED\n netstat -an | grep 192.168.1.99\n```\n\n\ncentos7 开启80端口\n```bash\niptables -I INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT\n```\n\ntelnet 某个端口\n```bash\ntelnet 172.0.0.101 8001\n\n```\n退出\n```bash\nctrl + ] 然后 quit 注意,后面没有 ‘;’分号\n```\n统计80端口链接数\n```bash\nnetstat -nat|grep -i \"80\"|wc -l\n```","source":"_posts/Linux 常用的机构命令.md","raw":"---\ntitle: Linux 的几个常用的命令\ndate: 2017-12-05 11:01:01\ntags: \n- Linux\ntop: 90\ncategories: Linux\n---\n\n给某个文件权限(以后有时间总结一篇关于权限的文章)\n```bash\nchown -R www:www /home/wwwroot \n```\n\n查看链接服务器的ip\n```bash\n netstat -an | grep ESTABLISHED\n netstat -an | grep 192.168.1.99\n```\n\n\ncentos7 开启80端口\n```bash\niptables -I INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT\n```\n\ntelnet 某个端口\n```bash\ntelnet 172.0.0.101 8001\n\n```\n退出\n```bash\nctrl + ] 然后 quit 注意,后面没有 ‘;’分号\n```\n统计80端口链接数\n```bash\nnetstat -nat|grep -i \"80\"|wc -l\n```","slug":"Linux 常用的机构命令","published":1,"updated":"2018-05-27T10:38:07.628Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cjhop1slj0000cmyy7w0bg0ht","content":"<p>给某个文件权限(以后有时间总结一篇关于权限的文章)<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">chown -R www:www /home/wwwroot</span><br></pre></td></tr></table></figure></p>\n<p>查看链接服务器的ip<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">netstat -an | grep ESTABLISHED</span><br><span class=\"line\">netstat -an | grep 192.168.1.99</span><br></pre></td></tr></table></figure></p>\n<p>centos7 开启80端口<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT</span><br></pre></td></tr></table></figure></p>\n<p>telnet 某个端口<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">telnet 172.0.0.101 8001</span><br></pre></td></tr></table></figure></p>\n<p>退出<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">ctrl + ] 然后 quit 注意,后面没有 ‘;’分号</span><br></pre></td></tr></table></figure></p>\n<p>统计80端口链接数<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">netstat -nat|grep -i <span class=\"string\">\"80\"</span>|wc -l</span><br></pre></td></tr></table></figure></p>\n","site":{"data":{}},"excerpt":"","more":"<p>给某个文件权限(以后有时间总结一篇关于权限的文章)<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">chown -R www:www /home/wwwroot</span><br></pre></td></tr></table></figure></p>\n<p>查看链接服务器的ip<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">netstat -an | grep ESTABLISHED</span><br><span class=\"line\">netstat -an | grep 192.168.1.99</span><br></pre></td></tr></table></figure></p>\n<p>centos7 开启80端口<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT</span><br></pre></td></tr></table></figure></p>\n<p>telnet 某个端口<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">telnet 172.0.0.101 8001</span><br></pre></td></tr></table></figure></p>\n<p>退出<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">ctrl + ] 然后 quit 注意,后面没有 ‘;’分号</span><br></pre></td></tr></table></figure></p>\n<p>统计80端口链接数<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">netstat -nat|grep -i <span class=\"string\">\"80\"</span>|wc -l</span><br></pre></td></tr></table></figure></p>\n"},{"title":"Ubuntu17.04+github+hexo 搭建博客","date":"2017-11-11T07:22:58.000Z","top":90,"_content":"\n### 第一步:\n 首先安装nodejs,这个是hexo运行的基础环境,安装很简便:\n```bash\n$ sudo apt-get install nodejs\n```\n### 第二步\n 安装npm,这个也很简单,这是是node.js的包管理器,跟apt,pip等差不多的东东, 直接\n```bash\n$ sudo apt-get install npm\n\n```\n \n### 第三步\n接下来安装hexo或者hexo-cli,后者安装出现问题,前者没有问题,暂时还不知道原因.所以我安装的是hexo,如果你使用sudo npm install hexo -g 或者 sudo npm install hexo-cli -g,是不会成功的,最起码我是这样的。\n正确的方法如下:\n```bash\n$ sudo npm install --unsafe-perm --verbose -g hexo \n\n```\n\n### 第四步\n\n修改以下hexo所在路径的文件\n```bash\n$ sudo vi /usr/local/lib/node_modules/hexo/bin/hexo\n```\n\n把#!/usr/bin/env node修改为!/usr/bin/env nodejs即可\n\n```\n#!/usr/bin/env nodejs\n'use strict';\nrequire('hexo-cli')();\n```\n\n然后输入hexo 看是否安装成功\n\n### 第五步\n创建项目:\n \n\n```\n$ mkdir blog\n$ cd blog\n$ hexo init\n$ hexo g # 生成\n$ hexo s # 启动服务\n\n```\n\n然后输入127.0.0.1:4000 就可以预览了\n\n### 第六步\n\n上传到github\n\n首先在github 建造一个 youname(自己的github名字).github.io\n\n在项目文件下安装插件\n\n```\nnpm install hexo-deployer-git --save\n```\n\n在__config.yml中加入\n\n```\ndeploy:\n type: git\n repository: [email protected]:youname/youmane.github.io.git\n branch: master\n```\n\n然后进入blog 文件\n\n```\n$ hexo g\n$ hexo d\n\n```\n就可以上传到github了。然后youname.github.io 就可以访问到blog了\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","source":"_posts/Ubuntu17.04+github+hexo 搭建博客.md","raw":"---\ntitle: Ubuntu17.04+github+hexo 搭建博客\ndate: 2017-11-11 15:22:58\ntags: \n- github\n- hexo\ntop: 90\ncategories: Linux\n---\n\n### 第一步:\n 首先安装nodejs,这个是hexo运行的基础环境,安装很简便:\n```bash\n$ sudo apt-get install nodejs\n```\n### 第二步\n 安装npm,这个也很简单,这是是node.js的包管理器,跟apt,pip等差不多的东东, 直接\n```bash\n$ sudo apt-get install npm\n\n```\n \n### 第三步\n接下来安装hexo或者hexo-cli,后者安装出现问题,前者没有问题,暂时还不知道原因.所以我安装的是hexo,如果你使用sudo npm install hexo -g 或者 sudo npm install hexo-cli -g,是不会成功的,最起码我是这样的。\n正确的方法如下:\n```bash\n$ sudo npm install --unsafe-perm --verbose -g hexo \n\n```\n\n### 第四步\n\n修改以下hexo所在路径的文件\n```bash\n$ sudo vi /usr/local/lib/node_modules/hexo/bin/hexo\n```\n\n把#!/usr/bin/env node修改为!/usr/bin/env nodejs即可\n\n```\n#!/usr/bin/env nodejs\n'use strict';\nrequire('hexo-cli')();\n```\n\n然后输入hexo 看是否安装成功\n\n### 第五步\n创建项目:\n \n\n```\n$ mkdir blog\n$ cd blog\n$ hexo init\n$ hexo g # 生成\n$ hexo s # 启动服务\n\n```\n\n然后输入127.0.0.1:4000 就可以预览了\n\n### 第六步\n\n上传到github\n\n首先在github 建造一个 youname(自己的github名字).github.io\n\n在项目文件下安装插件\n\n```\nnpm install hexo-deployer-git --save\n```\n\n在__config.yml中加入\n\n```\ndeploy:\n type: git\n repository: [email protected]:youname/youmane.github.io.git\n branch: master\n```\n\n然后进入blog 文件\n\n```\n$ hexo g\n$ hexo d\n\n```\n就可以上传到github了。然后youname.github.io 就可以访问到blog了\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n","slug":"Ubuntu17.04+github+hexo 搭建博客","published":1,"updated":"2018-05-27T10:38:07.628Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cjhop1slv0001cmyyij2lw21o","content":"<h3 id=\"第一步\"><a href=\"#第一步\" class=\"headerlink\" title=\"第一步:\"></a>第一步:</h3><p> 首先安装nodejs,这个是hexo运行的基础环境,安装很简便:<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ sudo apt-get install nodejs</span><br></pre></td></tr></table></figure></p>\n<h3 id=\"第二步\"><a href=\"#第二步\" class=\"headerlink\" title=\"第二步\"></a>第二步</h3><p> 安装npm,这个也很简单,这是是node.js的包管理器,跟apt,pip等差不多的东东, 直接<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ sudo apt-get install npm</span><br></pre></td></tr></table></figure></p>\n<h3 id=\"第三步\"><a href=\"#第三步\" class=\"headerlink\" title=\"第三步\"></a>第三步</h3><p>接下来安装hexo或者hexo-cli,后者安装出现问题,前者没有问题,暂时还不知道原因.所以我安装的是hexo,如果你使用sudo npm install hexo -g 或者 sudo npm install hexo-cli -g,是不会成功的,最起码我是这样的。<br>正确的方法如下:<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ sudo npm install --unsafe-perm --verbose -g hexo</span><br></pre></td></tr></table></figure></p>\n<h3 id=\"第四步\"><a href=\"#第四步\" class=\"headerlink\" title=\"第四步\"></a>第四步</h3><p>修改以下hexo所在路径的文件<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ sudo vi /usr/<span class=\"built_in\">local</span>/lib/node_modules/hexo/bin/hexo</span><br></pre></td></tr></table></figure></p>\n<p>把#!/usr/bin/env node修改为!/usr/bin/env nodejs即可</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">#!/usr/bin/env nodejs</span><br><span class=\"line\">'use strict';</span><br><span class=\"line\">require('hexo-cli')();</span><br></pre></td></tr></table></figure>\n<p>然后输入hexo 看是否安装成功</p>\n<h3 id=\"第五步\"><a href=\"#第五步\" class=\"headerlink\" title=\"第五步\"></a>第五步</h3><p>创建项目:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ mkdir blog</span><br><span class=\"line\">$ cd blog</span><br><span class=\"line\">$ hexo init</span><br><span class=\"line\">$ hexo g # 生成</span><br><span class=\"line\">$ hexo s # 启动服务</span><br></pre></td></tr></table></figure>\n<p>然后输入127.0.0.1:4000 就可以预览了</p>\n<h3 id=\"第六步\"><a href=\"#第六步\" class=\"headerlink\" title=\"第六步\"></a>第六步</h3><p>上传到github</p>\n<p>首先在github 建造一个 youname(自己的github名字).github.io</p>\n<p>在项目文件下安装插件</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">npm install hexo-deployer-git --save</span><br></pre></td></tr></table></figure>\n<p>在__config.yml中加入</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">deploy:</span><br><span class=\"line\"> type: git</span><br><span class=\"line\"> repository: [email protected]:youname/youmane.github.io.git</span><br><span class=\"line\"> branch: master</span><br></pre></td></tr></table></figure>\n<p>然后进入blog 文件</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ hexo g</span><br><span class=\"line\">$ hexo d</span><br></pre></td></tr></table></figure>\n<p>就可以上传到github了。然后youname.github.io 就可以访问到blog了</p>\n","site":{"data":{}},"excerpt":"","more":"<h3 id=\"第一步\"><a href=\"#第一步\" class=\"headerlink\" title=\"第一步:\"></a>第一步:</h3><p> 首先安装nodejs,这个是hexo运行的基础环境,安装很简便:<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ sudo apt-get install nodejs</span><br></pre></td></tr></table></figure></p>\n<h3 id=\"第二步\"><a href=\"#第二步\" class=\"headerlink\" title=\"第二步\"></a>第二步</h3><p> 安装npm,这个也很简单,这是是node.js的包管理器,跟apt,pip等差不多的东东, 直接<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ sudo apt-get install npm</span><br></pre></td></tr></table></figure></p>\n<h3 id=\"第三步\"><a href=\"#第三步\" class=\"headerlink\" title=\"第三步\"></a>第三步</h3><p>接下来安装hexo或者hexo-cli,后者安装出现问题,前者没有问题,暂时还不知道原因.所以我安装的是hexo,如果你使用sudo npm install hexo -g 或者 sudo npm install hexo-cli -g,是不会成功的,最起码我是这样的。<br>正确的方法如下:<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ sudo npm install --unsafe-perm --verbose -g hexo</span><br></pre></td></tr></table></figure></p>\n<h3 id=\"第四步\"><a href=\"#第四步\" class=\"headerlink\" title=\"第四步\"></a>第四步</h3><p>修改以下hexo所在路径的文件<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ sudo vi /usr/<span class=\"built_in\">local</span>/lib/node_modules/hexo/bin/hexo</span><br></pre></td></tr></table></figure></p>\n<p>把#!/usr/bin/env node修改为!/usr/bin/env nodejs即可</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">#!/usr/bin/env nodejs</span><br><span class=\"line\">'use strict';</span><br><span class=\"line\">require('hexo-cli')();</span><br></pre></td></tr></table></figure>\n<p>然后输入hexo 看是否安装成功</p>\n<h3 id=\"第五步\"><a href=\"#第五步\" class=\"headerlink\" title=\"第五步\"></a>第五步</h3><p>创建项目:</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ mkdir blog</span><br><span class=\"line\">$ cd blog</span><br><span class=\"line\">$ hexo init</span><br><span class=\"line\">$ hexo g # 生成</span><br><span class=\"line\">$ hexo s # 启动服务</span><br></pre></td></tr></table></figure>\n<p>然后输入127.0.0.1:4000 就可以预览了</p>\n<h3 id=\"第六步\"><a href=\"#第六步\" class=\"headerlink\" title=\"第六步\"></a>第六步</h3><p>上传到github</p>\n<p>首先在github 建造一个 youname(自己的github名字).github.io</p>\n<p>在项目文件下安装插件</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">npm install hexo-deployer-git --save</span><br></pre></td></tr></table></figure>\n<p>在__config.yml中加入</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">deploy:</span><br><span class=\"line\"> type: git</span><br><span class=\"line\"> repository: [email protected]:youname/youmane.github.io.git</span><br><span class=\"line\"> branch: master</span><br></pre></td></tr></table></figure>\n<p>然后进入blog 文件</p>\n<figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$ hexo g</span><br><span class=\"line\">$ hexo d</span><br></pre></td></tr></table></figure>\n<p>就可以上传到github了。然后youname.github.io 就可以访问到blog了</p>\n"},{"title":"写在开头","date":"2017-10-05T07:22:28.000Z","top":1,"_content":"\n嗯,作为一个coder,早就有打算做一个博客的的想法,今天用github+hexo搭建这个blog,基本上还算顺利!\n以后的日子里,会将工作中遇到的一些问题解决的方案记录在这里。由于一些客观原因,有的解决方案会有些缺陷,欢迎PR!\n\n嗯,今天是blog可以访问的第一天,也算是自己的一个小小的成就。\n目前的想法是blog的内容主要有 PHP,MySQL,Linux(简单的运维知识),以及会有一些python的东西。\n\n\n","source":"_posts/hello-world.md","raw":"---\ntitle: 写在开头\ndate: 2017-10-05 15:22:28\ntags:\ncategories: PHP\ntop: 1\n---\n\n嗯,作为一个coder,早就有打算做一个博客的的想法,今天用github+hexo搭建这个blog,基本上还算顺利!\n以后的日子里,会将工作中遇到的一些问题解决的方案记录在这里。由于一些客观原因,有的解决方案会有些缺陷,欢迎PR!\n\n嗯,今天是blog可以访问的第一天,也算是自己的一个小小的成就。\n目前的想法是blog的内容主要有 PHP,MySQL,Linux(简单的运维知识),以及会有一些python的东西。\n\n\n","slug":"hello-world","published":1,"updated":"2018-05-27T10:38:07.628Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cjhop1sm20004cmyya7k5cpi1","content":"<p>嗯,作为一个coder,早就有打算做一个博客的的想法,今天用github+hexo搭建这个blog,基本上还算顺利!<br>以后的日子里,会将工作中遇到的一些问题解决的方案记录在这里。由于一些客观原因,有的解决方案会有些缺陷,欢迎PR!</p>\n<p>嗯,今天是blog可以访问的第一天,也算是自己的一个小小的成就。<br>目前的想法是blog的内容主要有 PHP,MySQL,Linux(简单的运维知识),以及会有一些python的东西。</p>\n","site":{"data":{}},"excerpt":"","more":"<p>嗯,作为一个coder,早就有打算做一个博客的的想法,今天用github+hexo搭建这个blog,基本上还算顺利!<br>以后的日子里,会将工作中遇到的一些问题解决的方案记录在这里。由于一些客观原因,有的解决方案会有些缺陷,欢迎PR!</p>\n<p>嗯,今天是blog可以访问的第一天,也算是自己的一个小小的成就。<br>目前的想法是blog的内容主要有 PHP,MySQL,Linux(简单的运维知识),以及会有一些python的东西。</p>\n"},{"title":"如何优雅的使用接口","date":"2017-06-02T07:22:28.000Z","top":99,"_content":"\n嗯,6.1刚过完,我们不在是宝宝了,来吧,撸一篇接口的文章(interface).\n\n在编程的过程中我们应该学会如何使用接口来给变我们的生活,极大的提升自我能力。\n接口不是新特性,但是非常重要,下面我们来撸个接口的小例子。\n\n虚构一个DocumentStore的类,这个类负责从不同的资源收集文本。可以从远程url读取html,也可以读取资源,也可以收集终端命令输出。\n\n**定义DocumentStore类**\n\n``` bash\nclass DocumentStore{\n protected $data = [];\n \n public function addDocument(Documenttable $document){\n $key = $document->getId();\n $value = $document->getContent();\n $this->data[key] = $value; \n }\n \n public function getDocuments(){\n return $this->data;\n }\n \n}\n\n```\n\n既然addDocument()方法的参数只能是Documenttable的类的实例,这样定义DocumentStore的类怎么行呢? 其实Documenttable不是类,是接口;\n\n**定义Documenttable**\n\n``` bash\n\ninterface Documenttable{\n public function getId();\n public function getContent(); \n \n}\n\n```\n\n这个接口定义表名,实现Documenttable接口的任何对象都必须提供一个公开的getId()方法和一个公开的getContent()方法。\n\n可是这么做有什么用呢?这么做的好处就是,我们可以分开定义获取稳定的类,而且能使用十分不同的方法。下面是一种实现方式,这种方式使用curl从远程url获取html。\n\n**定义HtmlDocument类**\n\n``` bash\nclass HtmlDocument implements Documenttable{\n\n protected $url;\n\n public function __construct($url)\n {\n $this->url = $url;\n }\n\n public function getId(){\n return $this->url;\n }\n\n public function getContent(){\n $ch = curl_init();\n curl_setopt($ch,CURLOPT_URL,$this->url);\n curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);\n curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,3);\n curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);\n curl_setopt($ch,CURLOPT_MAXREDIRS,3);\n curl_close($ch);\n return $thml;\n }\n}\n\n```\n\n**下面一个方法是获取流资源。**\n\n``` bash\nclass StreamDocument implements Documenttable{\n protected $resource;\n protected $buffer;\n\n public function __construct($resource,$buffer = 4096)\n {\n $this->resource=$resource;\n $this->buffer=$buffer;\n }\n\n public function getId(){\n\n return 'resource-' .(int)$this->resource;\n }\n\n public function getContent(){\n $streamContent = '';\n rewind($this->resource);\n while (feof($this->resource) === false){\n $streamContent .= fread($this->resource,$this->buffer);\n }\n return $streamContent;\n }\n}\n```\n\n\n**下面一个类是获取终端命令行的执行结果。**\n\n\n``` bash\nclass CommandOutDocument implements Documenttable{\n protected $command;\n public function __construct($command)\n {\n $this->command=$command;\n }\n \n public function getId(){\n return $this->command;\n }\n\n public function getContent(){\n return shell_exec($this->command);\n }\n\n}\n\n```\n\n**下面我们来演示一下借助上面的三个类来实现DocumentStore类。**\n\n``` bash\n\n$documentStore = new DocumentStore();\n\n//添加html文档\n$htmlDoc = new HtmlDocument('https:// www.i360.me');\n\n$documentStore->addDocument($htmlDoc);\n\n//添加流文档\n\n$streamDOC = new StreamDocument(fopen('stream.txt','rb'));\n\n$documentStore->addDocument($streamDOC);\n\n//添加终端命令文档\n\n$cmdDoc = new CommandOutDocument('cat /etc/hosts');\n\n$documentStore->addDocument($command);\n\nprint_r($documentStore->getDocuments());die;\n\n```\n\n这里HtmlDocument,StreamDocument,CommandOutDocument这三个类没有任何共同点,只是实现了同一个接口。\n\n","source":"_posts/interface.md","raw":"---\ntitle: 如何优雅的使用接口\ndate: 2017-6-2 15:22:28\ntags: \n- 接口\n- 设计模式\ncategories: PHP\ntop : 99\n---\n\n嗯,6.1刚过完,我们不在是宝宝了,来吧,撸一篇接口的文章(interface).\n\n在编程的过程中我们应该学会如何使用接口来给变我们的生活,极大的提升自我能力。\n接口不是新特性,但是非常重要,下面我们来撸个接口的小例子。\n\n虚构一个DocumentStore的类,这个类负责从不同的资源收集文本。可以从远程url读取html,也可以读取资源,也可以收集终端命令输出。\n\n**定义DocumentStore类**\n\n``` bash\nclass DocumentStore{\n protected $data = [];\n \n public function addDocument(Documenttable $document){\n $key = $document->getId();\n $value = $document->getContent();\n $this->data[key] = $value; \n }\n \n public function getDocuments(){\n return $this->data;\n }\n \n}\n\n```\n\n既然addDocument()方法的参数只能是Documenttable的类的实例,这样定义DocumentStore的类怎么行呢? 其实Documenttable不是类,是接口;\n\n**定义Documenttable**\n\n``` bash\n\ninterface Documenttable{\n public function getId();\n public function getContent(); \n \n}\n\n```\n\n这个接口定义表名,实现Documenttable接口的任何对象都必须提供一个公开的getId()方法和一个公开的getContent()方法。\n\n可是这么做有什么用呢?这么做的好处就是,我们可以分开定义获取稳定的类,而且能使用十分不同的方法。下面是一种实现方式,这种方式使用curl从远程url获取html。\n\n**定义HtmlDocument类**\n\n``` bash\nclass HtmlDocument implements Documenttable{\n\n protected $url;\n\n public function __construct($url)\n {\n $this->url = $url;\n }\n\n public function getId(){\n return $this->url;\n }\n\n public function getContent(){\n $ch = curl_init();\n curl_setopt($ch,CURLOPT_URL,$this->url);\n curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);\n curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,3);\n curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);\n curl_setopt($ch,CURLOPT_MAXREDIRS,3);\n curl_close($ch);\n return $thml;\n }\n}\n\n```\n\n**下面一个方法是获取流资源。**\n\n``` bash\nclass StreamDocument implements Documenttable{\n protected $resource;\n protected $buffer;\n\n public function __construct($resource,$buffer = 4096)\n {\n $this->resource=$resource;\n $this->buffer=$buffer;\n }\n\n public function getId(){\n\n return 'resource-' .(int)$this->resource;\n }\n\n public function getContent(){\n $streamContent = '';\n rewind($this->resource);\n while (feof($this->resource) === false){\n $streamContent .= fread($this->resource,$this->buffer);\n }\n return $streamContent;\n }\n}\n```\n\n\n**下面一个类是获取终端命令行的执行结果。**\n\n\n``` bash\nclass CommandOutDocument implements Documenttable{\n protected $command;\n public function __construct($command)\n {\n $this->command=$command;\n }\n \n public function getId(){\n return $this->command;\n }\n\n public function getContent(){\n return shell_exec($this->command);\n }\n\n}\n\n```\n\n**下面我们来演示一下借助上面的三个类来实现DocumentStore类。**\n\n``` bash\n\n$documentStore = new DocumentStore();\n\n//添加html文档\n$htmlDoc = new HtmlDocument('https:// www.i360.me');\n\n$documentStore->addDocument($htmlDoc);\n\n//添加流文档\n\n$streamDOC = new StreamDocument(fopen('stream.txt','rb'));\n\n$documentStore->addDocument($streamDOC);\n\n//添加终端命令文档\n\n$cmdDoc = new CommandOutDocument('cat /etc/hosts');\n\n$documentStore->addDocument($command);\n\nprint_r($documentStore->getDocuments());die;\n\n```\n\n这里HtmlDocument,StreamDocument,CommandOutDocument这三个类没有任何共同点,只是实现了同一个接口。\n\n","slug":"interface","published":1,"updated":"2018-05-27T10:38:07.628Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cjhop1sm50005cmyy52wvjb2j","content":"<p>嗯,6.1刚过完,我们不在是宝宝了,来吧,撸一篇接口的文章(interface).</p>\n<p>在编程的过程中我们应该学会如何使用接口来给变我们的生活,极大的提升自我能力。<br>接口不是新特性,但是非常重要,下面我们来撸个接口的小例子。</p>\n<p>虚构一个DocumentStore的类,这个类负责从不同的资源收集文本。可以从远程url读取html,也可以读取资源,也可以收集终端命令输出。</p>\n<p><strong>定义DocumentStore类</strong></p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">class DocumentStore{</span><br><span class=\"line\"> protected <span class=\"variable\">$data</span> = [];</span><br><span class=\"line\"> </span><br><span class=\"line\"> public <span class=\"keyword\">function</span> addDocument(Documenttable <span class=\"variable\">$document</span>){</span><br><span class=\"line\"> <span class=\"variable\">$key</span> = <span class=\"variable\">$document</span>->getId();</span><br><span class=\"line\"> <span class=\"variable\">$value</span> = <span class=\"variable\">$document</span>->getContent();</span><br><span class=\"line\"> <span class=\"variable\">$this</span>->data[key] = <span class=\"variable\">$value</span>; </span><br><span class=\"line\"> }</span><br><span class=\"line\"> </span><br><span class=\"line\"> public <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">getDocuments</span></span>(){</span><br><span class=\"line\"> <span class=\"built_in\">return</span> <span class=\"variable\">$this</span>->data;</span><br><span class=\"line\"> }</span><br><span class=\"line\"> </span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n<p>既然addDocument()方法的参数只能是Documenttable的类的实例,这样定义DocumentStore的类怎么行呢? 其实Documenttable不是类,是接口;</p>\n<p><strong>定义Documenttable</strong></p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"></span><br><span class=\"line\">interface Documenttable{</span><br><span class=\"line\"> public <span class=\"keyword\">function</span> getId();</span><br><span class=\"line\"> public <span class=\"keyword\">function</span> getContent(); </span><br><span class=\"line\"> </span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n<p>这个接口定义表名,实现Documenttable接口的任何对象都必须提供一个公开的getId()方法和一个公开的getContent()方法。</p>\n<p>可是这么做有什么用呢?这么做的好处就是,我们可以分开定义获取稳定的类,而且能使用十分不同的方法。下面是一种实现方式,这种方式使用curl从远程url获取html。</p>\n<p><strong>定义HtmlDocument类</strong></p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">class HtmlDocument implements Documenttable{</span><br><span class=\"line\"></span><br><span class=\"line\"> protected <span class=\"variable\">$url</span>;</span><br><span class=\"line\"></span><br><span class=\"line\"> public <span class=\"keyword\">function</span> __construct(<span class=\"variable\">$url</span>)</span><br><span class=\"line\"> {</span><br><span class=\"line\"> <span class=\"variable\">$this</span>->url = <span class=\"variable\">$url</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\"> public <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">getId</span></span>(){</span><br><span class=\"line\"> <span class=\"built_in\">return</span> <span class=\"variable\">$this</span>->url;</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\"> public <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">getContent</span></span>(){</span><br><span class=\"line\"> <span class=\"variable\">$ch</span> = curl_init();</span><br><span class=\"line\"> curl_setopt(<span class=\"variable\">$ch</span>,CURLOPT_URL,<span class=\"variable\">$this</span>->url);</span><br><span class=\"line\"> curl_setopt(<span class=\"variable\">$ch</span>,CURLOPT_RETURNTRANSFER,1);</span><br><span class=\"line\"> curl_setopt(<span class=\"variable\">$ch</span>,CURLOPT_CONNECTTIMEOUT,3);</span><br><span class=\"line\"> curl_setopt(<span class=\"variable\">$ch</span>,CURLOPT_FOLLOWLOCATION,1);</span><br><span class=\"line\"> curl_setopt(<span class=\"variable\">$ch</span>,CURLOPT_MAXREDIRS,3);</span><br><span class=\"line\"> curl_close(<span class=\"variable\">$ch</span>);</span><br><span class=\"line\"> <span class=\"built_in\">return</span> <span class=\"variable\">$thml</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n<p><strong>下面一个方法是获取流资源。</strong></p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">class StreamDocument implements Documenttable{</span><br><span class=\"line\"> protected <span class=\"variable\">$resource</span>;</span><br><span class=\"line\"> protected <span class=\"variable\">$buffer</span>;</span><br><span class=\"line\"></span><br><span class=\"line\"> public <span class=\"keyword\">function</span> __construct(<span class=\"variable\">$resource</span>,<span class=\"variable\">$buffer</span> = 4096)</span><br><span class=\"line\"> {</span><br><span class=\"line\"> <span class=\"variable\">$this</span>->resource=<span class=\"variable\">$resource</span>;</span><br><span class=\"line\"> <span class=\"variable\">$this</span>->buffer=<span class=\"variable\">$buffer</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\"> public <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">getId</span></span>(){</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"built_in\">return</span> <span class=\"string\">'resource-'</span> .(int)<span class=\"variable\">$this</span>->resource;</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\"> public <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">getContent</span></span>(){</span><br><span class=\"line\"> <span class=\"variable\">$streamContent</span> = <span class=\"string\">''</span>;</span><br><span class=\"line\"> rewind(<span class=\"variable\">$this</span>->resource);</span><br><span class=\"line\"> <span class=\"keyword\">while</span> (feof(<span class=\"variable\">$this</span>->resource) === <span class=\"literal\">false</span>){</span><br><span class=\"line\"> <span class=\"variable\">$streamContent</span> .= fread(<span class=\"variable\">$this</span>->resource,<span class=\"variable\">$this</span>->buffer);</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"built_in\">return</span> <span class=\"variable\">$streamContent</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n<p><strong>下面一个类是获取终端命令行的执行结果。</strong></p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">class CommandOutDocument implements Documenttable{</span><br><span class=\"line\"> protected <span class=\"variable\">$command</span>;</span><br><span class=\"line\"> public <span class=\"keyword\">function</span> __construct(<span class=\"variable\">$command</span>)</span><br><span class=\"line\"> {</span><br><span class=\"line\"> <span class=\"variable\">$this</span>-><span class=\"built_in\">command</span>=<span class=\"variable\">$command</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\"> </span><br><span class=\"line\"> public <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">getId</span></span>(){</span><br><span class=\"line\"> <span class=\"built_in\">return</span> <span class=\"variable\">$this</span>-><span class=\"built_in\">command</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\"> public <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">getContent</span></span>(){</span><br><span class=\"line\"> <span class=\"built_in\">return</span> shell_exec(<span class=\"variable\">$this</span>-><span class=\"built_in\">command</span>);</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n<p><strong>下面我们来演示一下借助上面的三个类来实现DocumentStore类。</strong></p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"></span><br><span class=\"line\"><span class=\"variable\">$documentStore</span> = new DocumentStore();</span><br><span class=\"line\"></span><br><span class=\"line\">//添加html文档</span><br><span class=\"line\"><span class=\"variable\">$htmlDoc</span> = new HtmlDocument(<span class=\"string\">'https:// www.i360.me'</span>);</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"variable\">$documentStore</span>->addDocument(<span class=\"variable\">$htmlDoc</span>);</span><br><span class=\"line\"></span><br><span class=\"line\">//添加流文档</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"variable\">$streamDOC</span> = new StreamDocument(fopen(<span class=\"string\">'stream.txt'</span>,<span class=\"string\">'rb'</span>));</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"variable\">$documentStore</span>->addDocument(<span class=\"variable\">$streamDOC</span>);</span><br><span class=\"line\"></span><br><span class=\"line\">//添加终端命令文档</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"variable\">$cmdDoc</span> = new CommandOutDocument(<span class=\"string\">'cat /etc/hosts'</span>);</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"variable\">$documentStore</span>->addDocument(<span class=\"variable\">$command</span>);</span><br><span class=\"line\"></span><br><span class=\"line\">print_r(<span class=\"variable\">$documentStore</span>->getDocuments());die;</span><br></pre></td></tr></table></figure>\n<p>这里HtmlDocument,StreamDocument,CommandOutDocument这三个类没有任何共同点,只是实现了同一个接口。</p>\n","site":{"data":{}},"excerpt":"","more":"<p>嗯,6.1刚过完,我们不在是宝宝了,来吧,撸一篇接口的文章(interface).</p>\n<p>在编程的过程中我们应该学会如何使用接口来给变我们的生活,极大的提升自我能力。<br>接口不是新特性,但是非常重要,下面我们来撸个接口的小例子。</p>\n<p>虚构一个DocumentStore的类,这个类负责从不同的资源收集文本。可以从远程url读取html,也可以读取资源,也可以收集终端命令输出。</p>\n<p><strong>定义DocumentStore类</strong></p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">class DocumentStore{</span><br><span class=\"line\"> protected <span class=\"variable\">$data</span> = [];</span><br><span class=\"line\"> </span><br><span class=\"line\"> public <span class=\"keyword\">function</span> addDocument(Documenttable <span class=\"variable\">$document</span>){</span><br><span class=\"line\"> <span class=\"variable\">$key</span> = <span class=\"variable\">$document</span>->getId();</span><br><span class=\"line\"> <span class=\"variable\">$value</span> = <span class=\"variable\">$document</span>->getContent();</span><br><span class=\"line\"> <span class=\"variable\">$this</span>->data[key] = <span class=\"variable\">$value</span>; </span><br><span class=\"line\"> }</span><br><span class=\"line\"> </span><br><span class=\"line\"> public <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">getDocuments</span></span>(){</span><br><span class=\"line\"> <span class=\"built_in\">return</span> <span class=\"variable\">$this</span>->data;</span><br><span class=\"line\"> }</span><br><span class=\"line\"> </span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n<p>既然addDocument()方法的参数只能是Documenttable的类的实例,这样定义DocumentStore的类怎么行呢? 其实Documenttable不是类,是接口;</p>\n<p><strong>定义Documenttable</strong></p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"></span><br><span class=\"line\">interface Documenttable{</span><br><span class=\"line\"> public <span class=\"keyword\">function</span> getId();</span><br><span class=\"line\"> public <span class=\"keyword\">function</span> getContent(); </span><br><span class=\"line\"> </span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n<p>这个接口定义表名,实现Documenttable接口的任何对象都必须提供一个公开的getId()方法和一个公开的getContent()方法。</p>\n<p>可是这么做有什么用呢?这么做的好处就是,我们可以分开定义获取稳定的类,而且能使用十分不同的方法。下面是一种实现方式,这种方式使用curl从远程url获取html。</p>\n<p><strong>定义HtmlDocument类</strong></p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">class HtmlDocument implements Documenttable{</span><br><span class=\"line\"></span><br><span class=\"line\"> protected <span class=\"variable\">$url</span>;</span><br><span class=\"line\"></span><br><span class=\"line\"> public <span class=\"keyword\">function</span> __construct(<span class=\"variable\">$url</span>)</span><br><span class=\"line\"> {</span><br><span class=\"line\"> <span class=\"variable\">$this</span>->url = <span class=\"variable\">$url</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\"> public <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">getId</span></span>(){</span><br><span class=\"line\"> <span class=\"built_in\">return</span> <span class=\"variable\">$this</span>->url;</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\"> public <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">getContent</span></span>(){</span><br><span class=\"line\"> <span class=\"variable\">$ch</span> = curl_init();</span><br><span class=\"line\"> curl_setopt(<span class=\"variable\">$ch</span>,CURLOPT_URL,<span class=\"variable\">$this</span>->url);</span><br><span class=\"line\"> curl_setopt(<span class=\"variable\">$ch</span>,CURLOPT_RETURNTRANSFER,1);</span><br><span class=\"line\"> curl_setopt(<span class=\"variable\">$ch</span>,CURLOPT_CONNECTTIMEOUT,3);</span><br><span class=\"line\"> curl_setopt(<span class=\"variable\">$ch</span>,CURLOPT_FOLLOWLOCATION,1);</span><br><span class=\"line\"> curl_setopt(<span class=\"variable\">$ch</span>,CURLOPT_MAXREDIRS,3);</span><br><span class=\"line\"> curl_close(<span class=\"variable\">$ch</span>);</span><br><span class=\"line\"> <span class=\"built_in\">return</span> <span class=\"variable\">$thml</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n<p><strong>下面一个方法是获取流资源。</strong></p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">class StreamDocument implements Documenttable{</span><br><span class=\"line\"> protected <span class=\"variable\">$resource</span>;</span><br><span class=\"line\"> protected <span class=\"variable\">$buffer</span>;</span><br><span class=\"line\"></span><br><span class=\"line\"> public <span class=\"keyword\">function</span> __construct(<span class=\"variable\">$resource</span>,<span class=\"variable\">$buffer</span> = 4096)</span><br><span class=\"line\"> {</span><br><span class=\"line\"> <span class=\"variable\">$this</span>->resource=<span class=\"variable\">$resource</span>;</span><br><span class=\"line\"> <span class=\"variable\">$this</span>->buffer=<span class=\"variable\">$buffer</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\"> public <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">getId</span></span>(){</span><br><span class=\"line\"></span><br><span class=\"line\"> <span class=\"built_in\">return</span> <span class=\"string\">'resource-'</span> .(int)<span class=\"variable\">$this</span>->resource;</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\"> public <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">getContent</span></span>(){</span><br><span class=\"line\"> <span class=\"variable\">$streamContent</span> = <span class=\"string\">''</span>;</span><br><span class=\"line\"> rewind(<span class=\"variable\">$this</span>->resource);</span><br><span class=\"line\"> <span class=\"keyword\">while</span> (feof(<span class=\"variable\">$this</span>->resource) === <span class=\"literal\">false</span>){</span><br><span class=\"line\"> <span class=\"variable\">$streamContent</span> .= fread(<span class=\"variable\">$this</span>->resource,<span class=\"variable\">$this</span>->buffer);</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"built_in\">return</span> <span class=\"variable\">$streamContent</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n<p><strong>下面一个类是获取终端命令行的执行结果。</strong></p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">class CommandOutDocument implements Documenttable{</span><br><span class=\"line\"> protected <span class=\"variable\">$command</span>;</span><br><span class=\"line\"> public <span class=\"keyword\">function</span> __construct(<span class=\"variable\">$command</span>)</span><br><span class=\"line\"> {</span><br><span class=\"line\"> <span class=\"variable\">$this</span>-><span class=\"built_in\">command</span>=<span class=\"variable\">$command</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\"> </span><br><span class=\"line\"> public <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">getId</span></span>(){</span><br><span class=\"line\"> <span class=\"built_in\">return</span> <span class=\"variable\">$this</span>-><span class=\"built_in\">command</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\"> public <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">getContent</span></span>(){</span><br><span class=\"line\"> <span class=\"built_in\">return</span> shell_exec(<span class=\"variable\">$this</span>-><span class=\"built_in\">command</span>);</span><br><span class=\"line\"> }</span><br><span class=\"line\"></span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n<p><strong>下面我们来演示一下借助上面的三个类来实现DocumentStore类。</strong></p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"></span><br><span class=\"line\"><span class=\"variable\">$documentStore</span> = new DocumentStore();</span><br><span class=\"line\"></span><br><span class=\"line\">//添加html文档</span><br><span class=\"line\"><span class=\"variable\">$htmlDoc</span> = new HtmlDocument(<span class=\"string\">'https:// www.i360.me'</span>);</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"variable\">$documentStore</span>->addDocument(<span class=\"variable\">$htmlDoc</span>);</span><br><span class=\"line\"></span><br><span class=\"line\">//添加流文档</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"variable\">$streamDOC</span> = new StreamDocument(fopen(<span class=\"string\">'stream.txt'</span>,<span class=\"string\">'rb'</span>));</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"variable\">$documentStore</span>->addDocument(<span class=\"variable\">$streamDOC</span>);</span><br><span class=\"line\"></span><br><span class=\"line\">//添加终端命令文档</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"variable\">$cmdDoc</span> = new CommandOutDocument(<span class=\"string\">'cat /etc/hosts'</span>);</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"variable\">$documentStore</span>->addDocument(<span class=\"variable\">$command</span>);</span><br><span class=\"line\"></span><br><span class=\"line\">print_r(<span class=\"variable\">$documentStore</span>->getDocuments());die;</span><br></pre></td></tr></table></figure>\n<p>这里HtmlDocument,StreamDocument,CommandOutDocument这三个类没有任何共同点,只是实现了同一个接口。</p>\n"},{"title":"jqweui loading 如何显示","date":"2017-11-30T05:03:09.000Z","top":90,"_content":"首先吐槽一下 jqweui的官方手册,有的地方确实不是太完善。\n不过现在做小程序的应该用官方的weui了。\n\ntoast 在jqweui 的手册中,只有下面几个方法(http://jqweui.com/components#toast )。\n\n```bash\n$.toast(\"取消操作\", \"cancel\");\n$.toast(\"禁止操作\", \"forbidden\");\n$.toast(\"纯文本\", \"text\");\n// 第二个参数可以是时间,单位毫秒\n$.toast(\"消息\", 20000);\n```\n\n但是右边的正在加载样式,手册中怎么也找不到。\n百度了一遍,解决方案几乎千篇一律的是自己用jqweui的样式自己封装。\n无赖只能F12 找到对应的按钮后,发现官方有现成的方法可以调用。\n\n\n\n展示正在加载中页面\n```bash\n$.showLoading(\"开门中...\");\n```\n\n关闭正在加载中页面\n\n```bash\n$.hideLoading();\n```\n\nok,完美解决。","source":"_posts/jqweui_toast.md","raw":"---\ntitle: jqweui loading 如何显示\ndate: 2017-11-30 13:03:09\ntags: \n- jqweui\n- weui'\ntop: 90\ncategories: \n---\n首先吐槽一下 jqweui的官方手册,有的地方确实不是太完善。\n不过现在做小程序的应该用官方的weui了。\n\ntoast 在jqweui 的手册中,只有下面几个方法(http://jqweui.com/components#toast )。\n\n```bash\n$.toast(\"取消操作\", \"cancel\");\n$.toast(\"禁止操作\", \"forbidden\");\n$.toast(\"纯文本\", \"text\");\n// 第二个参数可以是时间,单位毫秒\n$.toast(\"消息\", 20000);\n```\n\n但是右边的正在加载样式,手册中怎么也找不到。\n百度了一遍,解决方案几乎千篇一律的是自己用jqweui的样式自己封装。\n无赖只能F12 找到对应的按钮后,发现官方有现成的方法可以调用。\n\n\n\n展示正在加载中页面\n```bash\n$.showLoading(\"开门中...\");\n```\n\n关闭正在加载中页面\n\n```bash\n$.hideLoading();\n```\n\nok,完美解决。","slug":"jqweui_toast","published":1,"updated":"2018-05-27T10:38:07.628Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cjhop1sm80006cmyyd6nc3qtv","content":"<p>首先吐槽一下 jqweui的官方手册,有的地方确实不是太完善。<br>不过现在做小程序的应该用官方的weui了。</p>\n<p>toast 在jqweui 的手册中,只有下面几个方法(<a href=\"http://jqweui.com/components#toast\" target=\"_blank\" rel=\"external\">http://jqweui.com/components#toast</a> )。</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$.toast(<span class=\"string\">\"取消操作\"</span>, <span class=\"string\">\"cancel\"</span>);</span><br><span class=\"line\">$.toast(<span class=\"string\">\"禁止操作\"</span>, <span class=\"string\">\"forbidden\"</span>);</span><br><span class=\"line\">$.toast(<span class=\"string\">\"纯文本\"</span>, <span class=\"string\">\"text\"</span>);</span><br><span class=\"line\">// 第二个参数可以是时间,单位毫秒</span><br><span class=\"line\">$.toast(<span class=\"string\">\"消息\"</span>, 20000);</span><br></pre></td></tr></table></figure>\n<p>但是右边的正在加载样式,手册中怎么也找不到。<br>百度了一遍,解决方案几乎千篇一律的是自己用jqweui的样式自己封装。<br>无赖只能F12 找到对应的按钮后,发现官方有现成的方法可以调用。</p>\n<p>展示正在加载中页面<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$.showLoading(<span class=\"string\">\"开门中...\"</span>);</span><br></pre></td></tr></table></figure></p>\n<p>关闭正在加载中页面</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$.hideLoading();</span><br></pre></td></tr></table></figure>\n<p>ok,完美解决。</p>\n","site":{"data":{}},"excerpt":"","more":"<p>首先吐槽一下 jqweui的官方手册,有的地方确实不是太完善。<br>不过现在做小程序的应该用官方的weui了。</p>\n<p>toast 在jqweui 的手册中,只有下面几个方法(<a href=\"http://jqweui.com/components#toast\" target=\"_blank\" rel=\"external\">http://jqweui.com/components#toast</a> )。</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$.toast(<span class=\"string\">\"取消操作\"</span>, <span class=\"string\">\"cancel\"</span>);</span><br><span class=\"line\">$.toast(<span class=\"string\">\"禁止操作\"</span>, <span class=\"string\">\"forbidden\"</span>);</span><br><span class=\"line\">$.toast(<span class=\"string\">\"纯文本\"</span>, <span class=\"string\">\"text\"</span>);</span><br><span class=\"line\">// 第二个参数可以是时间,单位毫秒</span><br><span class=\"line\">$.toast(<span class=\"string\">\"消息\"</span>, 20000);</span><br></pre></td></tr></table></figure>\n<p>但是右边的正在加载样式,手册中怎么也找不到。<br>百度了一遍,解决方案几乎千篇一律的是自己用jqweui的样式自己封装。<br>无赖只能F12 找到对应的按钮后,发现官方有现成的方法可以调用。</p>\n<p>展示正在加载中页面<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$.showLoading(<span class=\"string\">\"开门中...\"</span>);</span><br></pre></td></tr></table></figure></p>\n<p>关闭正在加载中页面</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">$.hideLoading();</span><br></pre></td></tr></table></figure>\n<p>ok,完美解决。</p>\n"},{"title":"《高性能MySQL》笔记 - MySQL 锁的基本类型","date":"2017-10-06T07:53:58.000Z","top":97,"_content":"### MySQL 主要在两个层面上实现并发控制:服务器层和存储引擎层。\n\n当读写有冲突的时候,一般对于MySQL来说,是进行锁表操作的。\n\n### 读写锁\n读锁:读锁是共享的,多个用户同一时刻读取同一资源,他们之前互不影响。\n\n写锁:写锁则是排他的,也就是说一个写锁会阻塞其他的写锁和读锁,这是出于安全策略的考虑,只有这样,才能确保在给定的时间里,只有一个用户能执行写入,并防止其他用户读取正在写入的同一资源。\n\n### 锁粒度\n\n一种提高共享资源的并发性的方式就是让锁定的对象更有选择性。尽量只锁定需要修改的部分数据,而不是所有资源。更加理想的方式是,只对会修改的数据片进行精确的锁定。任何时候,在给定的资源上,锁定的数据量越少,则系统的并发程度越高,只要相互之间不发生冲突即可。\n\n但是,所有的锁都是需要消耗资源的。锁的各种操作,包括获得锁,检查锁是否已经解除,释放锁等,都会增加系统的开销。\n\n这里我们可以意识到:所谓的锁策略,是在锁的开销和数据的安全之间寻求平衡,这种平衡会影响到性能。\n\n#### 表锁\n\n表锁是MySQL中的基本策略,并且是开销最小的策略。当一个用户在对表进行操作(CUD)前,需要先获得写锁,这会阻塞其他用户对该表的所有操作。只有没有写锁时,其他读取用户才能获得读锁,读锁之间互不阻塞。\n\n#### 行锁\n\n行级锁可以最大程度的支持并发处理(同时也带来了最大的锁开销)。\n \n \n\n\n","source":"_posts/mysql-lock.md","raw":"---\ntitle: 《高性能MySQL》笔记 - MySQL 锁的基本类型\ndate: 2017-10-06 15:53:58\ntop: 97\ntags: \n- MySQl\n- 高并发\n- 数据库锁\ncategories: MySQL\n---\n### MySQL 主要在两个层面上实现并发控制:服务器层和存储引擎层。\n\n当读写有冲突的时候,一般对于MySQL来说,是进行锁表操作的。\n\n### 读写锁\n读锁:读锁是共享的,多个用户同一时刻读取同一资源,他们之前互不影响。\n\n写锁:写锁则是排他的,也就是说一个写锁会阻塞其他的写锁和读锁,这是出于安全策略的考虑,只有这样,才能确保在给定的时间里,只有一个用户能执行写入,并防止其他用户读取正在写入的同一资源。\n\n### 锁粒度\n\n一种提高共享资源的并发性的方式就是让锁定的对象更有选择性。尽量只锁定需要修改的部分数据,而不是所有资源。更加理想的方式是,只对会修改的数据片进行精确的锁定。任何时候,在给定的资源上,锁定的数据量越少,则系统的并发程度越高,只要相互之间不发生冲突即可。\n\n但是,所有的锁都是需要消耗资源的。锁的各种操作,包括获得锁,检查锁是否已经解除,释放锁等,都会增加系统的开销。\n\n这里我们可以意识到:所谓的锁策略,是在锁的开销和数据的安全之间寻求平衡,这种平衡会影响到性能。\n\n#### 表锁\n\n表锁是MySQL中的基本策略,并且是开销最小的策略。当一个用户在对表进行操作(CUD)前,需要先获得写锁,这会阻塞其他用户对该表的所有操作。只有没有写锁时,其他读取用户才能获得读锁,读锁之间互不阻塞。\n\n#### 行锁\n\n行级锁可以最大程度的支持并发处理(同时也带来了最大的锁开销)。\n \n \n\n\n","slug":"mysql-lock","published":1,"updated":"2018-05-27T10:38:07.628Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cjhop1smf000acmyywiu1m7d0","content":"<h3 id=\"MySQL-主要在两个层面上实现并发控制:服务器层和存储引擎层。\"><a href=\"#MySQL-主要在两个层面上实现并发控制:服务器层和存储引擎层。\" class=\"headerlink\" title=\"MySQL 主要在两个层面上实现并发控制:服务器层和存储引擎层。\"></a>MySQL 主要在两个层面上实现并发控制:服务器层和存储引擎层。</h3><p>当读写有冲突的时候,一般对于MySQL来说,是进行锁表操作的。</p>\n<h3 id=\"读写锁\"><a href=\"#读写锁\" class=\"headerlink\" title=\"读写锁\"></a>读写锁</h3><p>读锁:读锁是共享的,多个用户同一时刻读取同一资源,他们之前互不影响。</p>\n<p>写锁:写锁则是排他的,也就是说一个写锁会阻塞其他的写锁和读锁,这是出于安全策略的考虑,只有这样,才能确保在给定的时间里,只有一个用户能执行写入,并防止其他用户读取正在写入的同一资源。</p>\n<h3 id=\"锁粒度\"><a href=\"#锁粒度\" class=\"headerlink\" title=\"锁粒度\"></a>锁粒度</h3><p>一种提高共享资源的并发性的方式就是让锁定的对象更有选择性。尽量只锁定需要修改的部分数据,而不是所有资源。更加理想的方式是,只对会修改的数据片进行精确的锁定。任何时候,在给定的资源上,锁定的数据量越少,则系统的并发程度越高,只要相互之间不发生冲突即可。</p>\n<p>但是,所有的锁都是需要消耗资源的。锁的各种操作,包括获得锁,检查锁是否已经解除,释放锁等,都会增加系统的开销。</p>\n<p>这里我们可以意识到:所谓的锁策略,是在锁的开销和数据的安全之间寻求平衡,这种平衡会影响到性能。</p>\n<h4 id=\"表锁\"><a href=\"#表锁\" class=\"headerlink\" title=\"表锁\"></a>表锁</h4><p>表锁是MySQL中的基本策略,并且是开销最小的策略。当一个用户在对表进行操作(CUD)前,需要先获得写锁,这会阻塞其他用户对该表的所有操作。只有没有写锁时,其他读取用户才能获得读锁,读锁之间互不阻塞。</p>\n<h4 id=\"行锁\"><a href=\"#行锁\" class=\"headerlink\" title=\"行锁\"></a>行锁</h4><p>行级锁可以最大程度的支持并发处理(同时也带来了最大的锁开销)。</p>\n","site":{"data":{}},"excerpt":"","more":"<h3 id=\"MySQL-主要在两个层面上实现并发控制:服务器层和存储引擎层。\"><a href=\"#MySQL-主要在两个层面上实现并发控制:服务器层和存储引擎层。\" class=\"headerlink\" title=\"MySQL 主要在两个层面上实现并发控制:服务器层和存储引擎层。\"></a>MySQL 主要在两个层面上实现并发控制:服务器层和存储引擎层。</h3><p>当读写有冲突的时候,一般对于MySQL来说,是进行锁表操作的。</p>\n<h3 id=\"读写锁\"><a href=\"#读写锁\" class=\"headerlink\" title=\"读写锁\"></a>读写锁</h3><p>读锁:读锁是共享的,多个用户同一时刻读取同一资源,他们之前互不影响。</p>\n<p>写锁:写锁则是排他的,也就是说一个写锁会阻塞其他的写锁和读锁,这是出于安全策略的考虑,只有这样,才能确保在给定的时间里,只有一个用户能执行写入,并防止其他用户读取正在写入的同一资源。</p>\n<h3 id=\"锁粒度\"><a href=\"#锁粒度\" class=\"headerlink\" title=\"锁粒度\"></a>锁粒度</h3><p>一种提高共享资源的并发性的方式就是让锁定的对象更有选择性。尽量只锁定需要修改的部分数据,而不是所有资源。更加理想的方式是,只对会修改的数据片进行精确的锁定。任何时候,在给定的资源上,锁定的数据量越少,则系统的并发程度越高,只要相互之间不发生冲突即可。</p>\n<p>但是,所有的锁都是需要消耗资源的。锁的各种操作,包括获得锁,检查锁是否已经解除,释放锁等,都会增加系统的开销。</p>\n<p>这里我们可以意识到:所谓的锁策略,是在锁的开销和数据的安全之间寻求平衡,这种平衡会影响到性能。</p>\n<h4 id=\"表锁\"><a href=\"#表锁\" class=\"headerlink\" title=\"表锁\"></a>表锁</h4><p>表锁是MySQL中的基本策略,并且是开销最小的策略。当一个用户在对表进行操作(CUD)前,需要先获得写锁,这会阻塞其他用户对该表的所有操作。只有没有写锁时,其他读取用户才能获得读锁,读锁之间互不阻塞。</p>\n<h4 id=\"行锁\"><a href=\"#行锁\" class=\"headerlink\" title=\"行锁\"></a>行锁</h4><p>行级锁可以最大程度的支持并发处理(同时也带来了最大的锁开销)。</p>\n"},{"title":"【MySQL学习笔记】 MySQL 建立索引的思路和实例","date":"2018-04-28T15:54:39.000Z","top":80,"_content":"\n### 一、索引的分类\n#### 1、普通索引\n\n#### 2、唯一索引\n\n\n#### 3、全文索引\n\n 使用FULLTEXT参数可以设置为全文索引。全文索引只能创建在char,varchar或者 text 类型的字段上。\n\n#### 4、单列索引\n\n\n\n#### 5、多列索引\n \n多列索引是在多个字段上建立一个索引,也叫联合索引。该索引指向创建时对应的多个字段,可以通过这几个字段进行查询。但是,只有查询条件中使用了这些字段中的第一个字段时,索引才会被使用。例如,在表中对id,name,sex字段上建立索引,那么,只有查询条件使用了id字段是,该索引才会被使用。\n\n#### 6、空间索引\n\n\n### 二、创建索引的原则\n\n为了使索引的使用效率更高,在创建索引时,必须考虑在那些字段上创建索引和创建什么类型的索引。下面来说一下索引的设计原则。\n\n#### 1、选择唯一性索引\n\n 唯一索引的值是唯一的,可以更快速的通过索引来确定某条记录。例如学生学号是具有唯一性的,往该字段建立唯一索引可以快速的确定某个学生的信息。如果使用姓名的话,可能存在同名的现象,从而降低查询速度。\n \n#### 2、为经常需要排序、分组和联合操作的字段建立索引\n\n 经常需要 order by、group by、DIST 和 UNION 等操作的字段,排序操作会浪费很多时间。如果围棋建立索引,可以有效的避免排序操作。\n\n#### 3、为常作为查询条件的字段建立索引\n \n 如果某个字段经常用来当做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为这样的字段建立索引,可以提高整个表的查询速度。\n \n#### 4、限制索引的数目\n \n 索引的数目不是越多越好。每个索引都需要占磁盘空间,索引越多,需要的磁盘空间就越大。修改表时,对索引的重构和更新很麻烦。越多的索引,会使用更新表变得很浪费时间。\n\n#### 5、尽量使用数据量少的索引\n \n 如果索引的值很长,那么查询的速度会受到影响。例如,对一个char(100)类型的字段进行全文检索所需要的时间肯定要对比char(10)的类型的字段需要的时间要多。\n\n#### 6、尽量使用前缀来索引\n\n 如果索引的字段的值很长,最好使用值的前缀来索引。例如,text 和 Blog类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索的速度。\n \n#### 7、删除不再使用的或者少使用的索引\n\n 表中的数据被大量更新,或者数据的使用方式改变后,原有的一些索引可能不再需要,可以将其删除,从而减少索引对更新操作的影响。\n \n\n\n### 三、创建表时建立索引\n\n#### 1、创建普通索引\n\n```bash\ncreate table table_name(\n id int(11),\n name varchar(20),\n sex boolean,\n INDEX(id)\n);\n```\n\n查看表结构\n```bash\nshow create table table_name; \n```\n\n可以使 EXPLAIN 语句查看索引是否被使用 \n```bash\nexplain select * from table_name where id = 1\\G\n```\n\n#### 2、创建唯一索引\n```bash\ncreate table index2(\n id int unique,\n name varchar(20),\n unique INDEX index_2(id asc)\n);\n\n```\n\n#### 3、创建全文索引\n\n全文索引只能在char,varchar或者text 类型的字段上。而且,只有MyISAM 储存引擎支持全文索引。\n\n```bash\ncreate table idnex3(\n id int,\n info varchar(20),\n FULLTEXT INDEX index3_info(info)\n)ENGINE=MyISAM;\n\n```\n#### 4、创建单列索引\n\n```bash\ncreate table index4(\n id int,\n subject varchar(255),\n index index4_st(subject(10))\n);\n\n```\n这里需要注意的,subject 的长度为255,但是index4_st索引只有10。这样做的目的还是为了提高查询速度。对于字符型的数据,可以不用查询全部信息,只查询其前面的若干字符信息。\n\n#### 5、创建多列索引\n\n```bash\ncreate table index5(\n id int,\n name varchar(20),\n sex char(4),\n index index5_ns(name.sex)\n);\n\n```\n\n这是我们可以看到,name 和sex字段上已经创建了index_ns索引。\n\n下面我们来用explain 来看看索引情况;\n\n```bash\nmysql> explain select * from index5 where name = '22'\\G;\n*************************** 1. row ***************************\n id: 1\n select_type: SIMPLE\n table: index5\n partitions: NULL\n type: ref\npossible_keys: index5_ns\n key: index5_ns\n key_len: 63\n ref: const\n rows: 1\n filtered: 100.00\n Extra: NULL\n1 row in set, 1 warning (0.00 sec)\n\nERROR: \nNo query specified\n\n```\n\n再看一条\n\n```bash\nmysql> explain select * from index5 where sex = '22' \\G;\n*************************** 1. row ***************************\n id: 1\n select_type: SIMPLE\n table: index5\n partitions: NULL\n type: ALL\npossible_keys: NULL\n key: NULL\n key_len: NULL\n ref: NULL\n rows: 1\n filtered: 100.00\n Extra: Using where\n1 row in set, 1 warning (0.00 sec)\n\nERROR: \nNo query specified\n```\n\n我们发现: 在多列索引中,只有查询条件中使用了这些字段中的第一个字段时,才会被索引。\n\n\n\n### 四、在已经存在的表中创建索引\n\n#### 1、创建普通索引\n在example0() 表中的id 创建名为index7_id 的索引。\n\n```bash\ncreate index index7_id on example0(id);\n```\n#### 2、创建唯一索引\n```bash\ncreate UNIQUE index index8_name on index8(name);\n```\n\n#### 3、创建全文索引\n```bash\ncreate FULLTEXT index index9_info on index9(info);\n\n```\n\n#### 4、创建单列索引\n```bash\n\ncreate INDEX index_name ON index4(name(10));\n```\n\n#### 5、创建多列索引\n\n```angular2html\ncreate INDEX index_name ON table_name(name,sex);\n```\n\n### 五、用alter table 语句来创建索引\n\n#### 1、创建普通索引\n\n在name字段上创建名为indx_name 的索引\n```bash\nalter table table_name ADD INDEX index_name(name(20));\n```\n#### 2、创建唯一性索引\n\n```bash\nalter table table_name ADD UNIQUE INDEX index_name(id);\n```\n#### 3、创建全文索引\n\n```bash\nalter table table_name ADD FULLTEXT INDEX index_name(info);\n\n```\n#### 4、创建单列索引\n```bash\nalter table table_name ADD INDEX index_name(name(4));\n```\n#### 5、创建多列索引\n```bash\nalter tabel table_name ADD INDEX index_name(name.sex);\n```\n\n### 六、删除索引\n\n```bash\nDROP INDEX index_name ON table_name;\n```\n\n\n\n\n\n\n\n\n","source":"_posts/mysql建立索引.md","raw":"---\ntitle: 【MySQL学习笔记】 MySQL 建立索引的思路和实例\ndate: 2018-04-28 23:54:39\ntags:\ncategories: MySQL\ntop: 80\n---\n\n### 一、索引的分类\n#### 1、普通索引\n\n#### 2、唯一索引\n\n\n#### 3、全文索引\n\n 使用FULLTEXT参数可以设置为全文索引。全文索引只能创建在char,varchar或者 text 类型的字段上。\n\n#### 4、单列索引\n\n\n\n#### 5、多列索引\n \n多列索引是在多个字段上建立一个索引,也叫联合索引。该索引指向创建时对应的多个字段,可以通过这几个字段进行查询。但是,只有查询条件中使用了这些字段中的第一个字段时,索引才会被使用。例如,在表中对id,name,sex字段上建立索引,那么,只有查询条件使用了id字段是,该索引才会被使用。\n\n#### 6、空间索引\n\n\n### 二、创建索引的原则\n\n为了使索引的使用效率更高,在创建索引时,必须考虑在那些字段上创建索引和创建什么类型的索引。下面来说一下索引的设计原则。\n\n#### 1、选择唯一性索引\n\n 唯一索引的值是唯一的,可以更快速的通过索引来确定某条记录。例如学生学号是具有唯一性的,往该字段建立唯一索引可以快速的确定某个学生的信息。如果使用姓名的话,可能存在同名的现象,从而降低查询速度。\n \n#### 2、为经常需要排序、分组和联合操作的字段建立索引\n\n 经常需要 order by、group by、DIST 和 UNION 等操作的字段,排序操作会浪费很多时间。如果围棋建立索引,可以有效的避免排序操作。\n\n#### 3、为常作为查询条件的字段建立索引\n \n 如果某个字段经常用来当做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为这样的字段建立索引,可以提高整个表的查询速度。\n \n#### 4、限制索引的数目\n \n 索引的数目不是越多越好。每个索引都需要占磁盘空间,索引越多,需要的磁盘空间就越大。修改表时,对索引的重构和更新很麻烦。越多的索引,会使用更新表变得很浪费时间。\n\n#### 5、尽量使用数据量少的索引\n \n 如果索引的值很长,那么查询的速度会受到影响。例如,对一个char(100)类型的字段进行全文检索所需要的时间肯定要对比char(10)的类型的字段需要的时间要多。\n\n#### 6、尽量使用前缀来索引\n\n 如果索引的字段的值很长,最好使用值的前缀来索引。例如,text 和 Blog类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索的速度。\n \n#### 7、删除不再使用的或者少使用的索引\n\n 表中的数据被大量更新,或者数据的使用方式改变后,原有的一些索引可能不再需要,可以将其删除,从而减少索引对更新操作的影响。\n \n\n\n### 三、创建表时建立索引\n\n#### 1、创建普通索引\n\n```bash\ncreate table table_name(\n id int(11),\n name varchar(20),\n sex boolean,\n INDEX(id)\n);\n```\n\n查看表结构\n```bash\nshow create table table_name; \n```\n\n可以使 EXPLAIN 语句查看索引是否被使用 \n```bash\nexplain select * from table_name where id = 1\\G\n```\n\n#### 2、创建唯一索引\n```bash\ncreate table index2(\n id int unique,\n name varchar(20),\n unique INDEX index_2(id asc)\n);\n\n```\n\n#### 3、创建全文索引\n\n全文索引只能在char,varchar或者text 类型的字段上。而且,只有MyISAM 储存引擎支持全文索引。\n\n```bash\ncreate table idnex3(\n id int,\n info varchar(20),\n FULLTEXT INDEX index3_info(info)\n)ENGINE=MyISAM;\n\n```\n#### 4、创建单列索引\n\n```bash\ncreate table index4(\n id int,\n subject varchar(255),\n index index4_st(subject(10))\n);\n\n```\n这里需要注意的,subject 的长度为255,但是index4_st索引只有10。这样做的目的还是为了提高查询速度。对于字符型的数据,可以不用查询全部信息,只查询其前面的若干字符信息。\n\n#### 5、创建多列索引\n\n```bash\ncreate table index5(\n id int,\n name varchar(20),\n sex char(4),\n index index5_ns(name.sex)\n);\n\n```\n\n这是我们可以看到,name 和sex字段上已经创建了index_ns索引。\n\n下面我们来用explain 来看看索引情况;\n\n```bash\nmysql> explain select * from index5 where name = '22'\\G;\n*************************** 1. row ***************************\n id: 1\n select_type: SIMPLE\n table: index5\n partitions: NULL\n type: ref\npossible_keys: index5_ns\n key: index5_ns\n key_len: 63\n ref: const\n rows: 1\n filtered: 100.00\n Extra: NULL\n1 row in set, 1 warning (0.00 sec)\n\nERROR: \nNo query specified\n\n```\n\n再看一条\n\n```bash\nmysql> explain select * from index5 where sex = '22' \\G;\n*************************** 1. row ***************************\n id: 1\n select_type: SIMPLE\n table: index5\n partitions: NULL\n type: ALL\npossible_keys: NULL\n key: NULL\n key_len: NULL\n ref: NULL\n rows: 1\n filtered: 100.00\n Extra: Using where\n1 row in set, 1 warning (0.00 sec)\n\nERROR: \nNo query specified\n```\n\n我们发现: 在多列索引中,只有查询条件中使用了这些字段中的第一个字段时,才会被索引。\n\n\n\n### 四、在已经存在的表中创建索引\n\n#### 1、创建普通索引\n在example0() 表中的id 创建名为index7_id 的索引。\n\n```bash\ncreate index index7_id on example0(id);\n```\n#### 2、创建唯一索引\n```bash\ncreate UNIQUE index index8_name on index8(name);\n```\n\n#### 3、创建全文索引\n```bash\ncreate FULLTEXT index index9_info on index9(info);\n\n```\n\n#### 4、创建单列索引\n```bash\n\ncreate INDEX index_name ON index4(name(10));\n```\n\n#### 5、创建多列索引\n\n```angular2html\ncreate INDEX index_name ON table_name(name,sex);\n```\n\n### 五、用alter table 语句来创建索引\n\n#### 1、创建普通索引\n\n在name字段上创建名为indx_name 的索引\n```bash\nalter table table_name ADD INDEX index_name(name(20));\n```\n#### 2、创建唯一性索引\n\n```bash\nalter table table_name ADD UNIQUE INDEX index_name(id);\n```\n#### 3、创建全文索引\n\n```bash\nalter table table_name ADD FULLTEXT INDEX index_name(info);\n\n```\n#### 4、创建单列索引\n```bash\nalter table table_name ADD INDEX index_name(name(4));\n```\n#### 5、创建多列索引\n```bash\nalter tabel table_name ADD INDEX index_name(name.sex);\n```\n\n### 六、删除索引\n\n```bash\nDROP INDEX index_name ON table_name;\n```\n\n\n\n\n\n\n\n\n","slug":"mysql建立索引","published":1,"updated":"2018-05-27T10:38:07.628Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cjhop1smj000bcmyycabshee6","content":"<h3 id=\"一、索引的分类\"><a href=\"#一、索引的分类\" class=\"headerlink\" title=\"一、索引的分类\"></a>一、索引的分类</h3><h4 id=\"1、普通索引\"><a href=\"#1、普通索引\" class=\"headerlink\" title=\"1、普通索引\"></a>1、普通索引</h4><h4 id=\"2、唯一索引\"><a href=\"#2、唯一索引\" class=\"headerlink\" title=\"2、唯一索引\"></a>2、唯一索引</h4><h4 id=\"3、全文索引\"><a href=\"#3、全文索引\" class=\"headerlink\" title=\"3、全文索引\"></a>3、全文索引</h4><p> 使用FULLTEXT参数可以设置为全文索引。全文索引只能创建在char,varchar或者 text 类型的字段上。</p>\n<h4 id=\"4、单列索引\"><a href=\"#4、单列索引\" class=\"headerlink\" title=\"4、单列索引\"></a>4、单列索引</h4><h4 id=\"5、多列索引\"><a href=\"#5、多列索引\" class=\"headerlink\" title=\"5、多列索引\"></a>5、多列索引</h4><p>多列索引是在多个字段上建立一个索引,也叫联合索引。该索引指向创建时对应的多个字段,可以通过这几个字段进行查询。但是,只有查询条件中使用了这些字段中的第一个字段时,索引才会被使用。例如,在表中对id,name,sex字段上建立索引,那么,只有查询条件使用了id字段是,该索引才会被使用。</p>\n<h4 id=\"6、空间索引\"><a href=\"#6、空间索引\" class=\"headerlink\" title=\"6、空间索引\"></a>6、空间索引</h4><h3 id=\"二、创建索引的原则\"><a href=\"#二、创建索引的原则\" class=\"headerlink\" title=\"二、创建索引的原则\"></a>二、创建索引的原则</h3><p>为了使索引的使用效率更高,在创建索引时,必须考虑在那些字段上创建索引和创建什么类型的索引。下面来说一下索引的设计原则。</p>\n<h4 id=\"1、选择唯一性索引\"><a href=\"#1、选择唯一性索引\" class=\"headerlink\" title=\"1、选择唯一性索引\"></a>1、选择唯一性索引</h4><p> 唯一索引的值是唯一的,可以更快速的通过索引来确定某条记录。例如学生学号是具有唯一性的,往该字段建立唯一索引可以快速的确定某个学生的信息。如果使用姓名的话,可能存在同名的现象,从而降低查询速度。</p>\n<h4 id=\"2、为经常需要排序、分组和联合操作的字段建立索引\"><a href=\"#2、为经常需要排序、分组和联合操作的字段建立索引\" class=\"headerlink\" title=\"2、为经常需要排序、分组和联合操作的字段建立索引\"></a>2、为经常需要排序、分组和联合操作的字段建立索引</h4><p> 经常需要 order by、group by、DIST 和 UNION 等操作的字段,排序操作会浪费很多时间。如果围棋建立索引,可以有效的避免排序操作。</p>\n<h4 id=\"3、为常作为查询条件的字段建立索引\"><a href=\"#3、为常作为查询条件的字段建立索引\" class=\"headerlink\" title=\"3、为常作为查询条件的字段建立索引\"></a>3、为常作为查询条件的字段建立索引</h4><p> 如果某个字段经常用来当做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为这样的字段建立索引,可以提高整个表的查询速度。</p>\n<h4 id=\"4、限制索引的数目\"><a href=\"#4、限制索引的数目\" class=\"headerlink\" title=\"4、限制索引的数目\"></a>4、限制索引的数目</h4><p> 索引的数目不是越多越好。每个索引都需要占磁盘空间,索引越多,需要的磁盘空间就越大。修改表时,对索引的重构和更新很麻烦。越多的索引,会使用更新表变得很浪费时间。</p>\n<h4 id=\"5、尽量使用数据量少的索引\"><a href=\"#5、尽量使用数据量少的索引\" class=\"headerlink\" title=\"5、尽量使用数据量少的索引\"></a>5、尽量使用数据量少的索引</h4><p> 如果索引的值很长,那么查询的速度会受到影响。例如,对一个char(100)类型的字段进行全文检索所需要的时间肯定要对比char(10)的类型的字段需要的时间要多。</p>\n<h4 id=\"6、尽量使用前缀来索引\"><a href=\"#6、尽量使用前缀来索引\" class=\"headerlink\" title=\"6、尽量使用前缀来索引\"></a>6、尽量使用前缀来索引</h4><p> 如果索引的字段的值很长,最好使用值的前缀来索引。例如,text 和 Blog类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索的速度。</p>\n<h4 id=\"7、删除不再使用的或者少使用的索引\"><a href=\"#7、删除不再使用的或者少使用的索引\" class=\"headerlink\" title=\"7、删除不再使用的或者少使用的索引\"></a>7、删除不再使用的或者少使用的索引</h4><p> 表中的数据被大量更新,或者数据的使用方式改变后,原有的一些索引可能不再需要,可以将其删除,从而减少索引对更新操作的影响。</p>\n<h3 id=\"三、创建表时建立索引\"><a href=\"#三、创建表时建立索引\" class=\"headerlink\" title=\"三、创建表时建立索引\"></a>三、创建表时建立索引</h3><h4 id=\"1、创建普通索引\"><a href=\"#1、创建普通索引\" class=\"headerlink\" title=\"1、创建普通索引\"></a>1、创建普通索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">create table table_name(</span><br><span class=\"line\"> id int(11),</span><br><span class=\"line\"> name varchar(20),</span><br><span class=\"line\"> sex boolean,</span><br><span class=\"line\"> INDEX(id)</span><br><span class=\"line\">);</span><br></pre></td></tr></table></figure>\n<p>查看表结构<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">show create table table_name;</span><br></pre></td></tr></table></figure></p>\n<p>可以使 EXPLAIN 语句查看索引是否被使用<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">explain select * from table_name <span class=\"built_in\">where</span> id = 1\\G</span><br></pre></td></tr></table></figure></p>\n<h4 id=\"2、创建唯一索引\"><a href=\"#2、创建唯一索引\" class=\"headerlink\" title=\"2、创建唯一索引\"></a>2、创建唯一索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">create table index2(</span><br><span class=\"line\"> id int unique,</span><br><span class=\"line\"> name varchar(20),</span><br><span class=\"line\"> unique INDEX index_2(id asc)</span><br><span class=\"line\">);</span><br></pre></td></tr></table></figure>\n<h4 id=\"3、创建全文索引\"><a href=\"#3、创建全文索引\" class=\"headerlink\" title=\"3、创建全文索引\"></a>3、创建全文索引</h4><p>全文索引只能在char,varchar或者text 类型的字段上。而且,只有MyISAM 储存引擎支持全文索引。</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">create table idnex3(</span><br><span class=\"line\"> id int,</span><br><span class=\"line\"> info varchar(20),</span><br><span class=\"line\"> FULLTEXT INDEX index3_info(info)</span><br><span class=\"line\">)ENGINE=MyISAM;</span><br></pre></td></tr></table></figure>\n<h4 id=\"4、创建单列索引\"><a href=\"#4、创建单列索引\" class=\"headerlink\" title=\"4、创建单列索引\"></a>4、创建单列索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">create table index4(</span><br><span class=\"line\"> id int,</span><br><span class=\"line\"> subject varchar(255),</span><br><span class=\"line\"> index index4_st(subject(10))</span><br><span class=\"line\">);</span><br></pre></td></tr></table></figure>\n<p>这里需要注意的,subject 的长度为255,但是index4_st索引只有10。这样做的目的还是为了提高查询速度。对于字符型的数据,可以不用查询全部信息,只查询其前面的若干字符信息。</p>\n<h4 id=\"5、创建多列索引\"><a href=\"#5、创建多列索引\" class=\"headerlink\" title=\"5、创建多列索引\"></a>5、创建多列索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">create table index5(</span><br><span class=\"line\"> id int,</span><br><span class=\"line\"> name varchar(20),</span><br><span class=\"line\"> sex char(4),</span><br><span class=\"line\"> index index5_ns(name.sex)</span><br><span class=\"line\">);</span><br></pre></td></tr></table></figure>\n<p>这是我们可以看到,name 和sex字段上已经创建了index_ns索引。</p>\n<p>下面我们来用explain 来看看索引情况;</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">mysql> explain select * from index5 <span class=\"built_in\">where</span> name = <span class=\"string\">'22'</span>\\G;</span><br><span class=\"line\">*************************** 1. row ***************************</span><br><span class=\"line\"> id: 1</span><br><span class=\"line\"> select_type: SIMPLE</span><br><span class=\"line\"> table: index5</span><br><span class=\"line\"> partitions: NULL</span><br><span class=\"line\"> <span class=\"built_in\">type</span>: ref</span><br><span class=\"line\">possible_keys: index5_ns</span><br><span class=\"line\"> key: index5_ns</span><br><span class=\"line\"> key_len: 63</span><br><span class=\"line\"> ref: const</span><br><span class=\"line\"> rows: 1</span><br><span class=\"line\"> filtered: 100.00</span><br><span class=\"line\"> Extra: NULL</span><br><span class=\"line\">1 row <span class=\"keyword\">in</span> <span class=\"built_in\">set</span>, 1 warning (0.00 sec)</span><br><span class=\"line\"></span><br><span class=\"line\">ERROR: </span><br><span class=\"line\">No query specified</span><br></pre></td></tr></table></figure>\n<p>再看一条</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">mysql> explain select * from index5 <span class=\"built_in\">where</span> sex = <span class=\"string\">'22'</span> \\G;</span><br><span class=\"line\">*************************** 1. row ***************************</span><br><span class=\"line\"> id: 1</span><br><span class=\"line\"> select_type: SIMPLE</span><br><span class=\"line\"> table: index5</span><br><span class=\"line\"> partitions: NULL</span><br><span class=\"line\"> <span class=\"built_in\">type</span>: ALL</span><br><span class=\"line\">possible_keys: NULL</span><br><span class=\"line\"> key: NULL</span><br><span class=\"line\"> key_len: NULL</span><br><span class=\"line\"> ref: NULL</span><br><span class=\"line\"> rows: 1</span><br><span class=\"line\"> filtered: 100.00</span><br><span class=\"line\"> Extra: Using <span class=\"built_in\">where</span></span><br><span class=\"line\">1 row <span class=\"keyword\">in</span> <span class=\"built_in\">set</span>, 1 warning (0.00 sec)</span><br><span class=\"line\"></span><br><span class=\"line\">ERROR: </span><br><span class=\"line\">No query specified</span><br></pre></td></tr></table></figure>\n<p>我们发现: 在多列索引中,只有查询条件中使用了这些字段中的第一个字段时,才会被索引。</p>\n<h3 id=\"四、在已经存在的表中创建索引\"><a href=\"#四、在已经存在的表中创建索引\" class=\"headerlink\" title=\"四、在已经存在的表中创建索引\"></a>四、在已经存在的表中创建索引</h3><h4 id=\"1、创建普通索引-1\"><a href=\"#1、创建普通索引-1\" class=\"headerlink\" title=\"1、创建普通索引\"></a>1、创建普通索引</h4><p>在example0() 表中的id 创建名为index7_id 的索引。</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">create index index7_id on example0(id);</span><br></pre></td></tr></table></figure>\n<h4 id=\"2、创建唯一索引-1\"><a href=\"#2、创建唯一索引-1\" class=\"headerlink\" title=\"2、创建唯一索引\"></a>2、创建唯一索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">create UNIQUE index index8_name on index8(name);</span><br></pre></td></tr></table></figure>\n<h4 id=\"3、创建全文索引-1\"><a href=\"#3、创建全文索引-1\" class=\"headerlink\" title=\"3、创建全文索引\"></a>3、创建全文索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">create FULLTEXT index index9_info on index9(info);</span><br></pre></td></tr></table></figure>\n<h4 id=\"4、创建单列索引-1\"><a href=\"#4、创建单列索引-1\" class=\"headerlink\" title=\"4、创建单列索引\"></a>4、创建单列索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"></span><br><span class=\"line\">create INDEX index_name ON index4(name(10));</span><br></pre></td></tr></table></figure>\n<h4 id=\"5、创建多列索引-1\"><a href=\"#5、创建多列索引-1\" class=\"headerlink\" title=\"5、创建多列索引\"></a>5、创建多列索引</h4><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">create INDEX index_name ON table_name(name,sex);</span><br></pre></td></tr></table></figure>\n<h3 id=\"五、用alter-table-语句来创建索引\"><a href=\"#五、用alter-table-语句来创建索引\" class=\"headerlink\" title=\"五、用alter table 语句来创建索引\"></a>五、用alter table 语句来创建索引</h3><h4 id=\"1、创建普通索引-2\"><a href=\"#1、创建普通索引-2\" class=\"headerlink\" title=\"1、创建普通索引\"></a>1、创建普通索引</h4><p>在name字段上创建名为indx_name 的索引<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">alter table table_name ADD INDEX index_name(name(20));</span><br></pre></td></tr></table></figure></p>\n<h4 id=\"2、创建唯一性索引\"><a href=\"#2、创建唯一性索引\" class=\"headerlink\" title=\"2、创建唯一性索引\"></a>2、创建唯一性索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">alter table table_name ADD UNIQUE INDEX index_name(id);</span><br></pre></td></tr></table></figure>\n<h4 id=\"3、创建全文索引-2\"><a href=\"#3、创建全文索引-2\" class=\"headerlink\" title=\"3、创建全文索引\"></a>3、创建全文索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">alter table table_name ADD FULLTEXT INDEX index_name(info);</span><br></pre></td></tr></table></figure>\n<h4 id=\"4、创建单列索引-2\"><a href=\"#4、创建单列索引-2\" class=\"headerlink\" title=\"4、创建单列索引\"></a>4、创建单列索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">alter table table_name ADD INDEX index_name(name(4));</span><br></pre></td></tr></table></figure>\n<h4 id=\"5、创建多列索引-2\"><a href=\"#5、创建多列索引-2\" class=\"headerlink\" title=\"5、创建多列索引\"></a>5、创建多列索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">alter tabel table_name ADD INDEX index_name(name.sex);</span><br></pre></td></tr></table></figure>\n<h3 id=\"六、删除索引\"><a href=\"#六、删除索引\" class=\"headerlink\" title=\"六、删除索引\"></a>六、删除索引</h3><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">DROP INDEX index_name ON table_name;</span><br></pre></td></tr></table></figure>\n","site":{"data":{}},"excerpt":"","more":"<h3 id=\"一、索引的分类\"><a href=\"#一、索引的分类\" class=\"headerlink\" title=\"一、索引的分类\"></a>一、索引的分类</h3><h4 id=\"1、普通索引\"><a href=\"#1、普通索引\" class=\"headerlink\" title=\"1、普通索引\"></a>1、普通索引</h4><h4 id=\"2、唯一索引\"><a href=\"#2、唯一索引\" class=\"headerlink\" title=\"2、唯一索引\"></a>2、唯一索引</h4><h4 id=\"3、全文索引\"><a href=\"#3、全文索引\" class=\"headerlink\" title=\"3、全文索引\"></a>3、全文索引</h4><p> 使用FULLTEXT参数可以设置为全文索引。全文索引只能创建在char,varchar或者 text 类型的字段上。</p>\n<h4 id=\"4、单列索引\"><a href=\"#4、单列索引\" class=\"headerlink\" title=\"4、单列索引\"></a>4、单列索引</h4><h4 id=\"5、多列索引\"><a href=\"#5、多列索引\" class=\"headerlink\" title=\"5、多列索引\"></a>5、多列索引</h4><p>多列索引是在多个字段上建立一个索引,也叫联合索引。该索引指向创建时对应的多个字段,可以通过这几个字段进行查询。但是,只有查询条件中使用了这些字段中的第一个字段时,索引才会被使用。例如,在表中对id,name,sex字段上建立索引,那么,只有查询条件使用了id字段是,该索引才会被使用。</p>\n<h4 id=\"6、空间索引\"><a href=\"#6、空间索引\" class=\"headerlink\" title=\"6、空间索引\"></a>6、空间索引</h4><h3 id=\"二、创建索引的原则\"><a href=\"#二、创建索引的原则\" class=\"headerlink\" title=\"二、创建索引的原则\"></a>二、创建索引的原则</h3><p>为了使索引的使用效率更高,在创建索引时,必须考虑在那些字段上创建索引和创建什么类型的索引。下面来说一下索引的设计原则。</p>\n<h4 id=\"1、选择唯一性索引\"><a href=\"#1、选择唯一性索引\" class=\"headerlink\" title=\"1、选择唯一性索引\"></a>1、选择唯一性索引</h4><p> 唯一索引的值是唯一的,可以更快速的通过索引来确定某条记录。例如学生学号是具有唯一性的,往该字段建立唯一索引可以快速的确定某个学生的信息。如果使用姓名的话,可能存在同名的现象,从而降低查询速度。</p>\n<h4 id=\"2、为经常需要排序、分组和联合操作的字段建立索引\"><a href=\"#2、为经常需要排序、分组和联合操作的字段建立索引\" class=\"headerlink\" title=\"2、为经常需要排序、分组和联合操作的字段建立索引\"></a>2、为经常需要排序、分组和联合操作的字段建立索引</h4><p> 经常需要 order by、group by、DIST 和 UNION 等操作的字段,排序操作会浪费很多时间。如果围棋建立索引,可以有效的避免排序操作。</p>\n<h4 id=\"3、为常作为查询条件的字段建立索引\"><a href=\"#3、为常作为查询条件的字段建立索引\" class=\"headerlink\" title=\"3、为常作为查询条件的字段建立索引\"></a>3、为常作为查询条件的字段建立索引</h4><p> 如果某个字段经常用来当做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为这样的字段建立索引,可以提高整个表的查询速度。</p>\n<h4 id=\"4、限制索引的数目\"><a href=\"#4、限制索引的数目\" class=\"headerlink\" title=\"4、限制索引的数目\"></a>4、限制索引的数目</h4><p> 索引的数目不是越多越好。每个索引都需要占磁盘空间,索引越多,需要的磁盘空间就越大。修改表时,对索引的重构和更新很麻烦。越多的索引,会使用更新表变得很浪费时间。</p>\n<h4 id=\"5、尽量使用数据量少的索引\"><a href=\"#5、尽量使用数据量少的索引\" class=\"headerlink\" title=\"5、尽量使用数据量少的索引\"></a>5、尽量使用数据量少的索引</h4><p> 如果索引的值很长,那么查询的速度会受到影响。例如,对一个char(100)类型的字段进行全文检索所需要的时间肯定要对比char(10)的类型的字段需要的时间要多。</p>\n<h4 id=\"6、尽量使用前缀来索引\"><a href=\"#6、尽量使用前缀来索引\" class=\"headerlink\" title=\"6、尽量使用前缀来索引\"></a>6、尽量使用前缀来索引</h4><p> 如果索引的字段的值很长,最好使用值的前缀来索引。例如,text 和 Blog类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索的速度。</p>\n<h4 id=\"7、删除不再使用的或者少使用的索引\"><a href=\"#7、删除不再使用的或者少使用的索引\" class=\"headerlink\" title=\"7、删除不再使用的或者少使用的索引\"></a>7、删除不再使用的或者少使用的索引</h4><p> 表中的数据被大量更新,或者数据的使用方式改变后,原有的一些索引可能不再需要,可以将其删除,从而减少索引对更新操作的影响。</p>\n<h3 id=\"三、创建表时建立索引\"><a href=\"#三、创建表时建立索引\" class=\"headerlink\" title=\"三、创建表时建立索引\"></a>三、创建表时建立索引</h3><h4 id=\"1、创建普通索引\"><a href=\"#1、创建普通索引\" class=\"headerlink\" title=\"1、创建普通索引\"></a>1、创建普通索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">create table table_name(</span><br><span class=\"line\"> id int(11),</span><br><span class=\"line\"> name varchar(20),</span><br><span class=\"line\"> sex boolean,</span><br><span class=\"line\"> INDEX(id)</span><br><span class=\"line\">);</span><br></pre></td></tr></table></figure>\n<p>查看表结构<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">show create table table_name;</span><br></pre></td></tr></table></figure></p>\n<p>可以使 EXPLAIN 语句查看索引是否被使用<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">explain select * from table_name <span class=\"built_in\">where</span> id = 1\\G</span><br></pre></td></tr></table></figure></p>\n<h4 id=\"2、创建唯一索引\"><a href=\"#2、创建唯一索引\" class=\"headerlink\" title=\"2、创建唯一索引\"></a>2、创建唯一索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">create table index2(</span><br><span class=\"line\"> id int unique,</span><br><span class=\"line\"> name varchar(20),</span><br><span class=\"line\"> unique INDEX index_2(id asc)</span><br><span class=\"line\">);</span><br></pre></td></tr></table></figure>\n<h4 id=\"3、创建全文索引\"><a href=\"#3、创建全文索引\" class=\"headerlink\" title=\"3、创建全文索引\"></a>3、创建全文索引</h4><p>全文索引只能在char,varchar或者text 类型的字段上。而且,只有MyISAM 储存引擎支持全文索引。</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">create table idnex3(</span><br><span class=\"line\"> id int,</span><br><span class=\"line\"> info varchar(20),</span><br><span class=\"line\"> FULLTEXT INDEX index3_info(info)</span><br><span class=\"line\">)ENGINE=MyISAM;</span><br></pre></td></tr></table></figure>\n<h4 id=\"4、创建单列索引\"><a href=\"#4、创建单列索引\" class=\"headerlink\" title=\"4、创建单列索引\"></a>4、创建单列索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">create table index4(</span><br><span class=\"line\"> id int,</span><br><span class=\"line\"> subject varchar(255),</span><br><span class=\"line\"> index index4_st(subject(10))</span><br><span class=\"line\">);</span><br></pre></td></tr></table></figure>\n<p>这里需要注意的,subject 的长度为255,但是index4_st索引只有10。这样做的目的还是为了提高查询速度。对于字符型的数据,可以不用查询全部信息,只查询其前面的若干字符信息。</p>\n<h4 id=\"5、创建多列索引\"><a href=\"#5、创建多列索引\" class=\"headerlink\" title=\"5、创建多列索引\"></a>5、创建多列索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">create table index5(</span><br><span class=\"line\"> id int,</span><br><span class=\"line\"> name varchar(20),</span><br><span class=\"line\"> sex char(4),</span><br><span class=\"line\"> index index5_ns(name.sex)</span><br><span class=\"line\">);</span><br></pre></td></tr></table></figure>\n<p>这是我们可以看到,name 和sex字段上已经创建了index_ns索引。</p>\n<p>下面我们来用explain 来看看索引情况;</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">mysql> explain select * from index5 <span class=\"built_in\">where</span> name = <span class=\"string\">'22'</span>\\G;</span><br><span class=\"line\">*************************** 1. row ***************************</span><br><span class=\"line\"> id: 1</span><br><span class=\"line\"> select_type: SIMPLE</span><br><span class=\"line\"> table: index5</span><br><span class=\"line\"> partitions: NULL</span><br><span class=\"line\"> <span class=\"built_in\">type</span>: ref</span><br><span class=\"line\">possible_keys: index5_ns</span><br><span class=\"line\"> key: index5_ns</span><br><span class=\"line\"> key_len: 63</span><br><span class=\"line\"> ref: const</span><br><span class=\"line\"> rows: 1</span><br><span class=\"line\"> filtered: 100.00</span><br><span class=\"line\"> Extra: NULL</span><br><span class=\"line\">1 row <span class=\"keyword\">in</span> <span class=\"built_in\">set</span>, 1 warning (0.00 sec)</span><br><span class=\"line\"></span><br><span class=\"line\">ERROR: </span><br><span class=\"line\">No query specified</span><br></pre></td></tr></table></figure>\n<p>再看一条</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">mysql> explain select * from index5 <span class=\"built_in\">where</span> sex = <span class=\"string\">'22'</span> \\G;</span><br><span class=\"line\">*************************** 1. row ***************************</span><br><span class=\"line\"> id: 1</span><br><span class=\"line\"> select_type: SIMPLE</span><br><span class=\"line\"> table: index5</span><br><span class=\"line\"> partitions: NULL</span><br><span class=\"line\"> <span class=\"built_in\">type</span>: ALL</span><br><span class=\"line\">possible_keys: NULL</span><br><span class=\"line\"> key: NULL</span><br><span class=\"line\"> key_len: NULL</span><br><span class=\"line\"> ref: NULL</span><br><span class=\"line\"> rows: 1</span><br><span class=\"line\"> filtered: 100.00</span><br><span class=\"line\"> Extra: Using <span class=\"built_in\">where</span></span><br><span class=\"line\">1 row <span class=\"keyword\">in</span> <span class=\"built_in\">set</span>, 1 warning (0.00 sec)</span><br><span class=\"line\"></span><br><span class=\"line\">ERROR: </span><br><span class=\"line\">No query specified</span><br></pre></td></tr></table></figure>\n<p>我们发现: 在多列索引中,只有查询条件中使用了这些字段中的第一个字段时,才会被索引。</p>\n<h3 id=\"四、在已经存在的表中创建索引\"><a href=\"#四、在已经存在的表中创建索引\" class=\"headerlink\" title=\"四、在已经存在的表中创建索引\"></a>四、在已经存在的表中创建索引</h3><h4 id=\"1、创建普通索引-1\"><a href=\"#1、创建普通索引-1\" class=\"headerlink\" title=\"1、创建普通索引\"></a>1、创建普通索引</h4><p>在example0() 表中的id 创建名为index7_id 的索引。</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">create index index7_id on example0(id);</span><br></pre></td></tr></table></figure>\n<h4 id=\"2、创建唯一索引-1\"><a href=\"#2、创建唯一索引-1\" class=\"headerlink\" title=\"2、创建唯一索引\"></a>2、创建唯一索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">create UNIQUE index index8_name on index8(name);</span><br></pre></td></tr></table></figure>\n<h4 id=\"3、创建全文索引-1\"><a href=\"#3、创建全文索引-1\" class=\"headerlink\" title=\"3、创建全文索引\"></a>3、创建全文索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">create FULLTEXT index index9_info on index9(info);</span><br></pre></td></tr></table></figure>\n<h4 id=\"4、创建单列索引-1\"><a href=\"#4、创建单列索引-1\" class=\"headerlink\" title=\"4、创建单列索引\"></a>4、创建单列索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"></span><br><span class=\"line\">create INDEX index_name ON index4(name(10));</span><br></pre></td></tr></table></figure>\n<h4 id=\"5、创建多列索引-1\"><a href=\"#5、创建多列索引-1\" class=\"headerlink\" title=\"5、创建多列索引\"></a>5、创建多列索引</h4><figure class=\"highlight plain\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">create INDEX index_name ON table_name(name,sex);</span><br></pre></td></tr></table></figure>\n<h3 id=\"五、用alter-table-语句来创建索引\"><a href=\"#五、用alter-table-语句来创建索引\" class=\"headerlink\" title=\"五、用alter table 语句来创建索引\"></a>五、用alter table 语句来创建索引</h3><h4 id=\"1、创建普通索引-2\"><a href=\"#1、创建普通索引-2\" class=\"headerlink\" title=\"1、创建普通索引\"></a>1、创建普通索引</h4><p>在name字段上创建名为indx_name 的索引<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">alter table table_name ADD INDEX index_name(name(20));</span><br></pre></td></tr></table></figure></p>\n<h4 id=\"2、创建唯一性索引\"><a href=\"#2、创建唯一性索引\" class=\"headerlink\" title=\"2、创建唯一性索引\"></a>2、创建唯一性索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">alter table table_name ADD UNIQUE INDEX index_name(id);</span><br></pre></td></tr></table></figure>\n<h4 id=\"3、创建全文索引-2\"><a href=\"#3、创建全文索引-2\" class=\"headerlink\" title=\"3、创建全文索引\"></a>3、创建全文索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">alter table table_name ADD FULLTEXT INDEX index_name(info);</span><br></pre></td></tr></table></figure>\n<h4 id=\"4、创建单列索引-2\"><a href=\"#4、创建单列索引-2\" class=\"headerlink\" title=\"4、创建单列索引\"></a>4、创建单列索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">alter table table_name ADD INDEX index_name(name(4));</span><br></pre></td></tr></table></figure>\n<h4 id=\"5、创建多列索引-2\"><a href=\"#5、创建多列索引-2\" class=\"headerlink\" title=\"5、创建多列索引\"></a>5、创建多列索引</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">alter tabel table_name ADD INDEX index_name(name.sex);</span><br></pre></td></tr></table></figure>\n<h3 id=\"六、删除索引\"><a href=\"#六、删除索引\" class=\"headerlink\" title=\"六、删除索引\"></a>六、删除索引</h3><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">DROP INDEX index_name ON table_name;</span><br></pre></td></tr></table></figure>\n"},{"title":"php 生僻知识点","date":"2015-04-05T07:22:28.000Z","top":10,"_content":"\n### 类名前加'\\' 与不加的区别\n#### Example #1 在命名空间中访问全局类\n```bash\n<?php\nnamespace A\\B\\C;\nclass Exception extends \\Exception {}\n\n$a = new Exception('hi'); // $a 是类 A\\B\\C\\Exception 的一个对象\n$b = new \\Exception('hi'); // $b 是类 Exception 的一个对象\n\n$c = new ArrayObject; // 致命错误, 找不到 A\\B\\C\\ArrayObject 类\n?>\n```\n\n#### Example #2 命名空间中后备的全局函数/常量\n\n```bash\n\n<?php\nnamespace A\\B\\C;\n\nconst E_ERROR = 45;\nfunction strlen($str)\n{\n return \\strlen($str) - 1;\n}\n\necho E_ERROR, \"\\n\"; // 输出 \"45\"\necho INI_ALL, \"\\n\"; // 输出 \"7\" - 使用全局常量 INI_ALL\n\necho strlen('hi'), \"\\n\"; // 输出 \"1\"\nif (is_array('hi')) { // 输出 \"is not array\"\n echo \"is array\\n\";\n} else {\n echo \"is not array\\n\";\n}\n?>\n\n```\n#### 英文字母和中文汉字在不同字符集编码下的字节数\n英文字母:\n\n字节数 : 1;编码:GB2312\n\n字节数 : 1;编码:GBK\n\n字节数 : 1;编码:GB18030\n\n字节数 : 1;编码:ISO-8859-1\n\n字节数 : 1;编码:UTF-8\n\n字节数 : 4;编码:UTF-16\n\n字节数 : 2;编码:UTF-16BE\n\n字节数 : 2;编码:UTF-16LE\n\n \n\n中文汉字:\n\n字节数 : 2;编码:GB2312\n\n字节数 : 2;编码:GBK\n\n字节数 : 2;编码:GB18030\n\n字节数 : 1;编码:ISO-8859-1\n\n字节数 : 3;编码:UTF-8\n\n字节数 : 4;编码:UTF-16\n\n字节数 : 2;编码:UTF-16BE\n\n字节数 : 2;编码:UTF-16LE","source":"_posts/php学习笔记.md","raw":"---\ntitle: php 生僻知识点\ndate: 2015-04-05 15:22:28\ntags:\ncategories: PHP\ntop: 10\n---\n\n### 类名前加'\\' 与不加的区别\n#### Example #1 在命名空间中访问全局类\n```bash\n<?php\nnamespace A\\B\\C;\nclass Exception extends \\Exception {}\n\n$a = new Exception('hi'); // $a 是类 A\\B\\C\\Exception 的一个对象\n$b = new \\Exception('hi'); // $b 是类 Exception 的一个对象\n\n$c = new ArrayObject; // 致命错误, 找不到 A\\B\\C\\ArrayObject 类\n?>\n```\n\n#### Example #2 命名空间中后备的全局函数/常量\n\n```bash\n\n<?php\nnamespace A\\B\\C;\n\nconst E_ERROR = 45;\nfunction strlen($str)\n{\n return \\strlen($str) - 1;\n}\n\necho E_ERROR, \"\\n\"; // 输出 \"45\"\necho INI_ALL, \"\\n\"; // 输出 \"7\" - 使用全局常量 INI_ALL\n\necho strlen('hi'), \"\\n\"; // 输出 \"1\"\nif (is_array('hi')) { // 输出 \"is not array\"\n echo \"is array\\n\";\n} else {\n echo \"is not array\\n\";\n}\n?>\n\n```\n#### 英文字母和中文汉字在不同字符集编码下的字节数\n英文字母:\n\n字节数 : 1;编码:GB2312\n\n字节数 : 1;编码:GBK\n\n字节数 : 1;编码:GB18030\n\n字节数 : 1;编码:ISO-8859-1\n\n字节数 : 1;编码:UTF-8\n\n字节数 : 4;编码:UTF-16\n\n字节数 : 2;编码:UTF-16BE\n\n字节数 : 2;编码:UTF-16LE\n\n \n\n中文汉字:\n\n字节数 : 2;编码:GB2312\n\n字节数 : 2;编码:GBK\n\n字节数 : 2;编码:GB18030\n\n字节数 : 1;编码:ISO-8859-1\n\n字节数 : 3;编码:UTF-8\n\n字节数 : 4;编码:UTF-16\n\n字节数 : 2;编码:UTF-16BE\n\n字节数 : 2;编码:UTF-16LE","slug":"php学习笔记","published":1,"updated":"2018-05-27T10:38:07.628Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cjhop1smn000fcmyyj2us56ek","content":"<h3 id=\"类名前加’-’-与不加的区别\"><a href=\"#类名前加’-’-与不加的区别\" class=\"headerlink\" title=\"类名前加’\\’ 与不加的区别\"></a>类名前加’\\’ 与不加的区别</h3><h4 id=\"Example-1-在命名空间中访问全局类\"><a href=\"#Example-1-在命名空间中访问全局类\" class=\"headerlink\" title=\"Example #1 在命名空间中访问全局类\"></a>Example #1 在命名空间中访问全局类</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><?php</span><br><span class=\"line\">namespace A\\B\\C;</span><br><span class=\"line\">class Exception extends \\Exception {}</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"variable\">$a</span> = new Exception(<span class=\"string\">'hi'</span>); // <span class=\"variable\">$a</span> 是类 A\\B\\C\\Exception 的一个对象</span><br><span class=\"line\"><span class=\"variable\">$b</span> = new \\Exception(<span class=\"string\">'hi'</span>); // <span class=\"variable\">$b</span> 是类 Exception 的一个对象</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"variable\">$c</span> = new ArrayObject; // 致命错误, 找不到 A\\B\\C\\ArrayObject 类</span><br><span class=\"line\">?></span><br></pre></td></tr></table></figure>\n<h4 id=\"Example-2-命名空间中后备的全局函数-常量\"><a href=\"#Example-2-命名空间中后备的全局函数-常量\" class=\"headerlink\" title=\"Example #2 命名空间中后备的全局函数/常量\"></a>Example #2 命名空间中后备的全局函数/常量</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"></span><br><span class=\"line\"><?php</span><br><span class=\"line\">namespace A\\B\\C;</span><br><span class=\"line\"></span><br><span class=\"line\">const E_ERROR = 45;</span><br><span class=\"line\"><span class=\"keyword\">function</span> strlen(<span class=\"variable\">$str</span>)</span><br><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"built_in\">return</span> \\strlen(<span class=\"variable\">$str</span>) - 1;</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"built_in\">echo</span> E_ERROR, <span class=\"string\">\"\\n\"</span>; // 输出 <span class=\"string\">\"45\"</span></span><br><span class=\"line\"><span class=\"built_in\">echo</span> INI_ALL, <span class=\"string\">\"\\n\"</span>; // 输出 <span class=\"string\">\"7\"</span> - 使用全局常量 INI_ALL</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"built_in\">echo</span> strlen(<span class=\"string\">'hi'</span>), <span class=\"string\">\"\\n\"</span>; // 输出 <span class=\"string\">\"1\"</span></span><br><span class=\"line\"><span class=\"keyword\">if</span> (is_array(<span class=\"string\">'hi'</span>)) { // 输出 <span class=\"string\">\"is not array\"</span></span><br><span class=\"line\"> <span class=\"built_in\">echo</span> <span class=\"string\">\"is array\\n\"</span>;</span><br><span class=\"line\">} <span class=\"keyword\">else</span> {</span><br><span class=\"line\"> <span class=\"built_in\">echo</span> <span class=\"string\">\"is not array\\n\"</span>;</span><br><span class=\"line\">}</span><br><span class=\"line\">?></span><br></pre></td></tr></table></figure>\n<h4 id=\"英文字母和中文汉字在不同字符集编码下的字节数\"><a href=\"#英文字母和中文汉字在不同字符集编码下的字节数\" class=\"headerlink\" title=\"英文字母和中文汉字在不同字符集编码下的字节数\"></a>英文字母和中文汉字在不同字符集编码下的字节数</h4><p>英文字母:</p>\n<p>字节数 : 1;编码:GB2312</p>\n<p>字节数 : 1;编码:GBK</p>\n<p>字节数 : 1;编码:GB18030</p>\n<p>字节数 : 1;编码:ISO-8859-1</p>\n<p>字节数 : 1;编码:UTF-8</p>\n<p>字节数 : 4;编码:UTF-16</p>\n<p>字节数 : 2;编码:UTF-16BE</p>\n<p>字节数 : 2;编码:UTF-16LE</p>\n<p>中文汉字:</p>\n<p>字节数 : 2;编码:GB2312</p>\n<p>字节数 : 2;编码:GBK</p>\n<p>字节数 : 2;编码:GB18030</p>\n<p>字节数 : 1;编码:ISO-8859-1</p>\n<p>字节数 : 3;编码:UTF-8</p>\n<p>字节数 : 4;编码:UTF-16</p>\n<p>字节数 : 2;编码:UTF-16BE</p>\n<p>字节数 : 2;编码:UTF-16LE</p>\n","site":{"data":{}},"excerpt":"","more":"<h3 id=\"类名前加’-’-与不加的区别\"><a href=\"#类名前加’-’-与不加的区别\" class=\"headerlink\" title=\"类名前加’\\’ 与不加的区别\"></a>类名前加’\\’ 与不加的区别</h3><h4 id=\"Example-1-在命名空间中访问全局类\"><a href=\"#Example-1-在命名空间中访问全局类\" class=\"headerlink\" title=\"Example #1 在命名空间中访问全局类\"></a>Example #1 在命名空间中访问全局类</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><?php</span><br><span class=\"line\">namespace A\\B\\C;</span><br><span class=\"line\">class Exception extends \\Exception {}</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"variable\">$a</span> = new Exception(<span class=\"string\">'hi'</span>); // <span class=\"variable\">$a</span> 是类 A\\B\\C\\Exception 的一个对象</span><br><span class=\"line\"><span class=\"variable\">$b</span> = new \\Exception(<span class=\"string\">'hi'</span>); // <span class=\"variable\">$b</span> 是类 Exception 的一个对象</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"variable\">$c</span> = new ArrayObject; // 致命错误, 找不到 A\\B\\C\\ArrayObject 类</span><br><span class=\"line\">?></span><br></pre></td></tr></table></figure>\n<h4 id=\"Example-2-命名空间中后备的全局函数-常量\"><a href=\"#Example-2-命名空间中后备的全局函数-常量\" class=\"headerlink\" title=\"Example #2 命名空间中后备的全局函数/常量\"></a>Example #2 命名空间中后备的全局函数/常量</h4><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"></span><br><span class=\"line\"><?php</span><br><span class=\"line\">namespace A\\B\\C;</span><br><span class=\"line\"></span><br><span class=\"line\">const E_ERROR = 45;</span><br><span class=\"line\"><span class=\"keyword\">function</span> strlen(<span class=\"variable\">$str</span>)</span><br><span class=\"line\">{</span><br><span class=\"line\"> <span class=\"built_in\">return</span> \\strlen(<span class=\"variable\">$str</span>) - 1;</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"built_in\">echo</span> E_ERROR, <span class=\"string\">\"\\n\"</span>; // 输出 <span class=\"string\">\"45\"</span></span><br><span class=\"line\"><span class=\"built_in\">echo</span> INI_ALL, <span class=\"string\">\"\\n\"</span>; // 输出 <span class=\"string\">\"7\"</span> - 使用全局常量 INI_ALL</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"built_in\">echo</span> strlen(<span class=\"string\">'hi'</span>), <span class=\"string\">\"\\n\"</span>; // 输出 <span class=\"string\">\"1\"</span></span><br><span class=\"line\"><span class=\"keyword\">if</span> (is_array(<span class=\"string\">'hi'</span>)) { // 输出 <span class=\"string\">\"is not array\"</span></span><br><span class=\"line\"> <span class=\"built_in\">echo</span> <span class=\"string\">\"is array\\n\"</span>;</span><br><span class=\"line\">} <span class=\"keyword\">else</span> {</span><br><span class=\"line\"> <span class=\"built_in\">echo</span> <span class=\"string\">\"is not array\\n\"</span>;</span><br><span class=\"line\">}</span><br><span class=\"line\">?></span><br></pre></td></tr></table></figure>\n<h4 id=\"英文字母和中文汉字在不同字符集编码下的字节数\"><a href=\"#英文字母和中文汉字在不同字符集编码下的字节数\" class=\"headerlink\" title=\"英文字母和中文汉字在不同字符集编码下的字节数\"></a>英文字母和中文汉字在不同字符集编码下的字节数</h4><p>英文字母:</p>\n<p>字节数 : 1;编码:GB2312</p>\n<p>字节数 : 1;编码:GBK</p>\n<p>字节数 : 1;编码:GB18030</p>\n<p>字节数 : 1;编码:ISO-8859-1</p>\n<p>字节数 : 1;编码:UTF-8</p>\n<p>字节数 : 4;编码:UTF-16</p>\n<p>字节数 : 2;编码:UTF-16BE</p>\n<p>字节数 : 2;编码:UTF-16LE</p>\n<p>中文汉字:</p>\n<p>字节数 : 2;编码:GB2312</p>\n<p>字节数 : 2;编码:GBK</p>\n<p>字节数 : 2;编码:GB18030</p>\n<p>字节数 : 1;编码:ISO-8859-1</p>\n<p>字节数 : 3;编码:UTF-8</p>\n<p>字节数 : 4;编码:UTF-16</p>\n<p>字节数 : 2;编码:UTF-16BE</p>\n<p>字节数 : 2;编码:UTF-16LE</p>\n"},{"title":"sql 会引起全表扫码的语句","date":"2018-04-18T15:10:15.000Z","top":20,"_content":"\n#### 1、模糊查询效率很低:\n like % ... % //会全表扫描\n like %... //会全表扫描\n like ...% //这种之前建立的索引会起作用\n \n#### 2、查询条件中含有is null的select语句执行慢\n\nis not null 时永远不会使用索引。一般数据量大的表不要用is null查询。\n\n\n#### 3、查询条件中使用了不等于操作符(<>、!=)的select语句执行慢\n\n原因:SQL中,不等于操作符会限制索引,引起全表扫描,即使比较的字段上有索引\n解决方法:通过把不等于操作符改成or,可以使用索引,避免全表扫描。例如,把column<>’aaa’,改成column<’aaa’ or column>’aaa’,就可以使用索引了。\n\n#### 4、or语句使用不当会引起全表扫描\n原因:where子句中比较的两个条件,一个有索引,一个没索引,使用or则会引起全表扫描。例如:where A=:1 or B=:2,A上有索引,B上没索引,则比较B=:2时会重新开始全表扫描。","source":"_posts/sql会引起全表扫码的语句.md","raw":"---\ntitle: sql 会引起全表扫码的语句\ndate: 2018-04-18 23:10:15\ntags:\n- MySQL\ncategories: PHP\ntop: 20\n---\n\n#### 1、模糊查询效率很低:\n like % ... % //会全表扫描\n like %... //会全表扫描\n like ...% //这种之前建立的索引会起作用\n \n#### 2、查询条件中含有is null的select语句执行慢\n\nis not null 时永远不会使用索引。一般数据量大的表不要用is null查询。\n\n\n#### 3、查询条件中使用了不等于操作符(<>、!=)的select语句执行慢\n\n原因:SQL中,不等于操作符会限制索引,引起全表扫描,即使比较的字段上有索引\n解决方法:通过把不等于操作符改成or,可以使用索引,避免全表扫描。例如,把column<>’aaa’,改成column<’aaa’ or column>’aaa’,就可以使用索引了。\n\n#### 4、or语句使用不当会引起全表扫描\n原因:where子句中比较的两个条件,一个有索引,一个没索引,使用or则会引起全表扫描。例如:where A=:1 or B=:2,A上有索引,B上没索引,则比较B=:2时会重新开始全表扫描。","slug":"sql会引起全表扫码的语句","published":1,"updated":"2018-05-27T10:38:07.628Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cjhop1smq000gcmyyat4mpkeu","content":"<h4 id=\"1、模糊查询效率很低:\"><a href=\"#1、模糊查询效率很低:\" class=\"headerlink\" title=\"1、模糊查询效率很低:\"></a>1、模糊查询效率很低:</h4><pre><code>like % ... % //会全表扫描\nlike %... //会全表扫描\nlike ...% //这种之前建立的索引会起作用\n</code></pre><h4 id=\"2、查询条件中含有is-null的select语句执行慢\"><a href=\"#2、查询条件中含有is-null的select语句执行慢\" class=\"headerlink\" title=\"2、查询条件中含有is null的select语句执行慢\"></a>2、查询条件中含有is null的select语句执行慢</h4><p>is not null 时永远不会使用索引。一般数据量大的表不要用is null查询。</p>\n<h4 id=\"3、查询条件中使用了不等于操作符(-lt-gt-、-)的select语句执行慢\"><a href=\"#3、查询条件中使用了不等于操作符(-lt-gt-、-)的select语句执行慢\" class=\"headerlink\" title=\"3、查询条件中使用了不等于操作符(<>、!=)的select语句执行慢\"></a>3、查询条件中使用了不等于操作符(<>、!=)的select语句执行慢</h4><p>原因:SQL中,不等于操作符会限制索引,引起全表扫描,即使比较的字段上有索引<br>解决方法:通过把不等于操作符改成or,可以使用索引,避免全表扫描。例如,把column<>’aaa’,改成column<’aaa’ or column>’aaa’,就可以使用索引了。</p>\n<h4 id=\"4、or语句使用不当会引起全表扫描\"><a href=\"#4、or语句使用不当会引起全表扫描\" class=\"headerlink\" title=\"4、or语句使用不当会引起全表扫描\"></a>4、or语句使用不当会引起全表扫描</h4><p>原因:where子句中比较的两个条件,一个有索引,一个没索引,使用or则会引起全表扫描。例如:where A=:1 or B=:2,A上有索引,B上没索引,则比较B=:2时会重新开始全表扫描。</p>\n","site":{"data":{}},"excerpt":"","more":"<h4 id=\"1、模糊查询效率很低:\"><a href=\"#1、模糊查询效率很低:\" class=\"headerlink\" title=\"1、模糊查询效率很低:\"></a>1、模糊查询效率很低:</h4><pre><code>like % ... % //会全表扫描\nlike %... //会全表扫描\nlike ...% //这种之前建立的索引会起作用\n</code></pre><h4 id=\"2、查询条件中含有is-null的select语句执行慢\"><a href=\"#2、查询条件中含有is-null的select语句执行慢\" class=\"headerlink\" title=\"2、查询条件中含有is null的select语句执行慢\"></a>2、查询条件中含有is null的select语句执行慢</h4><p>is not null 时永远不会使用索引。一般数据量大的表不要用is null查询。</p>\n<h4 id=\"3、查询条件中使用了不等于操作符(-lt-gt-、-)的select语句执行慢\"><a href=\"#3、查询条件中使用了不等于操作符(-lt-gt-、-)的select语句执行慢\" class=\"headerlink\" title=\"3、查询条件中使用了不等于操作符(<>、!=)的select语句执行慢\"></a>3、查询条件中使用了不等于操作符(<>、!=)的select语句执行慢</h4><p>原因:SQL中,不等于操作符会限制索引,引起全表扫描,即使比较的字段上有索引<br>解决方法:通过把不等于操作符改成or,可以使用索引,避免全表扫描。例如,把column<>’aaa’,改成column<’aaa’ or column>’aaa’,就可以使用索引了。</p>\n<h4 id=\"4、or语句使用不当会引起全表扫描\"><a href=\"#4、or语句使用不当会引起全表扫描\" class=\"headerlink\" title=\"4、or语句使用不当会引起全表扫描\"></a>4、or语句使用不当会引起全表扫描</h4><p>原因:where子句中比较的两个条件,一个有索引,一个没索引,使用or则会引起全表扫描。例如:where A=:1 or B=:2,A上有索引,B上没索引,则比较B=:2时会重新开始全表扫描。</p>\n"},{"title":"佛渡有缘人-搭建shadowsoks服务器","date":"2017-12-05T03:01:01.000Z","top":null,"_content":"\n1. 安装 shadowsoksR,Shadowsocks的一个分支,比较不错。但是默认是 aes-256-cfb 加密,如果需要 chacha20 加密,需要手动切换。\n```bash\nwget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocksR.sh\nchmod +x shadowsocksR.sh\n./shadowsocksR.sh 2>&1 | tee shadowsocksR.log\n```\n\n2. 安装 shadowsocks-go版本,据说有buff,比python版Shadowsocks要快:\n```bash\nwget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-go.sh\nchmod +x shadowsocks-go.sh\n./shadowsocks-go.sh 2>&1 | tee shadowsocks-go.log\n```\n\n[服务器传送门](https://www.vultr.com/?ref=7115713)\n\n[客户端传送门](https://github.com/shadowsocks/shadowsocks-windows/releases)\n\n","source":"_posts/佛渡有缘人.md","raw":"---\ntitle: 佛渡有缘人-搭建shadowsoks服务器\ndate: 2017-12-05 11:01:01\ntags: \n- Linux\ntop: \ncategories: Linux\n---\n\n1. 安装 shadowsoksR,Shadowsocks的一个分支,比较不错。但是默认是 aes-256-cfb 加密,如果需要 chacha20 加密,需要手动切换。\n```bash\nwget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocksR.sh\nchmod +x shadowsocksR.sh\n./shadowsocksR.sh 2>&1 | tee shadowsocksR.log\n```\n\n2. 安装 shadowsocks-go版本,据说有buff,比python版Shadowsocks要快:\n```bash\nwget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-go.sh\nchmod +x shadowsocks-go.sh\n./shadowsocks-go.sh 2>&1 | tee shadowsocks-go.log\n```\n\n[服务器传送门](https://www.vultr.com/?ref=7115713)\n\n[客户端传送门](https://github.com/shadowsocks/shadowsocks-windows/releases)\n\n","slug":"佛渡有缘人","published":1,"updated":"2018-05-27T10:38:07.628Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cjhop1sn80019cmyyy9hghvia","content":"<ol>\n<li><p>安装 shadowsoksR,Shadowsocks的一个分支,比较不错。但是默认是 aes-256-cfb 加密,如果需要 chacha20 加密,需要手动切换。</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocksR.sh</span><br><span class=\"line\">chmod +x shadowsocksR.sh</span><br><span class=\"line\">./shadowsocksR.sh 2>&1 | tee shadowsocksR.log</span><br></pre></td></tr></table></figure>\n</li>\n<li><p>安装 shadowsocks-go版本,据说有buff,比python版Shadowsocks要快:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-go.sh</span><br><span class=\"line\">chmod +x shadowsocks-go.sh</span><br><span class=\"line\">./shadowsocks-go.sh 2>&1 | tee shadowsocks-go.log</span><br></pre></td></tr></table></figure>\n</li>\n</ol>\n<p><a href=\"https://www.vultr.com/?ref=7115713\" target=\"_blank\" rel=\"external\">服务器传送门</a></p>\n<p><a href=\"https://github.com/shadowsocks/shadowsocks-windows/releases\" target=\"_blank\" rel=\"external\">客户端传送门</a></p>\n","site":{"data":{}},"excerpt":"","more":"<ol>\n<li><p>安装 shadowsoksR,Shadowsocks的一个分支,比较不错。但是默认是 aes-256-cfb 加密,如果需要 chacha20 加密,需要手动切换。</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocksR.sh</span><br><span class=\"line\">chmod +x shadowsocksR.sh</span><br><span class=\"line\">./shadowsocksR.sh 2>&1 | tee shadowsocksR.log</span><br></pre></td></tr></table></figure>\n</li>\n<li><p>安装 shadowsocks-go版本,据说有buff,比python版Shadowsocks要快:</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-go.sh</span><br><span class=\"line\">chmod +x shadowsocks-go.sh</span><br><span class=\"line\">./shadowsocks-go.sh 2>&1 | tee shadowsocks-go.log</span><br></pre></td></tr></table></figure>\n</li>\n</ol>\n<p><a href=\"https://www.vultr.com/?ref=7115713\" target=\"_blank\" rel=\"external\">服务器传送门</a></p>\n<p><a href=\"https://github.com/shadowsocks/shadowsocks-windows/releases\" target=\"_blank\" rel=\"external\">客户端传送门</a></p>\n"},{"title":"正则学习笔记","date":"2018-04-16T06:46:45.000Z","top":1,"_content":"\n### 正则表达式的基本知识汇总\n#### 行定位符(^与$)\n“^” 表示以什么开头 eg: /^de \n\"&\" 表示以什么结尾 eg: de$/","source":"_posts/正则学习笔记.md","raw":"---\ntitle: 正则学习笔记\ndate: 2018-04-16 14:46:45\ntags:\ncategories: 正则\ntop: 1\n---\n\n### 正则表达式的基本知识汇总\n#### 行定位符(^与$)\n“^” 表示以什么开头 eg: /^de \n\"&\" 表示以什么结尾 eg: de$/","slug":"正则学习笔记","published":1,"updated":"2018-05-27T10:38:07.628Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cjhop1snb001bcmyyvlza7a8h","content":"<h3 id=\"正则表达式的基本知识汇总\"><a href=\"#正则表达式的基本知识汇总\" class=\"headerlink\" title=\"正则表达式的基本知识汇总\"></a>正则表达式的基本知识汇总</h3><h4 id=\"行定位符(-与-)\"><a href=\"#行定位符(-与-)\" class=\"headerlink\" title=\"行定位符(^与$)\"></a>行定位符(^与$)</h4><p>“^” 表示以什么开头 eg: /^de<br>“&” 表示以什么结尾 eg: de$/</p>\n","site":{"data":{}},"excerpt":"","more":"<h3 id=\"正则表达式的基本知识汇总\"><a href=\"#正则表达式的基本知识汇总\" class=\"headerlink\" title=\"正则表达式的基本知识汇总\"></a>正则表达式的基本知识汇总</h3><h4 id=\"行定位符(-与-)\"><a href=\"#行定位符(-与-)\" class=\"headerlink\" title=\"行定位符(^与$)\"></a>行定位符(^与$)</h4><p>“^” 表示以什么开头 eg: /^de<br>“&” 表示以什么结尾 eg: de$/</p>\n"},{"title":"18年面试题总结","date":"2018-04-13T10:16:59.000Z","top":2,"_content":"## 前言\n\n作为一个快两年的phper 感觉自己没敲多少代码,自己提升最快的就是在开发思路上,但是在代码质量上确实很菜,这也是这次下定决心辞职的原因,准备找一家有代码可敲的公司。\n\n\n\n## 算法题\n\n\n1、遍历出一个文件夹下的所有文件和文件夹\n\n```bash\nfunction my_scandir($dir){\n //定义文件输出的变量\n $files = [];\n if($handle = opendir($dir)){ //是否有权限打开\n while(( $file = readdir($handle)) !== false ){\n if(is_dir($dir.'/'.file)){\n $files[$file] = my_scandir($dir.'/'.file)\n }else{\n $files[] = $file;\n }\n } \n closedir($dir);\n return $diles; \n }\n}\n\n\n```\n\n2、写一个函数是不是回文字符串\n\n```bash\n function ishuiwen($string){\n \n //将字符串转化成数组\n $stra = str_split($string);\n //逆序输出数组array_reverse\n $strb=array_reverse($stra);\n //判断两数组是否相等,相等为回文\n for($i=0;$i<count($stra);$i++){\n if($stra[$i]!=$strb[$i]){\n return 1;\n break;\n }\n }\n return 2;\n }\n \n $string=\"abc12363211cba\";\n $res = ishuiwen($string);\n if($res==2){\n echo \"YES\";\n }else{\n echo \"NO!\";\n }\n \n\n\n```\n\n## 概念题\n#### 抽象类和接口的概念以及区别?\n\n\n\n抽象类:它是一种特殊的,不能被实例化的类,只能作为其他类的父类使用。使用abstract关键字声明。\n\n它是一种特殊的抽象类,也是一个特殊的类,使用interface声明。\n\n抽象方法:在方法前面有abstract,而且方法没有方法体,连“{ }”也不能有\n\n(1)抽象类的操作通过继承关键字extends实现,而接口的使用是通过implements关键字来实现。\n\n(2)抽象类中有数据成员,可以实现数据的封装,但是接口没有数据成员。\n\n(3)抽象类中可以有构造方法,但是接口没有构造方法。\n\n(4)抽象类的方法可以通过private、protected、public关键字修饰(抽象方法不能是private),而接口中的方法只能使用public关键字修饰。\n\n(5)一个类只能继承于一个抽象类,而一个类可以同时实现多个接口。\n\n(6)抽象类中可以有成员方法的实现代码,而接口中不可以有成员方法的实现代码\n\n\n#### __autoload()方法的工作原理是什么?\n\n使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。\n\n当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。\n\n这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后\n\n就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。\n\n使用自动载入的魔术函数可以不必要写很多个include或者require函数。","source":"_posts/面试题总结.md","raw":"---\ntitle: 18年面试题总结\ndate: 2018-04-13 18:16:59\ntags:\ncategories: PHP\ntop: 2\n---\n## 前言\n\n作为一个快两年的phper 感觉自己没敲多少代码,自己提升最快的就是在开发思路上,但是在代码质量上确实很菜,这也是这次下定决心辞职的原因,准备找一家有代码可敲的公司。\n\n\n\n## 算法题\n\n\n1、遍历出一个文件夹下的所有文件和文件夹\n\n```bash\nfunction my_scandir($dir){\n //定义文件输出的变量\n $files = [];\n if($handle = opendir($dir)){ //是否有权限打开\n while(( $file = readdir($handle)) !== false ){\n if(is_dir($dir.'/'.file)){\n $files[$file] = my_scandir($dir.'/'.file)\n }else{\n $files[] = $file;\n }\n } \n closedir($dir);\n return $diles; \n }\n}\n\n\n```\n\n2、写一个函数是不是回文字符串\n\n```bash\n function ishuiwen($string){\n \n //将字符串转化成数组\n $stra = str_split($string);\n //逆序输出数组array_reverse\n $strb=array_reverse($stra);\n //判断两数组是否相等,相等为回文\n for($i=0;$i<count($stra);$i++){\n if($stra[$i]!=$strb[$i]){\n return 1;\n break;\n }\n }\n return 2;\n }\n \n $string=\"abc12363211cba\";\n $res = ishuiwen($string);\n if($res==2){\n echo \"YES\";\n }else{\n echo \"NO!\";\n }\n \n\n\n```\n\n## 概念题\n#### 抽象类和接口的概念以及区别?\n\n\n\n抽象类:它是一种特殊的,不能被实例化的类,只能作为其他类的父类使用。使用abstract关键字声明。\n\n它是一种特殊的抽象类,也是一个特殊的类,使用interface声明。\n\n抽象方法:在方法前面有abstract,而且方法没有方法体,连“{ }”也不能有\n\n(1)抽象类的操作通过继承关键字extends实现,而接口的使用是通过implements关键字来实现。\n\n(2)抽象类中有数据成员,可以实现数据的封装,但是接口没有数据成员。\n\n(3)抽象类中可以有构造方法,但是接口没有构造方法。\n\n(4)抽象类的方法可以通过private、protected、public关键字修饰(抽象方法不能是private),而接口中的方法只能使用public关键字修饰。\n\n(5)一个类只能继承于一个抽象类,而一个类可以同时实现多个接口。\n\n(6)抽象类中可以有成员方法的实现代码,而接口中不可以有成员方法的实现代码\n\n\n#### __autoload()方法的工作原理是什么?\n\n使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。\n\n当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。\n\n这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后\n\n就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。\n\n使用自动载入的魔术函数可以不必要写很多个include或者require函数。","slug":"面试题总结","published":1,"updated":"2018-05-27T10:38:07.628Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cjhop1sne001dcmyypyesy39n","content":"<h2 id=\"前言\"><a href=\"#前言\" class=\"headerlink\" title=\"前言\"></a>前言</h2><p>作为一个快两年的phper 感觉自己没敲多少代码,自己提升最快的就是在开发思路上,但是在代码质量上确实很菜,这也是这次下定决心辞职的原因,准备找一家有代码可敲的公司。</p>\n<h2 id=\"算法题\"><a href=\"#算法题\" class=\"headerlink\" title=\"算法题\"></a>算法题</h2><p>1、遍历出一个文件夹下的所有文件和文件夹</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">function</span> my_scandir(<span class=\"variable\">$dir</span>){</span><br><span class=\"line\"> //定义文件输出的变量</span><br><span class=\"line\"> <span class=\"variable\">$files</span> = [];</span><br><span class=\"line\"> <span class=\"keyword\">if</span>(<span class=\"variable\">$handle</span> = opendir(<span class=\"variable\">$dir</span>)){ //是否有权限打开</span><br><span class=\"line\"> <span class=\"keyword\">while</span>(( <span class=\"variable\">$file</span> = readdir(<span class=\"variable\">$handle</span>)) !== <span class=\"literal\">false</span> ){</span><br><span class=\"line\"> <span class=\"keyword\">if</span>(is_dir(<span class=\"variable\">$dir</span>.<span class=\"string\">'/'</span>.file)){</span><br><span class=\"line\"> <span class=\"variable\">$files</span>[<span class=\"variable\">$file</span>] = my_scandir(<span class=\"variable\">$dir</span>.<span class=\"string\">'/'</span>.file)</span><br><span class=\"line\"> }<span class=\"keyword\">else</span>{</span><br><span class=\"line\"> <span class=\"variable\">$files</span>[] = <span class=\"variable\">$file</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\"> } </span><br><span class=\"line\"> closedir(<span class=\"variable\">$dir</span>);</span><br><span class=\"line\"> <span class=\"built_in\">return</span> <span class=\"variable\">$diles</span>; </span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n<p>2、写一个函数是不是回文字符串</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">function</span> ishuiwen(<span class=\"variable\">$string</span>){</span><br><span class=\"line\"> </span><br><span class=\"line\"> //将字符串转化成数组</span><br><span class=\"line\"> <span class=\"variable\">$stra</span> = str_split(<span class=\"variable\">$string</span>);</span><br><span class=\"line\"> //逆序输出数组array_reverse</span><br><span class=\"line\"> <span class=\"variable\">$strb</span>=array_reverse(<span class=\"variable\">$stra</span>);</span><br><span class=\"line\"> //判断两数组是否相等,相等为回文</span><br><span class=\"line\"> <span class=\"keyword\">for</span>(<span class=\"variable\">$i</span>=0;<span class=\"variable\">$i</span><count(<span class=\"variable\">$stra</span>);<span class=\"variable\">$i</span>++){</span><br><span class=\"line\"> <span class=\"keyword\">if</span>(<span class=\"variable\">$stra</span>[<span class=\"variable\">$i</span>]!=<span class=\"variable\">$strb</span>[<span class=\"variable\">$i</span>]){</span><br><span class=\"line\"> <span class=\"built_in\">return</span> 1;</span><br><span class=\"line\"> <span class=\"built_in\">break</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"built_in\">return</span> 2;</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"variable\">$string</span>=<span class=\"string\">\"abc12363211cba\"</span>;</span><br><span class=\"line\"><span class=\"variable\">$res</span> = ishuiwen(<span class=\"variable\">$string</span>);</span><br><span class=\"line\"><span class=\"keyword\">if</span>(<span class=\"variable\">$res</span>==2){</span><br><span class=\"line\"> <span class=\"built_in\">echo</span> <span class=\"string\">\"YES\"</span>;</span><br><span class=\"line\">}<span class=\"keyword\">else</span>{</span><br><span class=\"line\"> <span class=\"built_in\">echo</span> <span class=\"string\">\"NO!\"</span>;</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n<h2 id=\"概念题\"><a href=\"#概念题\" class=\"headerlink\" title=\"概念题\"></a>概念题</h2><h4 id=\"抽象类和接口的概念以及区别?\"><a href=\"#抽象类和接口的概念以及区别?\" class=\"headerlink\" title=\"抽象类和接口的概念以及区别?\"></a>抽象类和接口的概念以及区别?</h4><p>抽象类:它是一种特殊的,不能被实例化的类,只能作为其他类的父类使用。使用abstract关键字声明。</p>\n<p>它是一种特殊的抽象类,也是一个特殊的类,使用interface声明。</p>\n<p>抽象方法:在方法前面有abstract,而且方法没有方法体,连“{ }”也不能有</p>\n<p>(1)抽象类的操作通过继承关键字extends实现,而接口的使用是通过implements关键字来实现。</p>\n<p>(2)抽象类中有数据成员,可以实现数据的封装,但是接口没有数据成员。</p>\n<p>(3)抽象类中可以有构造方法,但是接口没有构造方法。</p>\n<p>(4)抽象类的方法可以通过private、protected、public关键字修饰(抽象方法不能是private),而接口中的方法只能使用public关键字修饰。</p>\n<p>(5)一个类只能继承于一个抽象类,而一个类可以同时实现多个接口。</p>\n<p>(6)抽象类中可以有成员方法的实现代码,而接口中不可以有成员方法的实现代码</p>\n<h4 id=\"autoload-方法的工作原理是什么?\"><a href=\"#autoload-方法的工作原理是什么?\" class=\"headerlink\" title=\"__autoload()方法的工作原理是什么?\"></a>__autoload()方法的工作原理是什么?</h4><p>使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。</p>\n<p>当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。</p>\n<p>这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后</p>\n<p>就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。</p>\n<p>使用自动载入的魔术函数可以不必要写很多个include或者require函数。</p>\n","site":{"data":{}},"excerpt":"","more":"<h2 id=\"前言\"><a href=\"#前言\" class=\"headerlink\" title=\"前言\"></a>前言</h2><p>作为一个快两年的phper 感觉自己没敲多少代码,自己提升最快的就是在开发思路上,但是在代码质量上确实很菜,这也是这次下定决心辞职的原因,准备找一家有代码可敲的公司。</p>\n<h2 id=\"算法题\"><a href=\"#算法题\" class=\"headerlink\" title=\"算法题\"></a>算法题</h2><p>1、遍历出一个文件夹下的所有文件和文件夹</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">function</span> my_scandir(<span class=\"variable\">$dir</span>){</span><br><span class=\"line\"> //定义文件输出的变量</span><br><span class=\"line\"> <span class=\"variable\">$files</span> = [];</span><br><span class=\"line\"> <span class=\"keyword\">if</span>(<span class=\"variable\">$handle</span> = opendir(<span class=\"variable\">$dir</span>)){ //是否有权限打开</span><br><span class=\"line\"> <span class=\"keyword\">while</span>(( <span class=\"variable\">$file</span> = readdir(<span class=\"variable\">$handle</span>)) !== <span class=\"literal\">false</span> ){</span><br><span class=\"line\"> <span class=\"keyword\">if</span>(is_dir(<span class=\"variable\">$dir</span>.<span class=\"string\">'/'</span>.file)){</span><br><span class=\"line\"> <span class=\"variable\">$files</span>[<span class=\"variable\">$file</span>] = my_scandir(<span class=\"variable\">$dir</span>.<span class=\"string\">'/'</span>.file)</span><br><span class=\"line\"> }<span class=\"keyword\">else</span>{</span><br><span class=\"line\"> <span class=\"variable\">$files</span>[] = <span class=\"variable\">$file</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\"> } </span><br><span class=\"line\"> closedir(<span class=\"variable\">$dir</span>);</span><br><span class=\"line\"> <span class=\"built_in\">return</span> <span class=\"variable\">$diles</span>; </span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n<p>2、写一个函数是不是回文字符串</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">function</span> ishuiwen(<span class=\"variable\">$string</span>){</span><br><span class=\"line\"> </span><br><span class=\"line\"> //将字符串转化成数组</span><br><span class=\"line\"> <span class=\"variable\">$stra</span> = str_split(<span class=\"variable\">$string</span>);</span><br><span class=\"line\"> //逆序输出数组array_reverse</span><br><span class=\"line\"> <span class=\"variable\">$strb</span>=array_reverse(<span class=\"variable\">$stra</span>);</span><br><span class=\"line\"> //判断两数组是否相等,相等为回文</span><br><span class=\"line\"> <span class=\"keyword\">for</span>(<span class=\"variable\">$i</span>=0;<span class=\"variable\">$i</span><count(<span class=\"variable\">$stra</span>);<span class=\"variable\">$i</span>++){</span><br><span class=\"line\"> <span class=\"keyword\">if</span>(<span class=\"variable\">$stra</span>[<span class=\"variable\">$i</span>]!=<span class=\"variable\">$strb</span>[<span class=\"variable\">$i</span>]){</span><br><span class=\"line\"> <span class=\"built_in\">return</span> 1;</span><br><span class=\"line\"> <span class=\"built_in\">break</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"built_in\">return</span> 2;</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"variable\">$string</span>=<span class=\"string\">\"abc12363211cba\"</span>;</span><br><span class=\"line\"><span class=\"variable\">$res</span> = ishuiwen(<span class=\"variable\">$string</span>);</span><br><span class=\"line\"><span class=\"keyword\">if</span>(<span class=\"variable\">$res</span>==2){</span><br><span class=\"line\"> <span class=\"built_in\">echo</span> <span class=\"string\">\"YES\"</span>;</span><br><span class=\"line\">}<span class=\"keyword\">else</span>{</span><br><span class=\"line\"> <span class=\"built_in\">echo</span> <span class=\"string\">\"NO!\"</span>;</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure>\n<h2 id=\"概念题\"><a href=\"#概念题\" class=\"headerlink\" title=\"概念题\"></a>概念题</h2><h4 id=\"抽象类和接口的概念以及区别?\"><a href=\"#抽象类和接口的概念以及区别?\" class=\"headerlink\" title=\"抽象类和接口的概念以及区别?\"></a>抽象类和接口的概念以及区别?</h4><p>抽象类:它是一种特殊的,不能被实例化的类,只能作为其他类的父类使用。使用abstract关键字声明。</p>\n<p>它是一种特殊的抽象类,也是一个特殊的类,使用interface声明。</p>\n<p>抽象方法:在方法前面有abstract,而且方法没有方法体,连“{ }”也不能有</p>\n<p>(1)抽象类的操作通过继承关键字extends实现,而接口的使用是通过implements关键字来实现。</p>\n<p>(2)抽象类中有数据成员,可以实现数据的封装,但是接口没有数据成员。</p>\n<p>(3)抽象类中可以有构造方法,但是接口没有构造方法。</p>\n<p>(4)抽象类的方法可以通过private、protected、public关键字修饰(抽象方法不能是private),而接口中的方法只能使用public关键字修饰。</p>\n<p>(5)一个类只能继承于一个抽象类,而一个类可以同时实现多个接口。</p>\n<p>(6)抽象类中可以有成员方法的实现代码,而接口中不可以有成员方法的实现代码</p>\n<h4 id=\"autoload-方法的工作原理是什么?\"><a href=\"#autoload-方法的工作原理是什么?\" class=\"headerlink\" title=\"__autoload()方法的工作原理是什么?\"></a>__autoload()方法的工作原理是什么?</h4><p>使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。</p>\n<p>当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。</p>\n<p>这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后</p>\n<p>就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。</p>\n<p>使用自动载入的魔术函数可以不必要写很多个include或者require函数。</p>\n"},{"title":"php基础总结","date":"2018-04-16T15:14:07.000Z","top":10,"_content":"\n## 一、常用魔术方法的触发时机?\n\n\n1) __autoload() :当程序实例化某个类,而该类没有在当前文件中被引入。此时会触发执行__autoload()。程序希望通过该方法,自动引入这个类文件。该方法有一个参数,即就是那个忘记引入的类的名称。__autoload()方法的工作原理是什么?当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后,就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。使用自动载入的魔术函数可以不必要写很多个include或者require函数。\n\n2) __construct() :这个是魔术构造方法。构造方法是实例化对象的时候自动执行的方法,作用就是初始化对象。该方法可以没有参数,也可以有多个参数。如果有参数,那么new这个对象的时候要记得写上相应的参数。在php5以前,没有魔术构造方法,普通构造方法是一个跟类名同名的方法来实现构造的。如果一个类中既写了魔术构造方法,又定义了普通构造方法。那么php5以上版本中,魔术方法起作用,普通构造方法不起作用。反之,在php5以前版本中,不认识魔术构造方法,只是把该方法当做普通的方法。\n\n3) __destruct() :这个是魔术析构方法。析构方法的作用和构造方法正好相反,是对象被销毁时被自动调用的,作用是释放内存。析构方法没有参数。\n\n4) __call() :当程序调用一个不存在或不可见的成员方法时,自动触发执行__call()。它有两个参数,分别是未访问到的方法名称和方法的参数。而第二个参数是数组类型。\n\n5) __get() :当程序调用一个未定义或不可见的成员属性时,自动触发执行__get()。它有一个参数,表示要调用的属性的名称。\n\n6) __set():当程序试图写入一个不存在或不可见的成员属性时,PHP就会自动执行__set()。它包含两个参数,分别表示属性名称和属性值。\n\n7) __tostring() :当程序使用echo或print输出对象时,会自动调用该方法。目的是希望通过该方法将对象转化为字符串,再输出。__tostring() 无参数,但是该方法必须有返回值。\n\n8) __clone() :当程序clone一个对象的时候,能触发__clone()方法,程序希望通过这个魔术方法实现:不仅仅单纯地克隆对象,还需要克隆出来的对象拥有原来对象的所有属性和方法。\n\n\n## 二、$this,self::, parent::,static:: 使用场景\n\n\n$this代表的是当前对象\n\nself代表的是当前的类\n\nparent代表的是当前类的父类\n\n使用场合:\n$this只能使用在当前类中,通过$this->可以调用当前类中的属性和方法;\nself只能在当前类中使用,通过作用域操作符::访问当前类中的类常量、当前类中的静态属性、当前类中的方法;\nparent只能使用在有父类的当前类中,通过作用域操作符::访问父类中的类常量、父类中的静态属性、父类中的方法\n\n后期静态绑定\n\n自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。\n\n准确说,后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。所谓的“转发调用”(forwarding call)指的是通过以下几种方式进行的静态调用:self::,parent::,static:: 以及 forward_static_call()。可用 get_called_class() 函数来得到被调用的方法所在的类名,static:: 则指出了其范围。\n\n该功能从语言内部角度考虑被命名为“后期静态绑定”。“后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。\nself:: 的限制\n\n使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类:\n\nExample #1 self:: 用法\n\n代码实例 \n\n\n```bash\n\n<?php\nclass A {\n public static function who() {\n echo __CLASS__;\n }\n public static function test() {\n self::who();\n }\n}\n\nclass B extends A {\n public static function who() {\n echo __CLASS__;\n }\n}\n\nB::test();\n?>\n```\n\n\n以上例程会输出:\n\nA\n\n后期静态绑定的用法\n\n后期静态绑定本想通过引入一个新的关键字表示运行时最初调用的类来绕过限制。简单地说,这个关键字能够让你在上述例子中调用 test() 时引用的类是 B 而不是 A。最终决定不引入新的关键字,而是使用已经预留的 static 关键字。\n\nExample #2 static:: 简单用法\n\n```bash\n<?php\nclass A {\n public static function who() {\n echo __CLASS__;\n }\n public static function test() {\n static::who(); // 后期静态绑定从这里开始\n }\n}\n\nclass B extends A {\n public static function who() {\n echo __CLASS__;\n }\n}\n\nB::test();\n?>\n```\n以上例程会输出:\n\nB\nNote:\n\n在非静态环境下,所调用的类即为该对象实例所属的类。由于 $this-> 会在同一作用范围内尝试调用私有方法,而 static:: 则可能给出不同结果。另一个区别是 static:: 只能用于静态属性。\n\nExample #3 非静态环境下使用 static::\n```bash\n<?php\nclass A {\n private function foo() {\n echo \"success!\\n\";\n }\n public function test() {\n $this->foo();\n static::foo();\n }\n}\n\nclass B extends A {\n /* foo() will be copied to B, hence its scope will still be A and\n * the call be successful */\n}\n\nclass C extends A {\n private function foo() {\n /* original method is replaced; the scope of the new one is C */\n }\n}\n\n$b = new B();\n$b->test();\n$c = new C();\n$c->test(); //fails\n?>\n```\n以上例程会输出:\n\nsuccess!\nsuccess!\nsuccess!\n\n\nFatal error: Call to private method C::foo() from context 'A' in /tmp/test.php on line 9\n\nNote:\n\n后期静态绑定的解析会一直到取得一个完全解析了的静态调用为止。另一方面,如果静态调用使用 parent:: 或者 self:: 将转发调用信息。\n\n\nExample #4 转发和非转发调用\n```bash\n <?php\n class A {\n public static function foo() {\n static::who();\n }\n\n public static function who() {\n echo __CLASS__.\"\\n\";\n }\n }\n\n class B extends A {\n public static function test() {\n A::foo();\n parent::foo();\n self::foo();\n }\n\n public static function who() {\n echo __CLASS__.\"\\n\";\n }\n }\n class C extends B {\n public static function who() {\n echo __CLASS__.\"\\n\";\n }\n }\n\n C::test();\n ?>\n``` \n以上例程会输出:\n\nA\nC\nC\n\n\n\n\n参考博客:\nhttp://php.net/manual/zh/language.oop5.static.php\n\nhttps://www.cnblogs.com/jerrypro/p/6422923.html","source":"_posts/高级php总结.md","raw":"---\ntitle: php基础总结\ndate: 2018-04-16 23:14:07\ntags:\ncategories: PHP\ntop: 10\n---\n\n## 一、常用魔术方法的触发时机?\n\n\n1) __autoload() :当程序实例化某个类,而该类没有在当前文件中被引入。此时会触发执行__autoload()。程序希望通过该方法,自动引入这个类文件。该方法有一个参数,即就是那个忘记引入的类的名称。__autoload()方法的工作原理是什么?当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后,就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。使用自动载入的魔术函数可以不必要写很多个include或者require函数。\n\n2) __construct() :这个是魔术构造方法。构造方法是实例化对象的时候自动执行的方法,作用就是初始化对象。该方法可以没有参数,也可以有多个参数。如果有参数,那么new这个对象的时候要记得写上相应的参数。在php5以前,没有魔术构造方法,普通构造方法是一个跟类名同名的方法来实现构造的。如果一个类中既写了魔术构造方法,又定义了普通构造方法。那么php5以上版本中,魔术方法起作用,普通构造方法不起作用。反之,在php5以前版本中,不认识魔术构造方法,只是把该方法当做普通的方法。\n\n3) __destruct() :这个是魔术析构方法。析构方法的作用和构造方法正好相反,是对象被销毁时被自动调用的,作用是释放内存。析构方法没有参数。\n\n4) __call() :当程序调用一个不存在或不可见的成员方法时,自动触发执行__call()。它有两个参数,分别是未访问到的方法名称和方法的参数。而第二个参数是数组类型。\n\n5) __get() :当程序调用一个未定义或不可见的成员属性时,自动触发执行__get()。它有一个参数,表示要调用的属性的名称。\n\n6) __set():当程序试图写入一个不存在或不可见的成员属性时,PHP就会自动执行__set()。它包含两个参数,分别表示属性名称和属性值。\n\n7) __tostring() :当程序使用echo或print输出对象时,会自动调用该方法。目的是希望通过该方法将对象转化为字符串,再输出。__tostring() 无参数,但是该方法必须有返回值。\n\n8) __clone() :当程序clone一个对象的时候,能触发__clone()方法,程序希望通过这个魔术方法实现:不仅仅单纯地克隆对象,还需要克隆出来的对象拥有原来对象的所有属性和方法。\n\n\n## 二、$this,self::, parent::,static:: 使用场景\n\n\n$this代表的是当前对象\n\nself代表的是当前的类\n\nparent代表的是当前类的父类\n\n使用场合:\n$this只能使用在当前类中,通过$this->可以调用当前类中的属性和方法;\nself只能在当前类中使用,通过作用域操作符::访问当前类中的类常量、当前类中的静态属性、当前类中的方法;\nparent只能使用在有父类的当前类中,通过作用域操作符::访问父类中的类常量、父类中的静态属性、父类中的方法\n\n后期静态绑定\n\n自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。\n\n准确说,后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。所谓的“转发调用”(forwarding call)指的是通过以下几种方式进行的静态调用:self::,parent::,static:: 以及 forward_static_call()。可用 get_called_class() 函数来得到被调用的方法所在的类名,static:: 则指出了其范围。\n\n该功能从语言内部角度考虑被命名为“后期静态绑定”。“后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。\nself:: 的限制\n\n使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类:\n\nExample #1 self:: 用法\n\n代码实例 \n\n\n```bash\n\n<?php\nclass A {\n public static function who() {\n echo __CLASS__;\n }\n public static function test() {\n self::who();\n }\n}\n\nclass B extends A {\n public static function who() {\n echo __CLASS__;\n }\n}\n\nB::test();\n?>\n```\n\n\n以上例程会输出:\n\nA\n\n后期静态绑定的用法\n\n后期静态绑定本想通过引入一个新的关键字表示运行时最初调用的类来绕过限制。简单地说,这个关键字能够让你在上述例子中调用 test() 时引用的类是 B 而不是 A。最终决定不引入新的关键字,而是使用已经预留的 static 关键字。\n\nExample #2 static:: 简单用法\n\n```bash\n<?php\nclass A {\n public static function who() {\n echo __CLASS__;\n }\n public static function test() {\n static::who(); // 后期静态绑定从这里开始\n }\n}\n\nclass B extends A {\n public static function who() {\n echo __CLASS__;\n }\n}\n\nB::test();\n?>\n```\n以上例程会输出:\n\nB\nNote:\n\n在非静态环境下,所调用的类即为该对象实例所属的类。由于 $this-> 会在同一作用范围内尝试调用私有方法,而 static:: 则可能给出不同结果。另一个区别是 static:: 只能用于静态属性。\n\nExample #3 非静态环境下使用 static::\n```bash\n<?php\nclass A {\n private function foo() {\n echo \"success!\\n\";\n }\n public function test() {\n $this->foo();\n static::foo();\n }\n}\n\nclass B extends A {\n /* foo() will be copied to B, hence its scope will still be A and\n * the call be successful */\n}\n\nclass C extends A {\n private function foo() {\n /* original method is replaced; the scope of the new one is C */\n }\n}\n\n$b = new B();\n$b->test();\n$c = new C();\n$c->test(); //fails\n?>\n```\n以上例程会输出:\n\nsuccess!\nsuccess!\nsuccess!\n\n\nFatal error: Call to private method C::foo() from context 'A' in /tmp/test.php on line 9\n\nNote:\n\n后期静态绑定的解析会一直到取得一个完全解析了的静态调用为止。另一方面,如果静态调用使用 parent:: 或者 self:: 将转发调用信息。\n\n\nExample #4 转发和非转发调用\n```bash\n <?php\n class A {\n public static function foo() {\n static::who();\n }\n\n public static function who() {\n echo __CLASS__.\"\\n\";\n }\n }\n\n class B extends A {\n public static function test() {\n A::foo();\n parent::foo();\n self::foo();\n }\n\n public static function who() {\n echo __CLASS__.\"\\n\";\n }\n }\n class C extends B {\n public static function who() {\n echo __CLASS__.\"\\n\";\n }\n }\n\n C::test();\n ?>\n``` \n以上例程会输出:\n\nA\nC\nC\n\n\n\n\n参考博客:\nhttp://php.net/manual/zh/language.oop5.static.php\n\nhttps://www.cnblogs.com/jerrypro/p/6422923.html","slug":"高级php总结","published":1,"updated":"2018-05-27T10:38:07.628Z","comments":1,"layout":"post","photos":[],"link":"","_id":"cjhop1sng001fcmyyd35e7ptk","content":"<h2 id=\"一、常用魔术方法的触发时机?\"><a href=\"#一、常用魔术方法的触发时机?\" class=\"headerlink\" title=\"一、常用魔术方法的触发时机?\"></a>一、常用魔术方法的触发时机?</h2><p>1) <strong>autoload() :当程序实例化某个类,而该类没有在当前文件中被引入。此时会触发执行</strong>autoload()。程序希望通过该方法,自动引入这个类文件。该方法有一个参数,即就是那个忘记引入的类的名称。<strong>autoload()方法的工作原理是什么?当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行</strong>autoload()函数。这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后,就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。使用自动载入的魔术函数可以不必要写很多个include或者require函数。</p>\n<p>2) __construct() :这个是魔术构造方法。构造方法是实例化对象的时候自动执行的方法,作用就是初始化对象。该方法可以没有参数,也可以有多个参数。如果有参数,那么new这个对象的时候要记得写上相应的参数。在php5以前,没有魔术构造方法,普通构造方法是一个跟类名同名的方法来实现构造的。如果一个类中既写了魔术构造方法,又定义了普通构造方法。那么php5以上版本中,魔术方法起作用,普通构造方法不起作用。反之,在php5以前版本中,不认识魔术构造方法,只是把该方法当做普通的方法。</p>\n<p>3) __destruct() :这个是魔术析构方法。析构方法的作用和构造方法正好相反,是对象被销毁时被自动调用的,作用是释放内存。析构方法没有参数。</p>\n<p>4) <strong>call() :当程序调用一个不存在或不可见的成员方法时,自动触发执行</strong>call()。它有两个参数,分别是未访问到的方法名称和方法的参数。而第二个参数是数组类型。</p>\n<p>5) <strong>get() :当程序调用一个未定义或不可见的成员属性时,自动触发执行</strong>get()。它有一个参数,表示要调用的属性的名称。</p>\n<p>6) <strong>set():当程序试图写入一个不存在或不可见的成员属性时,PHP就会自动执行</strong>set()。它包含两个参数,分别表示属性名称和属性值。</p>\n<p>7) <strong>tostring() :当程序使用echo或print输出对象时,会自动调用该方法。目的是希望通过该方法将对象转化为字符串,再输出。</strong>tostring() 无参数,但是该方法必须有返回值。</p>\n<p>8) <strong>clone() :当程序clone一个对象的时候,能触发</strong>clone()方法,程序希望通过这个魔术方法实现:不仅仅单纯地克隆对象,还需要克隆出来的对象拥有原来对象的所有属性和方法。</p>\n<h2 id=\"二、-this,self-parent-static-使用场景\"><a href=\"#二、-this,self-parent-static-使用场景\" class=\"headerlink\" title=\"二、$this,self::, parent::,static:: 使用场景\"></a>二、$this,self::, parent::,static:: 使用场景</h2><p>$this代表的是当前对象</p>\n<p>self代表的是当前的类</p>\n<p>parent代表的是当前类的父类</p>\n<p>使用场合:<br>$this只能使用在当前类中,通过$this->可以调用当前类中的属性和方法;<br>self只能在当前类中使用,通过作用域操作符::访问当前类中的类常量、当前类中的静态属性、当前类中的方法;<br>parent只能使用在有父类的当前类中,通过作用域操作符::访问父类中的类常量、父类中的静态属性、父类中的方法</p>\n<p>后期静态绑定</p>\n<p>自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。</p>\n<p>准确说,后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。所谓的“转发调用”(forwarding call)指的是通过以下几种方式进行的静态调用:self::,parent::,static:: 以及 forward_static_call()。可用 get_called_class() 函数来得到被调用的方法所在的类名,static:: 则指出了其范围。</p>\n<p>该功能从语言内部角度考虑被命名为“后期静态绑定”。“后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。<br>self:: 的限制</p>\n<p>使用 self:: 或者 <strong>CLASS</strong> 对当前类的静态引用,取决于定义当前方法所在的类:</p>\n<p>Example #1 self:: 用法</p>\n<p>代码实例 </p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"></span><br><span class=\"line\"><?php</span><br><span class=\"line\">class A {</span><br><span class=\"line\"> public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">who</span></span>() {</span><br><span class=\"line\"> <span class=\"built_in\">echo</span> __CLASS__;</span><br><span class=\"line\"> }</span><br><span class=\"line\"> public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">test</span></span>() {</span><br><span class=\"line\"> self::who();</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\">class B extends A {</span><br><span class=\"line\"> public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">who</span></span>() {</span><br><span class=\"line\"> <span class=\"built_in\">echo</span> __CLASS__;</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\">B::<span class=\"built_in\">test</span>();</span><br><span class=\"line\">?></span><br></pre></td></tr></table></figure>\n<p>以上例程会输出:</p>\n<p>A</p>\n<p>后期静态绑定的用法</p>\n<p>后期静态绑定本想通过引入一个新的关键字表示运行时最初调用的类来绕过限制。简单地说,这个关键字能够让你在上述例子中调用 test() 时引用的类是 B 而不是 A。最终决定不引入新的关键字,而是使用已经预留的 static 关键字。</p>\n<p>Example #2 static:: 简单用法</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><?php</span><br><span class=\"line\">class A {</span><br><span class=\"line\"> public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">who</span></span>() {</span><br><span class=\"line\"> <span class=\"built_in\">echo</span> __CLASS__;</span><br><span class=\"line\"> }</span><br><span class=\"line\"> public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">test</span></span>() {</span><br><span class=\"line\"> static::who(); // 后期静态绑定从这里开始</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\">class B extends A {</span><br><span class=\"line\"> public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">who</span></span>() {</span><br><span class=\"line\"> <span class=\"built_in\">echo</span> __CLASS__;</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\">B::<span class=\"built_in\">test</span>();</span><br><span class=\"line\">?></span><br></pre></td></tr></table></figure>\n<p>以上例程会输出:</p>\n<p>B<br>Note:</p>\n<p>在非静态环境下,所调用的类即为该对象实例所属的类。由于 $this-> 会在同一作用范围内尝试调用私有方法,而 static:: 则可能给出不同结果。另一个区别是 static:: 只能用于静态属性。</p>\n<p>Example #3 非静态环境下使用 static::<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><?php</span><br><span class=\"line\">class A {</span><br><span class=\"line\"> private <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">foo</span></span>() {</span><br><span class=\"line\"> <span class=\"built_in\">echo</span> <span class=\"string\">\"success!\\n\"</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\"> public <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">test</span></span>() {</span><br><span class=\"line\"> <span class=\"variable\">$this</span>->foo();</span><br><span class=\"line\"> static::foo();</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\">class B extends A {</span><br><span class=\"line\"> /* foo() will be copied to B, hence its scope will still be A and</span><br><span class=\"line\"> * the call be successful */</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\">class C extends A {</span><br><span class=\"line\"> private <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">foo</span></span>() {</span><br><span class=\"line\"> /* original method is replaced; the scope of the new one is C */</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"variable\">$b</span> = new B();</span><br><span class=\"line\"><span class=\"variable\">$b</span>-><span class=\"built_in\">test</span>();</span><br><span class=\"line\"><span class=\"variable\">$c</span> = new C();</span><br><span class=\"line\"><span class=\"variable\">$c</span>-><span class=\"built_in\">test</span>(); //fails</span><br><span class=\"line\">?></span><br></pre></td></tr></table></figure></p>\n<p>以上例程会输出:</p>\n<p>success!<br>success!<br>success!</p>\n<p>Fatal error: Call to private method C::foo() from context ‘A’ in /tmp/test.php on line 9</p>\n<p>Note:</p>\n<p>后期静态绑定的解析会一直到取得一个完全解析了的静态调用为止。另一方面,如果静态调用使用 parent:: 或者 self:: 将转发调用信息。</p>\n<p>Example #4 转发和非转发调用</p>\n<pre><code class=\"bash\"><?php\nclass A {\n public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">foo</span></span>() {\n static::who();\n }\n\n public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">who</span></span>() {\n <span class=\"built_in\">echo</span> __CLASS__.<span class=\"string\">\"\\n\"</span>;\n }\n}\n\nclass B extends A {\n public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">test</span></span>() {\n A::foo();\n parent::foo();\n self::foo();\n }\n\n public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">who</span></span>() {\n <span class=\"built_in\">echo</span> __CLASS__.<span class=\"string\">\"\\n\"</span>;\n }\n}\nclass C extends B {\n public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">who</span></span>() {\n <span class=\"built_in\">echo</span> __CLASS__.<span class=\"string\">\"\\n\"</span>;\n }\n}\n\nC::<span class=\"built_in\">test</span>();\n?>\n</code></pre>\n<p>以上例程会输出:</p>\n<p>A<br>C<br>C</p>\n<p>参考博客:<br><a href=\"http://php.net/manual/zh/language.oop5.static.php\" target=\"_blank\" rel=\"external\">http://php.net/manual/zh/language.oop5.static.php</a></p>\n<p><a href=\"https://www.cnblogs.com/jerrypro/p/6422923.html\" target=\"_blank\" rel=\"external\">https://www.cnblogs.com/jerrypro/p/6422923.html</a></p>\n","site":{"data":{}},"excerpt":"","more":"<h2 id=\"一、常用魔术方法的触发时机?\"><a href=\"#一、常用魔术方法的触发时机?\" class=\"headerlink\" title=\"一、常用魔术方法的触发时机?\"></a>一、常用魔术方法的触发时机?</h2><p>1) <strong>autoload() :当程序实例化某个类,而该类没有在当前文件中被引入。此时会触发执行</strong>autoload()。程序希望通过该方法,自动引入这个类文件。该方法有一个参数,即就是那个忘记引入的类的名称。<strong>autoload()方法的工作原理是什么?当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行</strong>autoload()函数。这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后,就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。使用自动载入的魔术函数可以不必要写很多个include或者require函数。</p>\n<p>2) __construct() :这个是魔术构造方法。构造方法是实例化对象的时候自动执行的方法,作用就是初始化对象。该方法可以没有参数,也可以有多个参数。如果有参数,那么new这个对象的时候要记得写上相应的参数。在php5以前,没有魔术构造方法,普通构造方法是一个跟类名同名的方法来实现构造的。如果一个类中既写了魔术构造方法,又定义了普通构造方法。那么php5以上版本中,魔术方法起作用,普通构造方法不起作用。反之,在php5以前版本中,不认识魔术构造方法,只是把该方法当做普通的方法。</p>\n<p>3) __destruct() :这个是魔术析构方法。析构方法的作用和构造方法正好相反,是对象被销毁时被自动调用的,作用是释放内存。析构方法没有参数。</p>\n<p>4) <strong>call() :当程序调用一个不存在或不可见的成员方法时,自动触发执行</strong>call()。它有两个参数,分别是未访问到的方法名称和方法的参数。而第二个参数是数组类型。</p>\n<p>5) <strong>get() :当程序调用一个未定义或不可见的成员属性时,自动触发执行</strong>get()。它有一个参数,表示要调用的属性的名称。</p>\n<p>6) <strong>set():当程序试图写入一个不存在或不可见的成员属性时,PHP就会自动执行</strong>set()。它包含两个参数,分别表示属性名称和属性值。</p>\n<p>7) <strong>tostring() :当程序使用echo或print输出对象时,会自动调用该方法。目的是希望通过该方法将对象转化为字符串,再输出。</strong>tostring() 无参数,但是该方法必须有返回值。</p>\n<p>8) <strong>clone() :当程序clone一个对象的时候,能触发</strong>clone()方法,程序希望通过这个魔术方法实现:不仅仅单纯地克隆对象,还需要克隆出来的对象拥有原来对象的所有属性和方法。</p>\n<h2 id=\"二、-this,self-parent-static-使用场景\"><a href=\"#二、-this,self-parent-static-使用场景\" class=\"headerlink\" title=\"二、$this,self::, parent::,static:: 使用场景\"></a>二、$this,self::, parent::,static:: 使用场景</h2><p>$this代表的是当前对象</p>\n<p>self代表的是当前的类</p>\n<p>parent代表的是当前类的父类</p>\n<p>使用场合:<br>$this只能使用在当前类中,通过$this->可以调用当前类中的属性和方法;<br>self只能在当前类中使用,通过作用域操作符::访问当前类中的类常量、当前类中的静态属性、当前类中的方法;<br>parent只能使用在有父类的当前类中,通过作用域操作符::访问父类中的类常量、父类中的静态属性、父类中的方法</p>\n<p>后期静态绑定</p>\n<p>自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。</p>\n<p>准确说,后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。所谓的“转发调用”(forwarding call)指的是通过以下几种方式进行的静态调用:self::,parent::,static:: 以及 forward_static_call()。可用 get_called_class() 函数来得到被调用的方法所在的类名,static:: 则指出了其范围。</p>\n<p>该功能从语言内部角度考虑被命名为“后期静态绑定”。“后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。<br>self:: 的限制</p>\n<p>使用 self:: 或者 <strong>CLASS</strong> 对当前类的静态引用,取决于定义当前方法所在的类:</p>\n<p>Example #1 self:: 用法</p>\n<p>代码实例 </p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"></span><br><span class=\"line\"><?php</span><br><span class=\"line\">class A {</span><br><span class=\"line\"> public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">who</span></span>() {</span><br><span class=\"line\"> <span class=\"built_in\">echo</span> __CLASS__;</span><br><span class=\"line\"> }</span><br><span class=\"line\"> public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">test</span></span>() {</span><br><span class=\"line\"> self::who();</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\">class B extends A {</span><br><span class=\"line\"> public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">who</span></span>() {</span><br><span class=\"line\"> <span class=\"built_in\">echo</span> __CLASS__;</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\">B::<span class=\"built_in\">test</span>();</span><br><span class=\"line\">?></span><br></pre></td></tr></table></figure>\n<p>以上例程会输出:</p>\n<p>A</p>\n<p>后期静态绑定的用法</p>\n<p>后期静态绑定本想通过引入一个新的关键字表示运行时最初调用的类来绕过限制。简单地说,这个关键字能够让你在上述例子中调用 test() 时引用的类是 B 而不是 A。最终决定不引入新的关键字,而是使用已经预留的 static 关键字。</p>\n<p>Example #2 static:: 简单用法</p>\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><?php</span><br><span class=\"line\">class A {</span><br><span class=\"line\"> public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">who</span></span>() {</span><br><span class=\"line\"> <span class=\"built_in\">echo</span> __CLASS__;</span><br><span class=\"line\"> }</span><br><span class=\"line\"> public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">test</span></span>() {</span><br><span class=\"line\"> static::who(); // 后期静态绑定从这里开始</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\">class B extends A {</span><br><span class=\"line\"> public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">who</span></span>() {</span><br><span class=\"line\"> <span class=\"built_in\">echo</span> __CLASS__;</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\">B::<span class=\"built_in\">test</span>();</span><br><span class=\"line\">?></span><br></pre></td></tr></table></figure>\n<p>以上例程会输出:</p>\n<p>B<br>Note:</p>\n<p>在非静态环境下,所调用的类即为该对象实例所属的类。由于 $this-> 会在同一作用范围内尝试调用私有方法,而 static:: 则可能给出不同结果。另一个区别是 static:: 只能用于静态属性。</p>\n<p>Example #3 非静态环境下使用 static::<br><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><?php</span><br><span class=\"line\">class A {</span><br><span class=\"line\"> private <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">foo</span></span>() {</span><br><span class=\"line\"> <span class=\"built_in\">echo</span> <span class=\"string\">\"success!\\n\"</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\"> public <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">test</span></span>() {</span><br><span class=\"line\"> <span class=\"variable\">$this</span>->foo();</span><br><span class=\"line\"> static::foo();</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\">class B extends A {</span><br><span class=\"line\"> /* foo() will be copied to B, hence its scope will still be A and</span><br><span class=\"line\"> * the call be successful */</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\">class C extends A {</span><br><span class=\"line\"> private <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">foo</span></span>() {</span><br><span class=\"line\"> /* original method is replaced; the scope of the new one is C */</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"variable\">$b</span> = new B();</span><br><span class=\"line\"><span class=\"variable\">$b</span>-><span class=\"built_in\">test</span>();</span><br><span class=\"line\"><span class=\"variable\">$c</span> = new C();</span><br><span class=\"line\"><span class=\"variable\">$c</span>-><span class=\"built_in\">test</span>(); //fails</span><br><span class=\"line\">?></span><br></pre></td></tr></table></figure></p>\n<p>以上例程会输出:</p>\n<p>success!<br>success!<br>success!</p>\n<p>Fatal error: Call to private method C::foo() from context ‘A’ in /tmp/test.php on line 9</p>\n<p>Note:</p>\n<p>后期静态绑定的解析会一直到取得一个完全解析了的静态调用为止。另一方面,如果静态调用使用 parent:: 或者 self:: 将转发调用信息。</p>\n<p>Example #4 转发和非转发调用</p>\n<pre><code class=\"bash\"><?php\nclass A {\n public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">foo</span></span>() {\n static::who();\n }\n\n public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">who</span></span>() {\n <span class=\"built_in\">echo</span> __CLASS__.<span class=\"string\">\"\\n\"</span>;\n }\n}\n\nclass B extends A {\n public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">test</span></span>() {\n A::foo();\n parent::foo();\n self::foo();\n }\n\n public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">who</span></span>() {\n <span class=\"built_in\">echo</span> __CLASS__.<span class=\"string\">\"\\n\"</span>;\n }\n}\nclass C extends B {\n public static <span class=\"keyword\">function</span> <span class=\"function\"><span class=\"title\">who</span></span>() {\n <span class=\"built_in\">echo</span> __CLASS__.<span class=\"string\">\"\\n\"</span>;\n }\n}\n\nC::<span class=\"built_in\">test</span>();\n?>\n</code></pre>\n<p>以上例程会输出:</p>\n<p>A<br>C<br>C</p>\n<p>参考博客:<br><a href=\"http://php.net/manual/zh/language.oop5.static.php\" target=\"_blank\" rel=\"external\">http://php.net/manual/zh/language.oop5.static.php</a></p>\n<p><a href=\"https://www.cnblogs.com/jerrypro/p/6422923.html\" target=\"_blank\" rel=\"external\">https://www.cnblogs.com/jerrypro/p/6422923.html</a></p>\n"}],"PostAsset":[],"PostCategory":[{"post_id":"cjhop1slj0000cmyy7w0bg0ht","category_id":"cjhop1sly0002cmyys0vhlp3b","_id":"cjhop1sml000dcmyy2rk4briq"},{"post_id":"cjhop1slv0001cmyyij2lw21o","category_id":"cjhop1sly0002cmyys0vhlp3b","_id":"cjhop1sms000hcmyy6i8936gq"},{"post_id":"cjhop1smn000fcmyyj2us56ek","category_id":"cjhop1smk000ccmyyqgy9weof","_id":"cjhop1smv000lcmyyvslbcpyc"},{"post_id":"cjhop1sm20004cmyya7k5cpi1","category_id":"cjhop1smk000ccmyyqgy9weof","_id":"cjhop1smw000pcmyy8tj4ek4e"},{"post_id":"cjhop1smq000gcmyyat4mpkeu","category_id":"cjhop1smk000ccmyyqgy9weof","_id":"cjhop1smx000qcmyyeh2w9my1"},{"post_id":"cjhop1sm50005cmyy52wvjb2j","category_id":"cjhop1smk000ccmyyqgy9weof","_id":"cjhop1smy000scmyyf70u404e"},{"post_id":"cjhop1smf000acmyywiu1m7d0","category_id":"cjhop1smv000mcmyyyxc11n6l","_id":"cjhop1smz000vcmyyxn8wfw55"},{"post_id":"cjhop1smj000bcmyycabshee6","category_id":"cjhop1smv000mcmyyyxc11n6l","_id":"cjhop1sn0000ycmyy17syy8jf"},{"post_id":"cjhop1sn80019cmyyy9hghvia","category_id":"cjhop1sly0002cmyys0vhlp3b","_id":"cjhop1sni001gcmyyc0krm20e"},{"post_id":"cjhop1sne001dcmyypyesy39n","category_id":"cjhop1smk000ccmyyqgy9weof","_id":"cjhop1snj001hcmyyywxiyvew"},{"post_id":"cjhop1sng001fcmyyd35e7ptk","category_id":"cjhop1smk000ccmyyqgy9weof","_id":"cjhop1snj001icmyyqawiouwk"},{"post_id":"cjhop1snb001bcmyyvlza7a8h","category_id":"cjhop1sng001ecmyy7mg5nnao","_id":"cjhop1snk001jcmyyhwpc5owb"}],"PostTag":[{"post_id":"cjhop1slj0000cmyy7w0bg0ht","tag_id":"cjhop1sm10003cmyyv9man0l9","_id":"cjhop1smf0009cmyylfnouko5"},{"post_id":"cjhop1slv0001cmyyij2lw21o","tag_id":"cjhop1smb0008cmyym0ruujm8","_id":"cjhop1smu000kcmyyet3z6evx"},{"post_id":"cjhop1slv0001cmyyij2lw21o","tag_id":"cjhop1smm000ecmyymwor2kk2","_id":"cjhop1smv000ncmyybnw21pim"},{"post_id":"cjhop1sm50005cmyy52wvjb2j","tag_id":"cjhop1smt000jcmyyhisfutsc","_id":"cjhop1smz000ucmyypuiak1pt"},{"post_id":"cjhop1sm50005cmyy52wvjb2j","tag_id":"cjhop1smw000ocmyywyjvyt20","_id":"cjhop1smz000wcmyyhr3y5e13"},{"post_id":"cjhop1sm80006cmyyd6nc3qtv","tag_id":"cjhop1smy000tcmyyekcatcqs","_id":"cjhop1sn10010cmyy5mkjc2bc"},{"post_id":"cjhop1sm80006cmyyd6nc3qtv","tag_id":"cjhop1smz000xcmyyfmy4pp4i","_id":"cjhop1sn10011cmyyz6pns69n"},{"post_id":"cjhop1smf000acmyywiu1m7d0","tag_id":"cjhop1sn0000zcmyyq9dt0drn","_id":"cjhop1sn30015cmyyw1nnoz1x"},{"post_id":"cjhop1smf000acmyywiu1m7d0","tag_id":"cjhop1sn10012cmyyi58emben","_id":"cjhop1sn40016cmyy4rrzd3ae"},{"post_id":"cjhop1smf000acmyywiu1m7d0","tag_id":"cjhop1sn20013cmyyuxfpf0zn","_id":"cjhop1sn40017cmyycmo8od8p"},{"post_id":"cjhop1smq000gcmyyat4mpkeu","tag_id":"cjhop1sn30014cmyy1l37cq5d","_id":"cjhop1sn40018cmyyi39suv2l"},{"post_id":"cjhop1sn80019cmyyy9hghvia","tag_id":"cjhop1sm10003cmyyv9man0l9","_id":"cjhop1snd001ccmyyd59fjr66"}],"Tag":[{"name":"Linux","_id":"cjhop1sm10003cmyyv9man0l9"},{"name":"github","_id":"cjhop1smb0008cmyym0ruujm8"},{"name":"hexo","_id":"cjhop1smm000ecmyymwor2kk2"},{"name":"接口","_id":"cjhop1smt000jcmyyhisfutsc"},{"name":"设计模式","_id":"cjhop1smw000ocmyywyjvyt20"},{"name":"jqweui","_id":"cjhop1smy000tcmyyekcatcqs"},{"name":"weui'","_id":"cjhop1smz000xcmyyfmy4pp4i"},{"name":"MySQl","_id":"cjhop1sn0000zcmyyq9dt0drn"},{"name":"高并发","_id":"cjhop1sn10012cmyyi58emben"},{"name":"数据库锁","_id":"cjhop1sn20013cmyyuxfpf0zn"},{"name":"MySQL","_id":"cjhop1sn30014cmyy1l37cq5d"}]}}