本文将带您了解关于给PHP开发者的编程指南第一部分降低复杂程度的新内容,同时我们还将为您解释基于php开发的相关知识,另外,我们还将为您提供关于Algolia加持:PHP开发者的搜索引擎优化指南、li
本文将带您了解关于给PHP开发者的编程指南 第一部分降低复杂程度的新内容,同时我们还将为您解释基于php开发的相关知识,另外,我们还将为您提供关于Algolia加持:PHP开发者的搜索引擎优化指南、linux设置密码复杂程度、PHP开发者的Linux学习之路、PHP开发者的Vue与React入门指南的实用信息。
本文目录一览:- 给PHP开发者的编程指南 第一部分降低复杂程度(基于php开发)
- Algolia加持:PHP开发者的搜索引擎优化指南
- linux设置密码复杂程度
- PHP开发者的Linux学习之路
- PHP开发者的Vue与React入门指南
给PHP开发者的编程指南 第一部分降低复杂程度(基于php开发)
PHP 是一门自由度很高的编程语言。它是动态语言,对程序员有很大的宽容度。作为 PHP 程序员,要想让你的代码更有效,需要了解不少的规范。很多年来,我读过很多编程方面的书籍,与很多资深程序员也讨论过代码风格的问题。具体哪条规则来自哪本书或者哪个人,我肯定不会都记得,但是本文(以及接下来的另一篇文章) 表达了我对于如何写出更好的代码的观点:能经得起考验的代码,通常是非常易读和易懂的。这样的代码,别人可以更轻松的查找问题,也可以更简单的复用代码。
降低函数体的复杂度
在方法或者函数体里,尽可能的降低复杂性。相对低一些的复杂性,可以便于别人阅读代码。另外,这样做也可以减少代码出问题的可能性,更易修改,有问题也更易修复。
在函数里减少括号数量
尽可能少的使用 if, elseif, else 和 switch 这些语句。它们会增加更多的括号。这会让代码更难懂、更难测试一些(因为每个括号都需要有测试用例覆盖到)。总是有办法来避免这个问题的。
代理决策 ("命令,不用去查询(Tell, don''t ask)")
有的时候 if 语句可以移到另一个对象里,这样会更清晰些。例如:
if($a->somethingIsTrue()) { $a->doSomething(); }
可以改成:
$a->doSomething();
这里,具体的判断由 $a 对象的 doSomething() 方法去做了。我们不需要再为此做更多的考虑,只需要安全的调用 doSomething() 即可。这种方式优雅的遵循了命令,不要去查询原则。我建议你深入了解一下这个原则,当你向一个对象查询信息并且根据这些信息做判断的时候都可以适用这条原则。
使用map
有时可以用 map 语句减少 if, elseif 或 else 的使用,例如:
if($type===''json'') { return $jsonDecoder->decode($body); }elseif($type===''xml'') { return $xmlDecoder->decode($body); }else{ throw new \LogicException( ''Type "''.$type.''" is not supported'' ); }
可以精简为:
$decoders= ...;// a map of type (string) to corresponding Decoder objects if(!isset($decoders[$type])) { thrownew\LogicException( ''Type "''.$type.''" is not supported'' ); }
这样使用 map 的方式也让你的代码遵循扩展开放,关闭修改的原则。
强制类型
很多 if 语句可以通过更严格的使用类型来避免,例如:
if($a instanceof A) { // happy path return $a->someInformation(); }elseif($a=== null) { // alternative path return ''default information''; }
可以通过强制 $a 使用 A 类型来简化:
return $a->someInformation();
当然,我们可以通过其他方式来支持 "null" 的情况。这个在后面的文章会提到。
Return early
很多时候,函数里的一个分支并非真正的分支,而是前置或者后置的一些条件,就像这样:// 前置条件
if(!$a instanceof A) { throw new \InvalidArgumentException(...); } // happy path return $a->someInformation();
这里 if 语句并不是函数执行的一个分支,它只是对一个前置条件的检查。有时我们可以让 PHP 自身来完成前置条件的检查(例如使用恰当的类型提示)。不过,PHP 也没法完成所有前置条件的检查,所以还是需要在代码里保留一些。为了降低复杂度,我们需要在提前知道代码会出错时、输入错误时、已经知道结果时尽早返回。
尽早返回的效果就是后面的代码没必要像之前那样缩进了:
// check precondition if(...) { thrownew...(); } // return early if(...) { return...; } // happy path ... return...;
像上面这个模板这样,代码会变动更易读和易懂。
创建小的逻辑单元
如果函数体过长,就很难理解这个函数到底在干什么。跟踪变量的使用、变量类型、变量声明周期、调用的辅助函数等等,这些都会消耗很多脑细胞。如果函数比较小,对于理解函数功能很有帮助(例如,函数只是接受一些输入,做一些处理,再返回结果)。
使用辅助函数
在使用之前的原则减少括号之后,你还可以通过把函数拆分成更小的逻辑单元做到让函数更清晰。你可以把实现一个子任务的代码行看做一组代码,这些代码组直接用空行来分隔。然后考虑如何把它们拆分成辅助方法(即重构中的提炼方法)。
辅助方法一般是 private 的方法,只会被所属的特定类的对象调用。通常它们不需要访问实例的变量,这种情况需要定义为 static 的方法。在我的经验中,private (static)的辅助方法通常会汇总到分离的类中,并且定义成 public (static 或 instance)的方法,至少在测试驱动开发的时候使用一个协作类就是这种情形。
减少临时变量
长的函数通常需要一些变量来保存中间结果。这些临时变量跟踪起来比较麻烦:你需要记住它们是否已经初始化了,是否还有用,现在的值又是多少等等。
上节提到的辅助函数有助于减少临时变量:
public function capitalizeAndReverse(array $names) { $capitalized = array_map(''ucfirst'', $names); $capitalizedAndReversed = array_map(''strrev'', $capitalized); return $capitalizedAndReversed; }
使用辅助方法,我们可以不用临时变量了:
public function capitalizeAndReverse(array $names) { return self::reverse( self::capitalize($names) ); } private static function reverse(array $names) { return array_map(''strrev'', $names); } private static function capitalize(array $names) { return array_map(''ucfirst'', $names); }
正如你所见,我们把函数变成新函数的组合,这样变得更易懂,也更容易修改。某种方式上,代码还有点符合“扩展开放/修改关闭”,因为我们基本上不需要再修改辅助函数。
由于很多算法需要遍历容器,从而得到新的容器或者计算出一个结果,此时把容器本身当做一个“一等公民”并且附加上相关的行为,这样做是很有意义的:
classNames { private $names; public function __construct(array $names) { $this->names = $names; } public function reverse() { return new self( array_map(''strrev'', $names) ); } public function capitalize() { return new self( array_map(''ucfirst'', $names) ); } } $result = (newNames([...]))->capitalize()->reverse();
这样做可以简化函数的组合。
虽然减少临时变量通常会带来好的设计,不过上面的例子中也没必要干掉所有的临时变量。有时候临时变量的用处是很清晰的,作用也是一目了然的,就没必要精简。
使用简单的类型
追踪变量的当前取值总是很麻烦的,当不清楚变量的类型时尤其如此。而如果一个变量的类型不是固定的,那简直就是噩梦。
数组只包含同一种类型的值
使用数组作为可遍历的容器时,不管什么情况都要确保只使用同一种类型的值。这可以降低遍历数组读取数据的循环的复杂度:
foreach($collection as $value) { // 如果指定$value的类型,就不需要做类型检查 }
你的代码编辑器也会为你提供数组值的类型提示:
/** * @param DateTime[] $collection */ public function doSomething(array $collection) { foreach($collection as $value) { // $value是DateTime类型 } }
而如果你不能确定 $value 是 DateTime 类型的话,你就不得不在函数里添加前置判断来检查其类型。beberlei/assert库可以让这个事情简单一些:
useAssert\Assertion public function doSomething(array $collection) { Assertion::allIsInstanceOf($collection, \DateTime::class); ... }
如果容器里有内容不是 DateTime 类型,这会抛出一个 InvalidArgumentException 异常。除了强制输入相同类型的值之外,使用断言(assert)也是降低代码复杂度的一种手段,因为你可以不在函数的头部去做类型的检查。
简单的返回值类型
只要函数的返回值可能有不同的类型,就会极大的增加调用端代码的复杂度:
$result= someFunction(); if($result=== false) { ... }else if(is_int($result)) { ... }
PHP 并不能阻止你返回不同类型的值(或者使用不同类型的参数)。但是这样做只会造成大量的混乱,你的程序里也会到处都充斥着 if 语句。
下面是一个经常遇到的返回混合类型的例子:
/** * @param int $id * @return User|null */ public function findById($id) { ... }
这个函数会返回 User 对象或者 null,这种做法是有问题的,如果不检查返回值是否合法的 User 对象,我们是不能去调用返回值的方法的。在 PHP 7之前,这样做会造成"Fatal error",然后程序崩溃。
下一篇文章我们会考虑 null,告诉你如何去处理它们。
可读的表达式
我们已经讨论过不少降低函数的整体复杂度的方法。在更细粒度上我们也可以做一些事情来减少代码的复杂度。
隐藏复杂的逻辑
通常可以把复杂的表达式变成辅助函数。看看下面的代码:
if(($a||$b) &&$c) { ... }
可以变得更简单一些,像这样:
if(somethingIsTheCase($a,$b,$c)) { ... }
阅读代码时可以清楚的知道这个判断依赖 $a, $b 和 $c 三个变量,而函数名也可以很好的表达判断条件的内容。
使用布尔表达式
if 表达式的内容可以转换成布尔表达式。不过 PHP 也没有强制你必须提供 boolean 值:
$a=new\DateTime(); ... if($a) { ... }
$a 会自动转换成 boolean 类型。强制类型转换是 bug 的主要来源之一,不过还有一个问题是会对代码的理解带来复杂性,因为这里的类型转换是隐式的。PHP 的隐式转换的替代方案是显式的进行类型转换,例如:
if($a instanceof DateTime) { ... }
如果你知道比较的是 bool 类型,就可以简化成这样:
if($b=== false) { ... }
使用 ! 操作符则还可以简化:
if(!$b) { ... }
不要 Yoda 风格的表达式
Yoda 风格的表达式就像这样:
if(''hello''===$result) { ... }
这种表达式主要是为了避免下面的错误:
if($result=''hello'') { ... }
这里 ''hello'' 会赋值给 $result,然后成为整个表达式的值。''hello'' 会自动转换成 bool 类型,这里会转换成 true。于是 if 分支里的代码在这里会总是被执行。
使用 Yoda 风格的表达式可以帮你避免这类问题:
if(''hello''=$result) { ... }
我觉得实际情况下不太会有人出现这种错误,除非他还在学习 PHP 的基本语法。而且,Yoda 风格的代码也有不小的代价:可读性。这样的表达式不太易读,也不太容易懂,因为这不符合自然语言的习惯。
以上就是本文的全部内容,希望对大家的学习有所帮助。
- php和js编程中的延迟执行效果的代码
- PHP编程过程中需要了解的this,self,parent的区别
- 《PHP编程最快明白》第四讲:日期、表单接收、session、cookie
- 《PHP编程最快明白》第六讲:Mysql数据库操作
- php学习笔记之面向对象编程
- 深入php之规范编程命名小结
- PHP编程风格规范分享
- php使用socket编程示例
- PHP多进程编程实例
Algolia加持:PHP开发者的搜索引擎优化指南
algolia加持:php开发者的
引言:
现代网络应用程序的用户体验离不开一个关键元素:搜索功能。搜索引擎优化(SEO)是为了让我们的应用程序在搜索引擎中排名更高,从而获得更多的用户流量。在PHP开发中,Algolia是一个非常强大的工具,可以帮助我们轻松地优化搜索功能。本文将向PHP开发者介绍Algolia的基本概念和使用方法,并提供一些代码示例,帮助大家快速上手。
- Algolia简介
Algolia是一个强大的云端搜索平台,提供可扩展、高性能的搜索解决方案。Algolia具有实时搜索、模糊搜索、过滤、排序等功能,适用于各种类型的应用程序,无论是电子商务网站还是社交媒体应用。 -
安装Algolia PHP SDK
使用Composer可以很方便地安装Algolia PHP SDK。在终端中运行以下命令:composer require algolia/algoliasearch-client-php
登录后复制 初始化Algolia
在使用Algolia之前,我们需要在官方网站上注册一个账号,创建一个应用程序,并获取API密钥。接下来,在我们的PHP代码中,我们需要初始化Algolia客户端:require ''vendor/autoload.php''; $client = AlgoliaAlgoliaSearchSearchClient::create( ''YOUR_APPLICATION_ID'', ''YOUR_API_KEY'' );
登录后复制将"YOUR_APPLICATION_ID"和"YOUR_API_KEY"替换为您自己的应用程序ID和API密钥。
立即学习“PHP免费学习笔记(深入)”;
创建索引
Algolia使用索引来组织和存储数据。在Algolia中创建索引很简单:$index = $client->initIndex(''your_index_name'');
登录后复制将"your_index_name"替换为您自己的索引名。
添加数据
在Algolia中,我们可以使用对象数组来保存数据。以下是一个示例:$index->saveObjects([ [ ''objectID'' => ''1'', ''name'' => ''John Doe'', ''age'' => 30 ], [ ''objectID'' => ''2'', ''name'' => ''Jane Smith'', ''age'' => 25 ] ]);
登录后复制在保存数据时,每个对象需要有一个唯一的"objectID"属性。
搜索数据
Algolia的搜索功能非常强大,可以根据关键字、过滤条件和排序等进行搜索。以下是一个示例:$response = $index->search(''John'', [ ''filters'' => ''age > 20'', ''hitsPerPage'' => 10 ]); foreach ($response[''hits''] as $hit) { echo $hit[''name''] . '' ('' . $hit[''age''] . '')'' . PHP_EOL; }
登录后复制上面的代码将搜索名字中含有"John"并且年龄大于20的记录,并输出结果。
更新数据
如果您的数据发生了更改,您可以使用以下代码更新Algolia中的数据:$index->saveObjects([ [ ''objectID'' => ''1'', ''name'' => ''John Doe'', ''age'' => 32 ], [ ''objectID'' => ''2'', ''name'' => ''Jane Smith'', ''age'' => 27 ] ]);
登录后复制Algolia会自动合并和更新数据。
删除数据
如果要从Algolia中删除数据,可以使用以下代码:$index->deleteObjects([''1'', ''2'']);
登录后复制上面的代码将删除"objectID"为1和2的记录。
结论:
Algolia是一个强大的搜索引擎优化工具,对于PHP开发者来说特别有用。本文中,我们介绍了Algolia的基本概念和使用方法,并提供了一些代码示例。希望这篇文章能帮助PHP开发者更快地掌握Algolia,优化他们的搜索功能。祝大家搜索引擎优化成功!
以上就是Algolia加持:PHP开发者的
linux设置密码复杂程度
所有人都知道 Linux 的默认策略很安全,然而我们还是要做一些微调,这样才更安全。弱密码有安全隐患,因此,请特别注意。我们需要更改密码的复杂程度来提高安全性
首先修改/etc/pam.d/system-auth文件
找到 password requisite pam_cracklib.so这么一行替换成如下:
password requisite pam_cracklib.so retry=5 difok=3 minlen=10 ucredit=-1 lcredit=-3 dcredit=-3 dictpath=/usr/share/cracklib/pw_dict
修过完成后,保存退出,修改mzj用户密码,试试000000发现不被允许,只能根据要求设置复杂的。
参数含义:
尝试次数:5
最少不同字符:3
最小密码长度:10
最少大写字母:1
最少小写字母:3
最少数字:3
密码字典:/usr/share/cracklib/pw_dict
本文原创地址:https://www.linuxprobe.com/linux-mima.html编辑:王华超,审核员:逄增宝
PHP开发者的Linux学习之路
谈起一个高效动态网站的构建,那就不得不提到LAMP,即Linux操作系统、Apache网络服务器、Mysql数据库、Perl、PHP或Python编程语言等开源产品所组成的网站架构框架,其最大的优势是开放性强,安全性高,且成本低廉。因此,LAMP成为了国际流行的网站构建方案。而作为一名php开发人员,在工作中,普遍也使用LAMP来开发一个高性能的网站,当然,也有其他构建方案,如LNMP,WAMP等。因此,Linux系统不仅是一个高性能网站的构建基础,也是一名php开发人员的必修课。
开始学习Linux系统,书籍教程方面,我选择的是这本语言精练,更易上手的《Linux就该这么学》,它是一本注重实用性的Linux自学书籍,其作者刘遄从事于linux运维技术行业多年,通过红帽架构师认证RHCA认证,学习生态圈较完善,有完备的书籍、网站、专业培训、论坛和其他社区的Linux学习生态圈。当然,对于慢节奏的同学,也可以通过网络上的教学视频进行学习;那么,跟随教程,我在windows下使用了VMware安装了一个虚拟机,配置好Centos系统,第一步当然是熟悉Linux的基本操作命令,如文档管理项的rm、mv、cat等,磁盘管理的cd、ls、fdisk等。当然,在熟悉其基本命令的同时,也会学习到Linux的目录结构,权限管理,进程管理等基础知识,我就不一一赘述了。在这里我推荐几个关于进程管理的命令:Ps,用于显示当前进程状态,常用的搭配有ps aux 、ps -ef、 ps -eFH。dstat:动态系统资源统计命令。top:动态显示inux进程。htop:交互式进程查看器。这几个命令对于我们的进程管理有相当大的帮助。
如何搭建LAMP环境?第一步当然是下载安装必要的产品,顺序一般是:Apache、mysql、php,当然,linux下每一个软件都有各种依赖,人工安装依赖是一项很复杂的工作,于是,包管理器便应运而生,centos使用的是yum包管理器,它会自动帮我们把需要安装的依赖包自动安装,只需输入此命令:yum -y install httpd mysql mysql-server php php-mysql postgresql postgresql-server php-postgresql php-pgsql php-devel,安装过程大概几分钟,安装完成。
第二步便是测试环境是否正常运行(run),首先,我们启动Apache服务器:/etc/rc.d/init.d/httpd start,启动之后检测启动结果:ps aux | grep httpd,如过出现一堆进程,那么Apache网络服务器已正常运转,然后,我用ifconfig命令查看服务器的IP并进入网站根目录下创建一个phpinfo.php的程序,用于查看php的配置信息,如果配置信息正常显示,那么php模块已配置完成,接下来就进行数据库的配置,当然第一步是启动数据库:/etc/rc.d/init.d/mysqld start,然后检查启动结果:netstat -tulnp | grep :3306,结果为正常启动,接下来我进入mysql数据库,新建了一个用于测试的表,并简单的插入了几条数据,然后再写了一个用php连接mysql数据库的测试代码:
运行后如能正常查询数据,那么,我们的LAMP环境便搭建完成。
为了进一步熟悉Linux系统,我决定安装另一款Linux OS进行日常开发,流行的发行版有很多,诸如Debian,红帽(Redhat) http://www.linuxprobe.com/chapter-00.html、Ubuntu(包括kubuntu,xubuntu等)、OpenSuse(原Suse)、Mandriva(原Mandrake)、CentOS、Fedora、Veket等,各有其优缺点,我就不对其深入讨论了。我最终选择安装的是Ubuntu,选择的原因是其友好的界面以及许多常用软件的集成。
安装好Ubuntu后,我第一步是搭建PHP的开发环境,直接使用apt-get安装软件,当然,还有deb包的安装方式以及独具ubuntu特色的新立得软件包管理等方法。安装谷歌浏览器时,发现缺少依赖包,这时候,这条命令就能帮你自动安装依赖包:sudo apt-get install -f。当然,在ubuntu系统下有许多好用的软件,比如浏览器有:firefox,谷歌,opera,音乐播放器有:Audacious、Rhythmbox。我个人推荐几款实用的软件:谷歌浏览器,wps文件处理器,ATOM代码编辑器,Thunderbird邮件,filezilla等。
在安装完必备的软件后,我决定对我的桌面进行一次美化,ubuntu有许多很精美的主题,你甚至可以将其打造为mac的界面风格,可以参考网上资料,调整桌面环境,我推荐使用unity-tweak-tool,这是一个非常好用的Unity图形化管理工具,可以修改工作区,热区数量等。主题我推荐使用Flatabulous,它是一款ubuntu下扁平化主题,也是我试过众多主题中最喜欢的一个!
至此,一个个性化的Linux OS 便打造成功,不过也推荐你看下书籍《Linux就该这么学》来学习RHEL 7系统,迎合更多的发行版系统。至今,Linux系统已经成为我开发工作的一部分,简单的指令操作,完全开放的权限,稳定的运行效率,以前在windows下很繁琐的操作,在Linux下只需要一条命令,在开发工作中极大的节约了时间成本。我想,对于开发者而言,不仅仅是php开发者,Linux系统对于我们来说都是不可缺少的工作平台!
PHP开发者的Vue与React入门指南
PHP是一种常用的服务器端脚本语言,用于开发动态网页和网站。许多PHP开发者经常需要学习前端框架来提升他们的技能,并且Vue.js和React.js是两个当前非常热门的前端框架。本文将为PHP开发者提供一份Vue.js和React.js的入门指南,带有具体的代码示例,帮助他们快速了解这两个框架的基本概念和用法。
1. Vue.js入门指南
Vue.js是一款轻量级的JavaScript框架,用于构建交互式的用户界面。下面是一个简单的Vue.js示例,展示了如何创建一个基本的Vue组件并进行数据绑定:
<!DOCTYPE html> <html> <head> <title>Vue.js入门示例</title> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script> </head> <body> <div id="app"> <h1>{{ message }}</h1> </div> <script> var app = new Vue({ el: ''#app'', data: { message: ''Hello, Vue.js!'' } }); </script> </body> </html>
在这个示例中,我们通过Vue实例绑定了一个数据message,并在页面中使用双花括号语法{{ }}来显示这个数据。
2. React.js入门指南
React.js是由Facebook开发的一款流行的JavaScript库,用于构建用户界面。下面是一个简单的React.js示例,展示了如何创建一个基本的React组件:
立即学习“PHP免费学习笔记(深入)”;
import React from ''react''; class HelloWorld extends React.Component { render() { return ( <h1>Hello, React.js!</h1> ); } } export default HelloWorld;
在这个示例中,我们创建了一个名为HelloWorld的React组件,并在render()方法中返回了一个包含内容的元素。
3. Vue.js与React.js的对比
Vue.js和React.js都有着自己的优势和特点,根据个人喜好和项目需求可以选择使用其中之一。Vue.js更加简洁和直观,适合初学者上手;而React.js则更加灵活和功能丰富,适合大型应用的开发。
总的来说,无论选择Vue.js还是React.js,都能帮助PHP开发者进一步扩展他们的技能树,提升前端开发能力。
以上是关于PHP开发者的Vue.js和React.js入门指南,带有详细的代码示例。希望本文能够帮助读者快速入门这两个前端框架,并在实际项目中应用它们。
以上就是PHP开发者的Vue与React入门指南的详细内容,更多请关注php中文网其它相关文章!
关于给PHP开发者的编程指南 第一部分降低复杂程度和基于php开发的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Algolia加持:PHP开发者的搜索引擎优化指南、linux设置密码复杂程度、PHP开发者的Linux学习之路、PHP开发者的Vue与React入门指南的相关知识,请在本站寻找。
本文标签: