php如何

如何少写PHP“烂”代码

PHP烂代码

写给初生牛犊不怕虎的童鞋们,大佬可随意摘看本章基于PHP Laravel

前言

经常会有人问

目录如何设计比较好?代码如何分布好?怎么写一个可维护的项目?

“烂”项目我也没少写,以下是参考互联网各大佬的文章总结及个人开发经验而来.

Controller

MVC

Controller顾名思义是控制器,在入门PHP的时候,就知道Controller代表MVC中的C层,MVC本身的概念就代码分离,教你如何如何将业务分开,但面临着业务的不断发展,代码的复杂度也随之提高,功能与功能之间的连接错综复杂,最后你的MVC就变成了下图,所以仅仅依托MVC的设计思想已经无法支撑不断发展的业务。

现在我们将Controller的任务和能力重新定义,控制器仅仅控制Http Reqeust的请求,这样就符合了SOLID 单一功能原则。

直接将业务代码写在Controller中,会使得代码及其臃肿,不易于维护和扩展。

<?phpnamespace App\Http\Controller; class UserController extends Controller{ public function register(Request $request){ $user = new User(); $user->username = $request->input('username'); $user->password = $request->input('password'); $result = $user->save(); return $result; } }

这时就应该思考如何分离业务代码,我们引入Service的概念。

Service

Service本身译为服务

将外部方法,公共方法注入到Service将Service注入到控制器

Service层

像上图这样

UserController

<?phpnamespace App\Http\Controller; class UserController extends Controller{ public $request; protected $userService; public function __construct(Request $request, UserService $userService) { $this->request = $request; $this->userService = $userService; } public function register() { //... validation return $this->userService->register ($this->request->all()); } }

UserController

<?phpnamespace App\Service; class UserService{ public function register($data) { $username = $data['username']; $password = $data['password']; $password = encrypt ($password); $user = new User(); $user->username = $username; $user->password = $password; $result = $user->save(); return $result; } }

到现在为止,我们至少将业务与请求彻底分开了。但还是不如人意,如果把所有的业务及CURD全部写在Service中,那只不过是将Controller的臃肿转移到了Service,那Service就没有什么存在意义了。所以我们需要继续分割Service,将对数据库的R操作独立出来,因为CUD的操作基本是一贯不变的,而R操作根据业务的复杂度则变的多姿多彩。所以独立R操作。这个时候我们引用Repository的概念。

Repository

我们使用Repository辅助Model,将相关的查询逻辑封装到不同的repository中,方便逻辑代码的维护

符合SOLID的单一原则符合SOLID的依赖反转

Repository

UserController

<?phpnamespace App\Http\Controller; class UserController extends Controller{ public $request; protected $userService; public function __construct(Request $request, UserService $userService) { $this->request = $request; $this->userService = $userService; } public function getUserInfo() { //... validation return $this->userService->getUserInfo ($this->request->all()); } }

UserService

<?phpnamespace App\Service; class UserService{ public function getUserInfo(UserRepository $userRepository) { return $this->userRepository->getUserInfo($data); } }

UserRepository

<?phpnamespace App\Repository; class UserRepository{ public function getUserInfo($data) { $userId = $data['user_id']; $result = User::where('id',$userId)->first(); return $result; } }

解决了R的问题,有人就问了,难道因为CUD比较统一简单就可以放在一起了吗?答案是NO,我们引用一个新的名词Action。

Action

Common

Event

Exception

一篇文章用来叙述这个难免有点内容庞大,剩下的明天更新,谢谢大家关注,有问题下方评论即可。

展开
收起

thinkphp如何使用vue进行web开发

vue可以说是近几年最火最流行的前端js框架,而thinkphp也是国内挺流行的后端框架。看到网上很多朋友的教程都是前端开发者写的,难免对像自己一样的后端程序员是一种打击。“怎么就没有从后台出发讲讲如何使用前端vue框架呢?”我时常这样想。终于我有机会,在一个公司内部的管理系统中成功将两者融合。

整个项目的系统后台使用php的thinkphp框架,前端使用vue的element ui框架,前后台交互使用axios库。这就是整个架构了。我要介绍的重点也就是大家关心的thinkphp,如何与vue交互。

vue中的v-for循环输出可以用thinkphp的volist标签进行替代。

volist标签进行替代v-for

2.vue的v-model绑定到在vue的data()属性中的一个thinkphp的变量(如{$变量名})。作用是前端元素的属性值变化随着{$变量名}变化而变化。记住是v-model="{$vo2['id']}"

v-model绑定到thinkphp的变量

3.vue前端与后台的交互使用axios库。这个axios相当于ajax。

4.按钮的单击事件使用@事件名:"绑定函数名"。如图:click是element ui的事件名称,文档中可以查到.onsubmit是绑定的函数.element ui 的属性以:开头,如:true-label="1",true-label是第六点提到的Checkbox的一个属性.可以参考下文档.

@开头的事件绑定的onsubmit函数使用

5.element ui框架中的事件如何调用呢?这其实就是初次使用的朋友不知道如何写事件的参数.如何知道事件有哪些参数,我想加入自定义的参数而不破坏原先事件自带的参数呢?看到这里朋友们的疑问就可以解决了.请看下面的例子:

我以Checkbox 多选框为例,具体文档大家可以看官网的文档说明.Checkbox 多选框有个change事件

Checkbox 多选框的change事件

change事件有个回调参数,大家一看到这个肯定就晕乎了,这参数传入什么呢,参数到底有几个呢?我测试过它的参数有2个.其中一个是官网上写的"更新后的值",还有一个可能是内置的事件参数(这个参数很多属性,与checkbox对象有关).我是如何判断事件的参数的呢,就是在vue的methods中写一个onclick函数,参数任意给我这给的是a,b,然后console.debug(a,b);即可.下边是输出2个参数的代码:

注意事件名称后边没有括号哦未知参数的前提下输出2个试探参数a,b

通过浏览器控制台的输出可以看到第一个参数就是选中或不选中的值:true/false.第二个参数就是很长的对象了.结果如下:

浏览器输出

写到这里我发现我应该单独拿出来写一篇文章给大家说说,越写越多啊!

接着第5点说,事件中我想加入参数还要带着原有的参数,怎么整呢?好办在

@change绑定事件的名称中加入一个参数$event即可.如下图我第二个参数传的是一个id整数值.

html页面调用element ui的事件

浏览器输出如下:

多加个参数的输出

浏览器控制台的输出结果1是:true-label的值,而7是我数据库表格的id.

经过以上介绍,我就把think PHP中如何使用element ui的知识点基本说到了.如果有朋友没听说讲清楚可以评论中喊我,我看到了就会回复的.欢迎交流.

展开
收起

PHP网站开发如何选择开发方式

很多公司进行网站建设时采用了PHP语言作为开发语言,大部分的网站开发公司也都有PHP开发团队,PHP作为现流行的开发语言之一,深受广大开发者喜爱,也得到了很多公司的认可,然而随着PHP越走越远各种开源系统也百家齐放,什么开源网站管理系统,开源办公OS系统,开源商城系统,开源微信、小程序管理系统等等。

那么对于一般的企业网站或者网站带点少许的需求比如:前台分离,多语言开发,数据管理,数据查询等等,企业该如何选择开发的方式呢?

云智总结了现在市面比较流行改的开发方式,这些系统和开发方式企业可以根据自己的实际需求进行选择。

基于网络上开源系统进行二次开发

网络上老牌的开源系统有不少,DEDEcms、EmpireCMS、PHPcms、WordPress等等,市场占有率不少,成熟的架构和功能积累保证了系统安全和实用性,但是系统迭代漏洞比较多,前三个是国内的WP是国外的,EmpireCMS是安全的但是系统体量太大,二次开发要求开发者有一定的基础,这些系统的UI相对WordPress好点但不太适合国人使用习惯后期使用比较麻烦。

这种采用成熟系统的开发模式有点是比较快,但是后期漏洞安全是问题,还有万一哪天漏忘记补上那就悲催了,因为你的结构被人一清二楚。

基于一些程序的框架进行一次开发

说起款国内比较出名PHP框架ThinkPHP简称TP,收到不少项目和开发人员的认可,不过漏洞也挺让人头疼的,再有就是YII、laravel、CI等一大批国外优秀的框架。

采用这些框架进行网站开发的好处就是产品功能的可塑性比较强,比较适合网站配合上一些业务逻辑系统。

基于商业公司的封闭式产品二次开发

一些外包公司有自己的专业管理系统,这些系统并没有在线发布属于内部产品,相对来说比较安全,能够满足大部分企业的需求使用,是企业进行网站开发的首先。

以上三种开发形式企业可以酌情选择,当然不同的开发模式网站开发的费用也是不一样的。

展开
收起

PHP如何实现选择排序

选择排序在冒泡排序的基础上进行了改进,每次通过列表时只进行一次传递交换。简单来说,选择排序的原理就是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。

PHP选择排序的代码示例如下:

<?phpfunction selection_sort($data){for($i=0; $i<count($data)-1; $i++) { $min = $i; for($j=$i+1; $j<count($data); $j++) { if ($data[$j]<$data[$min]) { $min = $j; } } $data = swap_positions($data, $i, $min); } return $data;}function swap_positions($data1, $left, $right) { $backup_old_data_right_value = $data1[$right]; $data1[$right] = $data1[$left]; $data1[$left] = $backup_old_data_right_value; return $data1;}$my_array = array(3, 0, 2, 5, -1, 4, 1);echo "原始数组:\n";echo implode(', ',$my_array );echo "\n排序后数组:\n";echo implode(', ',selection_sort($my_array)). PHP_EOL;

输出:

原始数组:3, 0, 2, 5, -1, 4, 1 排序后数组:-1, 0, 1, 2, 3, 4, 5

本篇文章就是关于PHP选择排序的实现方法介绍,希望对需要的朋友有所帮助!

展开
收起

PHP如何获取数据资料

php抓取xml结构的数据

采用以下方法获取数据,获取数据的方式多种,但是这种方法简单易懂。

本人在github上编写一个demo:https://github.com/hwkkevin/PullData

更多技术问题:请关注技术分享社区熊掌号。

展开
收起

你知道如何用PHP实现多进程吗?

本文将讲解如下内容:

PHP原生进程函数介绍PHP实现多进程代码

01PHP原生进程函数

虽然说PHP是世界上最好的语言,但是对于PHPer们来说,对多进程、进程管理还是相对陌生的。本文将讲解一下使用PHP原生代码如何实现多进程。

首先我们要了解PHP实现多进程的函数,如pcntl_fork、pcntl_wait、pcntl_waitpid等。

pcntl_fork ( void ) : int

这个函数的作用是创建子进程,并且返回 int 类型的进程ID,父进程和子进程都是从fork的位置开始向下继续执行。

子进程创建成功时,在父进程执行线程内返回产生的子进程的PID,在子进程执行线程内返回0。创建失败时,在父进程上下文返回-1,不会创建子进程,并且会引发一个PHP错误。

pcntl_wait ( int &$status [, int $options = 0 ] ) : int

这个函数的作用是等待或返回fork的子进程状态。此函数会挂起当前进程的执行,直到一个子进程退出或者受到一个信号要求中断当前进程或者调用一个信号处理函数。如果一个子进程在调用此函数时已经退出,此函数立刻返回。

此函数返回退出的子进程号,发生错误时返回-1,如果提供了WNOHANG作为option并且没有可用子进程时返回0。

pcntl_waitpid ( int $pid , int &$status [, int $options = 0 ] ) : int

这个函数的作用是等待或返回fork的子进程状态。调用这个函数会挂起当前进程的执行,直到参数pid指定的进程号的进程退出,或者接收到一个信号要求中断当前进程或调用一个信号处理函数。

pcntl_waitpid()返回退出的子进程进程号,发生错误时返回-1,如果提供了 WNOHANG作为option,并且没有可用子进程时返回0。

pcntl_signal ( int $signo , callback $handler [, bool $restart_syscalls = true ] ) : bool

这个函数的作用是安装信号处理器,为signo指定的信号安装一个新的信号处理器。

signo为信号编号。

handler为信号处理器,可以是用户创建的函数或方法,也可以是系统常亮SIG_IGN(忽略信号处理程序)或 SIG_DFL(默认信号处理程序)。

restart_syscalls 指定当信号到达时系统调用重启是否可用。

函数返回值为bool型,成功时返回true,失败时返回false。

02PHP实现多进程代码

如有疑问,可以留言相互讨论。

展开
收起

如何用PHP开发一个完整的网站

尽量完整的需求方案,具体到功能上:建模结构UML,建立数据库: 1、建立的表名、字段名要与他的功能有关系。 2、根据结构建立数据库表,原则是不定项内容一定要分表。 3、字段类型要考虑内容是否够用就够就好,选择适合的类型INT Varchar Date(4)设计HTML文件和脚本的实现 根据模和数据库来设计页面是个很科学的方法,当然有的时候有人喜欢根据模型设计页面,数据库基于页面设计,都是可以的。 设计页面时要考虑到每个细节,包括提示消息页面,错误页面。(5)PHP代码的书写1、先建立底层结构和文件夹(如果是大型的网站同样设计一个文件UMML)2、基础功能分类关联,以便今后代码引用。3、代码的书写,注意简洁性和函数的使用,内部函数能实现的尽量使用内部函数。4、在部分关键位置加以代码注释。(6)程序的测试和修正1、对于发现的BUG不能就解决BUG而解决,要处于完整程序考虑。避免收之东隅收之桑榆。2、对于解决过的BUG已经要详细记录,以便日后更新。多人开发应该注意什么使用版本服务器:CVS、SVN...功能:1、单个文件历史版本的记录和恢复2、文件的锁定和更新3、单个或多个文件程序之间的沟通4、保护程序的安全性不受单个程序的误操作而丢失

尽量完整的需求方案,具体到功能上:建模结构UML,建立数据库: 1、建立的表名、字段名要与他的功能有关系。 2、根据结构建立数据库表,原则是不定项内容一定要分表。 3、字段类型要考虑内容是否够用就够就好,选择适合的类型INT Varchar Date(4)设计HTML文件和脚本的实现 根据模和数据库来设计页面是个很科学的方法,当然有的时候有人喜欢根据模型设计页面,数据库基于页面设计,都是可以的。 设计页面时要考虑到每个细节,包括提示消息页面,错误页面。

(5)PHP代码的书写1、先建立底层结构和文件夹(如果是大型的网站同样设计一个文件UMML)2、基础功能分类关联,以便今后代码引用。3、代码的书写,注意简洁性和函数的使用,内部函数能实现的尽量使用内部函数。4、在部分关键位置加以代码注释。(6)程序的测试和修正1、对于发现的BUG不能就解决BUG而解决,要处于完整程序考虑。避免收之东隅收之桑榆。2、对于解决过的BUG已经要详细记录,以便日后更新。多人开发应该注意什么使用版本服务器:CVS、SVN...功能:1、单个文件历史版本的记录和恢复2、文件的锁定和更新3、单个或多个文件程序之间的沟通4、保护程序的安全性不受单个程序的误操作而丢失

文章来源:昆明网站建设专业品牌——找北网络科技(zhaobeikj.com)

展开
收起

PHP如何获取一周的第一天

使用PHP strtotime()函数可以获取一周的第一天。此函数返回默认时间变量timestamp,然后使用date()函数将时间戳日期转换为可理解的日期。

strtotime()函数: strtotime()函数通过解析时间字符串返回时间戳中的结果。

语法:

strtotime($EnglishDateTime, $time_now)

参数:

strtotime()函数接受上面提到的两个参数,如下所述:

$ EnglishDateTime:它指定英文文本日期时间描述,表示要返回的日期或时间。该函数解析字符串并以秒为单位返回时间。这是必需的参数。

$ time_now:此参数指定用于计算返回值的时间戳。这是一个可选参数。

date()函数: date()函数返回更易理解和人类可读的日期格式。

语法:

date( format, timestamp )

参数此函数接受上述两个参数,如下所述:

format:指定显示结果的日期和时间格式。

timestamp:它是生成日期的默认时间变量。

注意:在PHP中,星期从星期一开始,所以如果时间字符串以“this week”给出,则输出将是星期一的时间戳,通过传递date()函数可以使其可读。

示例1:当时间字符串为“this week”(本周)时,获取一周的默认第一天。

<?php $firstday = date('l - d/m/Y', strtotime("this week")); echo "First day of this week: ", $firstday; ?>

输出:

First day of this week: Monday - 11/02/2019

在PHP中,要把周日作为一周的第一天,需要考虑上一周的周日。也就是说得到一个星期的第一天(星期日)需要得到上一个星期的星期天,得到下一个星期的第一天(星期日)需要得到这个星期的星期天,以此类推。

PHP支持-ve indexing in time-string。因此,为了获得前一周,它可以将时间字符串用作“-1 week”,并且为了获得当天它还必须包括日期时间字符串的名称。

示例2:获取一周的第一天(星期日)。

<?php $firstday = date('l - d/m/Y', strtotime("sunday -1 week")); echo "First day of this week: ", $firstday, "\n"; $firstday = date('l - d/m/Y', strtotime("sunday -2 week")); echo "First day of last week: ", $firstday, "\n"; $firstday = date('l - d/m/Y', strtotime("sunday 0 week")); echo "First day of next week: ", $firstday, "\n"; $firstday = date('l - d/m/Y', strtotime("sunday 1 week")); echo "First day of week after next week : ", $firstday; ?>

输出:

First day of this week: Sunday - 10/02/2019 First day of last week: Sunday - 03/02/2019 First day of next week: Sunday - 17/02/2019 First day of week after next week : Sunday - 24/02/2019

本篇文章就是关于如何在PHP中获得一周的第一天的方法介绍,希望对需要的朋友有所帮助!

展开
收起

PHP程序员如何延长自己的职业生命周期

虽然PHP程序员主要集中在Web开发领域,但是由于Web开发的应用空间非常大,而且由于PHP语言在Web开发领域的应用非常普遍,所以目前IT行业内有大量的PHP程序员。

关于PHP程序员职业生命周期的长短,主要取决于三方面因素,其一是程序员自身的知识结构能否驱动PHP程序员不断拓展自身的岗位边界。在当前的云计算时代背景下,PHP程序员必须考虑如何通过云计算相关服务(尤其是PaaS),来向全栈开发方向转换,这是延长职业生命周期的重要方式。

其二是能否升级到研发级岗位。虽然PHP程序员的整体数量比较庞大,但是大部分PHP程序员都是属于应用级程序员,简单地说就是完成具体的应用业务逻辑实现(增删改查),这在互联网时代的初期是没有问题的,但是在未来的智能化时代,传统的应用级开发任务将逐渐被智能体所取代,所以PHP程序员应该考虑能否转向研发级岗位。要想转向研发级岗位,首先应该有一个自己的主攻方向,同时具有扎实的数学基础。目前不少应用级程序员在通过读研的方式来完成岗位升级,这也是一个比较现实的选择。

其三是能否积累大量的行业经验。在产业互联网时代,程序员的行业经验对于自身的职业生命周期也会有较为明显的影响,因为行业经验会在很大程度上帮助产业互联网的相关技术实现落地应用,包括大数据、云计算和人工智能等技术的落地应用。

最后,随着目前IT行业工作环境的不断改善,未来程序员岗位的职业生命周期会不断得到延长,程序员的工作压力也会在一定程度上得到下降。

我从事互联网行业多年,目前也在带计算机专业的研究生,主要的研究方向集中在大数据和人工智能领域,我会陆续写一些关于互联网技术方面的文章,感兴趣的朋友可以关注我,相信一定会有所收获。

如果有互联网、大数据、人工智能等方面的问题,或者是考研方面的问题,都可以在评论区留言!

展开
收起

php如何使用变量(入门3)

php是世界上最好的语言

php的环境搭建好了之后,我们就可以写代码了。

一:如何新建PHP文件。

上一节介绍怎么搭建环境,现在接着在环境目录www(根目录)下面新建一个php文件。新建一个记事本文件,然后后缀修改成php结尾。

新建txt文件,然后修改成php结尾

二:变量?

1:变量是用$美元符号表示的,后面接着英文单词,或者汉语拼音都可以,为了方别可读性最好用英文单词表示。

2:变量是什么呢,变量好比是一个空箱子,用来临时存放数据的。$name='zhangsan';意思是把zhangsan赋值给$name,中间的=是赋值的意思,不是等于号。你给变量什么值,他就是什么什么值,随时可以改变。

$name='zhangsan';

$name='lisi';

开始给$name这个变量赋值为zhangsan,那么$name就是zhangsan,后面又$name='lisi',那么$name就不再是zhangsan了,现在是lisi了。现在就明白了,变量的值是会变得,你给他赋值什么,就变成什么值。

3:至于环境变量,魔法变量,静态变量。这些后面再讲,先入门。

4:我们现在就会写变量了,就是$符合后面跟着英文单词或者字母,名字随便取。

5:官方的变量名规则,可以参考,我讲的比较通俗。

PHP 变量规则:

变量以 $ 符号开始,后面跟着变量的名称变量名必须以字母或者下划线字符开始变量名只能包含字母数字字符以及下划线(A-z、0-9 和 _ )变量名不能包含空格变量名是区分大小写的($y 和 $Y 是两个不同的变量)6:在PHP标签里面写标量,下面是案例。

<?php

$txt="Hello world!";

$x=5;

$y=10.5;

?>

展开
收起