.请自我介绍一下?
答:我叫xxx,来自北京,20xx年毕业于xx大学计算机xx系,毕业后在武汉从事了x年的php开发工作,公司是一个外包公司,主要做微信开发,公众号推广,商城,论坛的开发
2.你在公司负责那些项目?
答:由于我们公司是一个外包公司,不可能只做一个项目,公司的项目都是交叉进行的,论坛,微信,商城我都做过?
3.你为什么来深圳?
答:因为我哥在这边,父母也希望兄弟间有个照应,而且深圳是一线城市,技术也比广西前沿一些
4.武汉使用什么前端框架和后端框架?
答:根据自己的区域回答
5.你做过那些模块?
答:登陆注册,商品管理,购物车模块,订单管理
6.你们公司是使用什么框架?
答:我们公司采用的是TP框架,运用的mysql+apache+php进行开发,因为TP框架是一个免费开源的,轻量级的php开发框架,而且是我们中国人自己开发的,也是国内用的比较多的,各种资料也比较齐全
7.mvc是什么?相互间有什么关系?
答:mvc是一种开发模式,主要分为三部分:m(model),也就是模型,负责数据的操作;v(view),也就是视图,负责前后台的显示;c(controller),也就是控制器,负责业务逻辑
客户端请求项目的控制器,如果执行过程中需要用到数据,控制器就会到模型中获取数据,再将获取到的数据通过视图显示出来
8.oop是什么?
答:oop是面向对象编程,面向对象编程是一种计算机编程架构,OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。
1
OOP具有三大特点
1、封装性:也称为信息隐藏,就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系,或者说只公开了一些供开发人员使用的方法。于是开发人员只 需要关注这个类如何使用,而不用去关心其具体的实现过程,这样就能实现MVC分工合作,也能有效避免程序间相互依赖,实现代码模块间松藕合。
2、继承性:就是子类自动继承其父级类中的属性和方法,并可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。PHP只支持单继承,也就是说一个子类只能有一个父类。
3、多态性:子类继承了来自父级类中的属性和方法,并对其中部分方法进行重写。于是多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些相同的方法后却可以获得完全不同的结果,这种技术就是多态性。多态性增强了软件的灵活性。
1、易维护
采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是非常方便和较低成本的。
2、质量高
在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。
3、效率高
在软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类。使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提高软件开发的效率和质量。
4、易扩展
由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。
9.smarty是什么,有什么作用?
回答一:smarty是用php写出来的模板引擎,也是目前业界最著名的php模板引擎之一
它分离了逻辑代码和外在的显示,提供了一种易于管理和使用的方法,用来将混杂的php逻辑代码与html代码进行分离
回答二:smarty是php中最著名的引擎框架之一,我们公司使用的是TP框架,已经封装好了smarty模板,所以没有单独使用过
回答三: smarty是个模板引擎,最显著的地方就是有可以把模板缓存起来。一般模板来说,都是做一个静态页面,然后在里面把一些动态的部分用一切分隔符切开,然后在PHP里打开这个模板文件,把分隔符里面的值替换掉,然后输出来,你可以看下PHPLib里面的template部分。
而smarty设定了缓存参数以后,第一次运行时候会把模板打开,在php替换里面值的时候把读取的html和php部分重新生成一个临时的php文件,这样就省去了每次打开都重新读取html了。如果修改了模板,只要重新刷下就行了。
10.TP框架有哪些优点?
答:TP框架是我们中国人自己开发的框架,各种资料比较齐全,国内用的比较多,比较简单和方便,而且是免费开源的
11.TP的特性有哪些?
1.多表查询非常方便,在model中几句代码就可以完成对多表的关联操作 2.融合了smarty模板,使前后台分离 3.支持多种缓存技术,尤其对memcache技术支持非常好 4.命名规范,模型,视图,控制器严格遵循命名规则,通过命名一一对应 5.支持多种url模式 6.内置ajax返回方法,包括xml,json,html等 7.支持应用扩展,类库扩展,驱动扩展等
12.TP框架中的大字母函数?
U:对url的组装 A:内部实例化控制器 S:缓存处理 R:调用某个控制器的操作方法 D:实例化自定义模型类 M:实例化基础模型类 I:获取参数 L:设置或者获取当前语言 C:设置或获取,保存配置
13.请介绍一下laravel框架?
答: laravel框架的设计思想比较先进,非常适合应用各种开发模式,作为一个框架,它为你准备好了一切,composer是php的未来,没有composer,php肯定要走向没落
laravel框架最大的特点和优秀之处就是集合了php比较新的特点,以及各种各样的设计模式,Ioc模式,依赖注入等
14.laravel有那些特点?
回答一:
1.强大的rest router:用简单的回调函数就可以调用,快速绑定controller和router 2.artisan:命令行工具,很多手动的工作都自动化 3.可继承的模板,简化view的开发和管理 4.blade模板:渲染速度更快 5.ORM操作数据库 6.migration:管理数据库和版本控制 7.测试功能也很强大 8.composer也是亮点
回答二: laravel框架引入了门面,依赖注入,Ioc模式,以及各种各样的设计模式等
15.请简述一下数据库的优化?
答:数据库的优化可以从四个方面来优化:
1.从结构层: web服务器采用负载均衡服务器,mysql服务器采用主从复制,读写分离
2.从储存层: 采用合适的存储引擎,采用三范式
3.从设计层: 采用分区分表,索引,表的字段采用合适的字段属性,适当的采用逆范式,开启mysql缓存
4.sql语句层:结果一样的情况下,采用效率高,速度快节省资源的sql语句执行
16.如何解决异常处理?
答: 抛出异常:使用try…catch,异常的代码放在try代码块内,如果没有触发异常,则代码继续执行,如果异常被触发,就会 抛出一个异常。Catch代码块捕获异常,并创建一个包含异常信息的对象。$e->getMessage(),输出异常的错误信息。
解决异常:使用set_error_handler函数获取异常(也可以使用try()和catch()函数),然后使用set_exception_handler()函数设置默认的异常处理程序,register_shutdown_function()函数来执行,执行机制是,php要把调入的函数调入到内存,当页面所有的php语句都执行完成时,再调用此函数
17.前端?
答:我在工作中处理前端的功能,一般就是用ajax向后台请求数据,然后返回数据在前台页面中显示出来。我从来没有独立的完整的将html和css样式都一个人完成,如果公司实在有这样的需求的话,我可能会找一些前台的模板或者说是前端的框架,比如说h—ui等等
18.权限管理(RBAC)的实现?
1.首先创建一张用户表:id name auto(保存格式为:控制器-方法)
2.然后在后台中创建一个基类控制器,控制器里封装一个构造方法,当用户登陆成功后,使用TP框架中封装好的session函数获取保存在服务器中的session id,然后实例化模型,通过用户id获取保存在数据表中的auth数据,使用explode函数分割获取到的数据,并使用一个数组保存起来,然后使用TP框架中封装好的常量获取当前控制器和方法,然后把他们组装成字符串,使用in_array函数进行判断该数组中是否含有当前获取到的控制器和方法,如果没有,就提示该用户没有权限,如果有就进行下一步操作
19.支付功能的实现?
答:
20.怎么保证促销商品不会超卖?
答:这个问题是我们当时开发时遇到的一个难点,超卖的原因主要是下的订单的数目和我们要促销的商品的数目不一致导致的,每次总是订单的数比我们的促销商品的数目要多,当时我们的小组讨论了好久,给出了好几个方案来实现:
第一种方案:在每次下订单前我们判断促销商品的数量够不够,不够不允许下订单,更改库存量时加上一个条件,只更改商品库存大于0的商品的库存,当时我们使用ab进行压力测试,当并发超过500,访问量超过2000时,还是会出现超卖现象。所以被我们否定了。
第二种方案:使用mysql的事务加排他锁来解决,首先我们选择数据库的存储引擎为innoDB,使用的是排他锁实现的,刚开始的时候我们测试了下共享锁,发现还是会出现超卖的现象。有个问题是,当我们进行高并发测试时,对数据库的性能影响很大,导致数据库的压力很大,最终也被我们否定了。
第三种方案:使用文件锁实现。当用户抢到一件促销商品后先触发文件锁,防止其他用户进入,该用户抢到促销品后再解开文件锁,放其他用户进行操作。这样可以解决超卖的问题,但是会导致文件得I/O开销很大。
最后我们使用了redis的队列来实现。将要促销的商品数量以队列的方式存入redis中,每当用户抢到一件促销商品则从队列中删除一个数据,确保商品不会超卖。这个操作起来很方便,而且效率极高,最终我们采取这种方式来实现
码规范是对代码质量的规定。在 Laravel 项目中应用编码规范可以提高团队合作的效率,确保代码可读性并促进可维护性。Laravel 提供了一些推荐的编码规范,但最终的编码规范是您可以根据项目需求进行优化的。
Laravel 编码规范的标准
* 文件名和命名
* 代码结构
* 代码逻辑
* 注释
* 测试
文件名和命名
* 使用短命名的变量和函数名称。
* 采用一致的命名惯例。
* 避免使用大写或非标准的命名。
代码结构
* 组织你的代码以提高可读性。
* 建立清晰的目录结构。
* 用命名空间来分组您的代码。
代码逻辑
* 编写清晰易读的代码。
* 避免冗余或不必要的复杂性。
* 使用合乎逻辑的函数名称和注释。
注释
* 在代码中添加详细的注释。
* 确保注释准确且易于理解。
* 不要对简单的代码添加注释。
测试
* 编写广泛的单元测试。
* 确保您的代码覆盖率高。
* 定期检查并更新您的测试。
最佳实践
* 遵守 Laravel 建议的编码规范。
* 定期审查您的编码以确保其符合规范。
* 建立团队编码规范并 遵守它们。
常见问题
* 代码格式化问题:确保您的代码符合 Laravel 的编码规范。
* 命名冲突:确保您的代码中没有重名的变量或函数名。
* 测试覆盖率不足:确保您的测试覆盖您的代码的各个方面。
结论
Laravel 编码规范可以提高团队合作的效率,确保代码的可读性并促进可维护性。通过遵循 Laravel 建议的编码规范,您可以写出高质量的 Laravel 代码。
Laravel 5.6 文档 ] 序言 —— 升级指南,文章转自laravel学院。
预计升级时间:10-30分钟
PHP
Laravel 5.6 需要 PHP 7.1.3 或更高版本。
更新依赖
在 composer.json 中更新 laravel/framework 依赖到 5.6.*,更新 fideloper/proxy 依赖到 ~4.0。
此外,如果你使用下以下官方扩展包,也要升级它们到最新版本:
Dusk (升级到 ~3.0)
Passport (升级到 ~5.0)
Scout (升级到 ~4.0)
当然,不要忘了检查应用所使用的第三方扩展包是否支持 Laravel 5.6,如果需要升级的话也要更新。
Symfony 4
Laravel 底层使用的所有 Symfony 组件都已经升级到 Symfony ~4.0 版本。如果你在应用代码中使用了 Symfony 组件,需要查看 Symfony 更新日志以确认是否需要修改代码。
PHPUnit
需要更新应用的 phpunit/phpunit 依赖到 ~7.0。
数组
Arr::wrap 方法
在 Laravel 5.6 中,传递 null 到 Arr::wrap 方法将会返回空数组。
Artisan
optimize 命令
之前版本中废弃的 optimize 命令已经被彻底移除。由于 PHP 自身的性能优化,optimize 命令已经不能给应用提供显著的性能提升,所以,你需要从 composer.json 文件的 scripts 部分移除 php artisan optimize。
Blade
HTML 实体编码
在之前版本的 Laravel 中,Blade 不会对 HTML 实体进行双重编码。这并不是底层 htmlspecialchars 函数的默认行为,而且会在渲染内容或传递内联 JSON 内容到 JavaScript 框架时导致预期之外的结果。
在 Laravel 5.6 中,Blade 以及辅助函数 e 默认会对特殊字符进行双重编码,从而与 PHP 底层 htmlspecialchars 函数的默认行为保持一致。如果你想要维持不进行双重编码的旧状,可以使用 Blade::withoutDoubleEncoding 方法:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Blade::withoutDoubleEncoding();
}
}缓存
频率限制器 tooManyAttempts 方法
该方法签名中未使用的 $decayMinutes 参数被移除。如果你通过自己的实现重写了该方法,也要从方法签名中移除该参数。
数据库
Morph 列的索引顺序
为了获得更好的性能,迁移方法 morphs 构建的列索引顺序倒过来了,如果你在某个迁移中使用了 morphs 方法,尝试运行该迁移的 down 方法时会报错。如果应用还在开发中,可以使用 migrate:fresh 命令重构数据库结构;如果应用已经上线,需要显式传递索引名称到 morphs 方法。
MigrationRepositoryInterface 新增方法
MigrationRepositoryInterface 中新增了一个 getMigrationsBatches 方法。如果非常不巧你正在自定义该类的实现,需要添加这个方法的实现。你可以以框架的默认实现作为示例。
Eloquent
getDateFormat 方法
getDateFormat 方法的可见性从 protected 调整为 public。
哈希
新配置文件
所有哈希配置现在位于独立的 config/hashing.php 配置文件。你可以拷贝一份默认配置文件到你的应用。大多数情况下,我们都会将 bcrypt 驱动作为默认驱动。不过,也支持 argon。
辅助函数
e
在之前版本的 Laravel 中,Blade (以及辅助函数 e)不会对 HTML 实体进行双重编码。这并不是底层 htmlspecialchars 函数的默认行为,而且会在渲染内容或传递内联 JSON 内容到 JavaScript 框架时导致预期之外的结果。
在 Laravel 5.6 中,Blade 以及辅助函数 e 默认会对特殊字符进行双重编码,从而与 PHP 底层 htmlspecialchars 函数的默认行为保持一致。如果你想要维持不进行双重编码的旧状,可以传递 false 作为第二个参数到 e 函数:
<?php echo e($string, false); ?>
日志
新配置文件
所有的日志配置现在都存放在独立的 config/logging.php 配置文件。你可以拷贝一份默认的配置文件到你的应用然后基于应用需要进行设置。
log 和 log_level 配置项都可以从配置文件 config/app.php 里移除了。
configureMonologUsing 方法
如果你在使用 configureMonologUsing 方法为应用自定义 Monolog 实例,现在需要创建一个 custom 日志频道。更多关于如何创建自定义频道的信息,可以查看完整的日志文档。
日志 Writer 类
Illuminate\Log\Writer 类被重命名为 Illuminate\Log\Logger,如果你在应用的某个类中对这个类进行了显式的类型提示作为依赖注入,需要更新该类的引用为新的类名。或者,作为替代方案,你可以考虑将类型提示调整为标准的 Psr\Log\LoggerInterface 接口。
Illuminate\Contracts\Logging\Log 接口
该接口已经被移除,因为它和 Psr\Log\LoggerInterface 接口完全重合,需要将引用它的地方都调整为 Psr\Log\LoggerInterface 接口。
邮件
withSwiftMessage 回调
在之前版本的 Laravel 中,使用 withSwiftMessage 注册的 Swift 消息自定义回调函数在内容已经被编码并添加到消息后被调用。这些回调现在在内容被添加前调用,从而允许你自定义编码以及其他消息选项。
分页
Bootstrap 4
分页器生成的分页链接现在默认使用 Bootstrap 4,要让分页器生成 Bootstrap 3 链接,需要在 AppServiceProvider 的 boot 方法中调用 Paginator::useBootstrapThree 方法:
<?php
namespace App\Providers;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Paginator::useBootstrapThree();
}
}资源
original 属性
资源响应的 original 属性现在被设置为原始模型而不是 JSON 字符串/数组。这样在测试中就可以更好地检查响应的模型。
路由
返回新创建的模型
从路由中直接返回新创建的 Eloquent 模型时,响应状态码由 200 调整为 201,如果应用的任意相应测试显式期望 200 状态码,那么需要将它们修改为 201。
信任代理
由于信任代码功能使用的底层 Symfony HttpFoundation 有改动,所以必须微调 App\Http\Middleware\TrustProxies中间件。
$headers 属性之前是个数组,现在是一个接收几个不同值的属性。例如,要信任所有转发头,需要像这样更新 $headers 属性:
use Illuminate\Http\Request; /** * The headers that should be used to detect proxies. * * @var string */ protected $headers=Request::HEADER_X_FORWARDED_ALL;
更多关于 $headers 变量值的信息可以查看完整的信任代理文档。
验证
ValidatesWhenResolved 接口
为了避免和 $request->validate() 方法冲突,ValidatesWhenResolved 接口/trait 的 validate 方法被重命名为 validateResolved。
杂项
我们还鼓励你查看 laravel/laravel 代码仓库的更新日志。尽管其中的很多更新不是必须的,但是你可以将应用中的这些文件与代码仓库保持同步。其中的一些更新已经在这篇升级指南中覆盖到了,但是还有很多其他的小更新比如配置文件或注释的微调,就不会一一指出。你可以通过 GitHub 比较工具 轻松查看变更以便选择那些对你而言更为重要的更新。
*请认真填写需求信息,我们会在24小时内与您取得联系。