当前位置: 首页 > 后端技术 > PHP

BigTalkPHP开发总结

时间:2023-03-29 15:05:20 PHP

前言最近因为公司内部调动,开始参与PHP项目的后端开发。一直以来都是写强类型语言比较多的,也接触过弱类型语言,比如:nodejs,python,做一些辅助服务,资料收集,刚好有这个机会在内部学以致用,加上前期对后端的理解和经验,很容易上手,下面是一些开发过程中遇到的问题的解决方法和我自己对PHP的理解了解,并且项目的部分架构已经进入PHP7版本,并且进行了很多调整,尤其是在性能方面。面向对象的PHP框架内置了很多强大的功能,超级全局变量,魔法函数,魔法变量。通过提供的内置函数、数据类型操作、http信息获取等扩展PHP项目,通过安装扩展增加各种功能支持。大部分框架内置的函数调用还是偏向于进程的。通过调用函数,传入要操作的类型Data和依赖数据,一开始不习惯。在面向对象开发中,我习惯于直接键入变量/对象来指出函数。现在PHP开发可以选择使用面向过程的还是面向对象的。最早的PHP版本不支持面向对象的特性。PHP5开始对OOP有了很好的支持。很多PHP开发者并没有系统地学习过OOP相关的知识,包括长期工作经验的PHP。很多开发者或者老项目还是比较喜欢面向过程开发的,所以会接触到很多比较喜欢面向过程开发的项目。在项目开发过程中,他们遇到了一些偏向于应用业务开发的项目。看似类有用,实则无用。面向对象的特性将业务抽象出来,比如:项目中每个业务功能都有一个php文件对应一个类,大部分是逻辑功能,然后通过扩展autoload,实现自动includephp文件,比如通过L函数传入要调用的类名,构造PHP文件路径,执行include,然后返回类实例对象。它只使用类文件来区分函数功能,并没有使用面向对象的特性进行封装。开发上还是偏向于面向过程的思想PHP5开始对OOP提供了很好的支持,基本类似于java和C#的面向对象语法。可以使用命名空间,封装接口,抽象,多态:implements,extends,PHP7还支持多重继承特性,方便封装一些常用的功能,通过PSR4规范,引入composer实现的autoload可以用于OOP开发.PHP开发还是比较灵活的,可以面向过程也可以面向对象。根据具体业务场景,使用composerpsr4在项目中添加composer.json文件。根据需要配置{"autoload":{"psr-4":{"Library\\":"library/"}}}在composer.json文件所在目录下输入命令,会自动下载vendor/composerautoload相关文件composerinstallphp中的入口索引包括autoload.phpinclude_once"vendor/autoload.php";注意当配置修改,内容改变时,内容改变时需要执行composerdump-autoload-o不习惯的是weak类型。您不需要定义变量类型、参数类型和返回值类型。习惯了强类型的童鞋,一开始会有些不适应。不定义类型才奇怪。总觉得会造成一些错误。而且IDE在弱类型的编码过程中不会出现一些类型错误的提示。只有在运行过程中报错,才能知道有错误,错误提示滞后。特别是,从数据库查询返回的数据是一个标准类/数组。获取到的数据不对应实体类,无法得知具体数据有哪些字段。需要通过查询的sql语句,然后查看表结构,才能知道数据字段信息。这让人不舒服,影响开发效率。PHP现在支持类型提示。通过定义类型,您可以为部分确定的类型变量、参数和返回类型定义强类型。特别是,您需要定义表数据模型类。获取数据对象后,通过->可以感知所有数据字段,方便后续开发维护。可以根据场景使用。不能说所有的类型定义都写成强类型,因为我习惯用强类型/***ClassMJop*@propertyint$idjobID*@propertystring$namejobname*@propertyint$salarysalary*/classMJop{}/***ClassMWorker*@propertystring$name员工姓名*@propertyint$ageage*@propertyMJop$jopjob*/classMWorker{}classWorker{/***获取员工信息*@paramint$id*@returnMWorker|stdClass*/publicfunctionget(int$id):stdClass{//mysqlselectreturnnewstdClass();}}classLogic{/***获取员工描述*@paramint$workId*@returnstring*/publicfunctionDesc(int$workId):string{$worker=newWorker();$mWorker=$worker->get($workId);返回“姓名:”。$mWorker->名字。',年龄:'。$mWorker->年龄。',工作工作:'+$mWorker->jop->name。',薪水:'。$mWorker->工作->薪水;}}通过定义变量类型获取代码感知/**@varLogic$logic*/$logic=newLogic();弱类型比较第一大和第二大:因为PHP是弱类型,在做类型比较的时候,经常会因为粗心而掉坑里。下表列出了类型功能和类型比较我问你,你看到这些表害怕吗?心中有一万匹草泥马疾驰而过,眼神瞬间变得愤恨。使用PHP函数将变量$x与表达式gettype()empty()is_null()isset()boolean进行比较:if($x)$x="";stringTRUEFALSETRUEFALSE$x=null;NULLTRUETRUEFALSEFALSEvar$x;NULLTRUETRUEFALSEFALSE$x未定义NULLTRUETRUEFALSEFALSE$x=array();arrayTRUEFALSETRUEFALSE$x=false;booleanTRUEFALSETRUEFALSE$x=TRUEFALSE$=1;integerFALSEFALSETRUETRUE$x=42;integerFALSEFALSETRUETRUE$x=0;integerTRUEFALSETRUEFALSE$x=-1;integerFALSEFALSETRUETALSE$x=-1;integerFALSEFALSETRUETALSE";stringFALSEFALSETRUETRUE$x="0";stringTRUEFALSETRUEFALSE$x="-1";stringFALSEFALSETRUETRUE$x="-1";stringFALSEFALSETRUETRUE$x="php";stringFALSEFALSETRUETRUE$x="true";stringFALSEFALSETRUETRUE$x="false";stringFALSEFALSETRUETRUE松散比较==类型TRUEFALSE10-1"1""0""-1"NULLarray()"php"""TRUETRUEFALSETRUEFALSETRUETRUEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSETRUEFALSETRUEFALSEFALSETRUEFALSETRUETRUEFALSETRUE1TRUEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSE0FALSETRUEFALSETRUEFALSEFALSETRUEFALSETRUEFALSETRUETRUE-1TRUEFALSEFALSEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSE"1"TRUEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSE"0"FALSETRUEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSE"-1"TRUEFALSEFALSEFALSETRUEFALSEFALSETRUEFALSEFALSEFALSEFALSENULLFALSETRUEFALSETRUEFALSEFALSEFALSEFALSETRUETRUEFALSETRUEarray()FALSETRUEFALSEFALSEFALSEFALSEFALSEFALSETRUETRUEFALSEFALSE"php"TRUEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSE""FALSETRUEFALSETRUEFALSEFALSEFALSEFALSETRUEFALSEFALSETRUE严格比较===类型TRUEFALSE10-1"1""0""-1"NULLarray()"php"""TRUEFAITHFULLFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEALSEFALSEFALSEFALSEFALSE-1FALSEFALSEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSE"1"FALSEFALSEFALSEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSE"0"FALSEFALSEFALSEFALSEFALSEFALSETRUEFALSEFALSEFALSEFALSEFALSE"-1"FALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSEFALSEFALSEFALSENULLFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSEFALSEFALSEarray()FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSEFALSE"php"FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSE""FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUE参考官方类型比较文档刚接触PHP看到这几个表格的时候会有点儿晕,开发的时候需要特别注意类型比较。尝试使用'==='进行同行比较。有些函数类型已经可以确定不会传递多种类型的参数,所以你可以强制限制类型。以后再熟练的看这张表,就会觉得不够用。嗯,常用类型的比较已经深入人心了。其他问题:IDE无法对定义的变量进行错误提示,因为没有定义的类型,IDE也不知道定义变量的类型,所以没有错误提示的方法。很多时候需要在运行时输出到页面来发现问题。PHP弱类型导致的漏洞。PHP的灵活性。弱类型下的很多问题上面都说了。这是弱类型的优点。弱类型的一个明显优势是灵活性。PHP的动态特性可以动态实例化、动态添加属性、动态调用函数等,通过这些特性可以用简单的代码封装强大的功能。简单栗子:名字。',体积:'。$this->头发;如果(!empty($this->age))$desc=$desc。',年龄:'。$这个->年龄;回声$desc。"\r\n";}/***数据逻辑处理*@param$condition*@returnbool|string*/publicfunctionhandle($condition){if(is_int($condition)){//......logicalreturn'number处理结果';}elseif(is_string($condition)){//......逻辑返回'字符串处理结果';}elseif(is_array($condition)){//......逻辑返回'数组处理结果';}else{返回错误;}}}//-----动态添加对象属性-----$xm=newDeveloper();$xm->name='码圣';$xm->hair=80;//方法一——变量作为属性名//$fieldAge='age';//$developer->$fieldAge=20;//方法二——直接设置属性值$xm->age=20;//-----动态调用对象函数-----//变量作为函数名调用$fn='introduce';if(method_exists($xm,$fn))$xm->$fn();//-----动态实例化-----//方法一——变量实现为类名实例化$className='Developer';/**@varDeveloper$xf*/$xf=new$className();$xf->name='小芳';$xf->hair=30;$xf->introduce();//------属性遍历------foreach($xfas$key=>$val){echo$key.'='。$瓦尔。"\r\n";}//------参数类型和返回值支持多种类型------$rs=$xf->handle(null);if($rs===false){echo'处理失败';}else{echo$rs;}//-----函数变量------$fn=function(){echo'do某物';};$fn();独有特性内存非常驻PHPWEB服务器开发,服务器部署多依赖于fastcgi进程管理器,静态变量不同于C#包括java生命周期,C#/javaWEB应用服务进程静态变量常驻内存共享,PHP多使用nginx部署fastcgi进程管理。从服务器接收请求的过程是相互独立的。请求被响应后,资源被回收。没有居民。当然PHP也可以常驻内存。内存常驻cli(命令行方式)、swoole框架开发部署的WEB应用服务也是内存常驻错误级别。以前用C#开发,执行遇到异常会直接抛出错误。trycatch可以捕获error异常。如果出现异常,则不会继续执行后面的内容。PHP会比较没有,根据不同的错误级别和不同的执行机制PHP有几种错误严重级别。三种最常见的消息类型是错误、通知和警告。它们具有不同的严重性:E_ERROR、E_NOTICE和E_WARNING。错误是运行时的严重问题,通常是由代码中的错误引起的,必须修复错误,否则将停止PHP执行。通知本质上是建议性的,因为程序代码在执行过程中可能会出现问题,但程序不会停止。警告是非致命错误,不会停止程序执行。PHP可以控制错误是显示在屏幕上(对开发有用)还是隐藏日志(适合正式环境)来改变报错行为:#方法一:配置php.inierror_reporting=E_ALL&~E_NOTICE//方法2:函数调用设置错误级别error_reporting(E_ALL&~E_NOTICE);内联错误抑制:错误控制运算符@来抑制特定错误。将此运算符放在表达式之前,之后的任何错误都不会发生。