
PHP
2lovecode
醉心于技术的纯粹人,乐于不断提升带来的成就感,苦于缺失发展方向带来的迷茫感。技术之路枯燥且坎坷,希望能结识更多的同路人和引路人,一起且行且珍惜
展开
-
T0001.数据结构面试题---栈---获取最小值
题目实现一个特殊的栈,在实现栈基本功能的基础上,实现返回栈中最小元素的操作.要求:1.pop,push,getMin操作的时间复杂度为O(1)2.可使用现成的栈结构GitHub源码GitHub源码方案一类文件:MyStack.php示例文件:MyStackExample.php使用两个栈dataStack和minStack.push操作:假设当前压入栈的值为valu...原创 2018-12-26 14:55:04 · 368 阅读 · 0 评论 -
php文件操作-将其他文件的数据添加到本文件中
GitHub源码 其实我们的程序基于下面的问题写的答案:有两个文本文件 A.txt B.txt A.txt 3000万行,userid唯一,userid和username以空格分隔,如下所示: userid username 1 yi 2 er 3 san … … B.txt 3000万行,userid唯一,userid和realn...原创 2018-04-03 18:22:08 · 449 阅读 · 0 评论 -
堆排序php实现
作为一种可以使用数组实现的数据结构,使用php来模拟优先队列(堆排序)还是比较容易的。下面是我们的实现代码,其中insert使用的是上滤,delete使用的是下滤。我们模拟实现了最小堆和最大堆。当然,php的spl库提供了类似的数据结构,它们基于c实现,在时间和空间上应该优于我们直接基于php的实现,大家可以参考下: 最小堆:http://php.net/manual/zh/class.sp...原创 2018-04-09 15:13:43 · 492 阅读 · 0 评论 -
设计模式12.1--状态模式
GitHub源码 这次我们学习的是和策略模式类图相似,但‘意图’大不相同的状态模式。策略模式的意图是通过把行为委托给算法对象实现类的弹性扩展,是类似于继承的类扩展方式,算法类的选择是客户决定的。而状态模式是为了消除类中的if else结构的一种解决方案,内部状态的改变会动态改变状态类的选择。状态模式:允许对象在内部状态改变时,改变它的行为。在示例代码中,我们使用一个简单的售卖机模型进行实...原创 2018-04-08 17:29:11 · 440 阅读 · 0 评论 -
微信公众号开发的测试账号配置
1.首先,你需要一个具有公网IP的域名例如www.demo.com,它的域名解析的IP是123.123.123.1232.在微信公众平台登录你的账号微信公众平台:https://mp.weixin.qq.com进入 开发->开发者工具 页面 点击 公众平台测试账号 如下图所示: 3.配置服务器和js接口安全域名如下图所示: 第一步,配置服务器。点击修...原创 2018-03-21 17:06:07 · 15408 阅读 · 2 评论 -
php中clone语法使用详解
clone的作用是对象复制,但在使用过程中会遇到一些问题,下面我们针对这些问题探讨一番。语法:$cloneObject = clone $object;1.在php中,我们把一个对象赋值给一个变量,实际上是把这个对象的引用赋给变量,他们指向的是同一个对象。当使用这个变量对对象进行操作时,实际上会影响所有指向这个对象的变量。<?phpclass TestA{...原创 2018-02-27 12:45:53 · 737 阅读 · 0 评论 -
使用php实现一个简单的key-value数据库
最近在阅读《php核心技术与最佳实践》,前面的部分只是大体了解了下。不过当读到Hash算法与数据库实现这一章时,文中给出了一个使用php实现一个简单的key-value数据库的实例,这引起了我的兴趣。仔细阅读后觉得不过瘾,所以仿照给出的例子自己实践了一遍,来巩固一下学习的内容,同时加深下对数据的理解。1.文中实现了Hash索引,Hash值的冲突,通过分离链表法实现。 2.实现的索引类型是...原创 2018-02-12 17:39:11 · 2497 阅读 · 0 评论 -
php程序员面试必知基础知识
毕业后一直待到现在的公司,一个地方待久了,容易进入舒适区,看不到自己的不足,斗志也会被消磨。所以,最近闲来无事,趁着晚上的工夫出去面试了几家公司。还别说,事实表明,我对php的一些基础知识理解不深入,掌握不牢靠,也可以说是在开发过程中没有意识到去掌握这些知识。 在这里,我就把自己整理的认为一些比较重要的问题分享到这里,希望对各位同学有帮助。如果有新货的话,我会不定时更新的吆~~~php1...原创 2018-02-09 11:21:09 · 1447 阅读 · 0 评论 -
设计模式6.1-命令模式
命令模式:将请求封装,并把发出请求的对象和处理请求的对象解耦,并支持撤销请求的操作。关键元素:客户,调用者,请求,接收者。在我们的示例中,客户对应Test类,调用者对应Console(控制台),命令对应Command接口的具体实现类,接收者对应Light(灯)和Fan(电风扇)。原创 2018-01-30 09:59:01 · 285 阅读 · 0 评论 -
手撸php框架7.1--构建服务定位器之实现
对于服务定位器的实现,我们直接上代码:1.注册服务,注册服务仅仅将定义数组存入defineMap中,不实例化对象。public function registerService($serviceName, $serviceDefinition){ if (!empty($serviceDefinition)) { if ($this->hasServiceIn原创 2018-02-06 09:40:45 · 415 阅读 · 0 评论 -
手撸php框架5.1--构建Component之对象级别事件实现
1.首先我们需要一个事件类BaseEvent,我们在实现对象级别事件用到它的地方是:在触发时把这个类的实例作为事件处理器的参数传递进去,在同一个事件中的多个事件处理器间,是共享这个实例的。原创 2018-01-29 10:38:28 · 434 阅读 · 0 评论 -
手撸php框架7.0--构建服务定位器之简介
在web开发中,服务定位器模式是一种非常贴合的模式。服务定位器模式目的是为了服务提供者和服务使用者的解耦。在我们的框架中,可以把Component类看做是所有服务的基类。我们把web应用作为一个服务定位器,在web应用中,我们可以动态挂载和删除服务。要实现一个服务定位器,我们必须实现下列功能: 属性: 1.保存服务实例的数据结构:$serviceMap[ 'service原创 2018-02-05 09:05:37 · 452 阅读 · 0 评论 -
遍历目录的非递归实现
在递归计算目录数目,文件数目,目录大小等功能中,我们常用的方式是使用递归来实现。但是,递归实现因为会不断向调用堆栈中存入数据(包括当前执行的状态变量等数据),实际上会大量占用内存空间,同时执行时间也会受到影响。 我们通过一个保存目录路径的队列,可以很优雅地实现非递归的目录遍历,下面我们通过递归统计目录数量的功能给出示例:<?php/*** 非递归方式实现目录数量统计*/$dir原创 2018-02-03 19:11:16 · 895 阅读 · 0 评论 -
php获取文件的最后N行数据
GitHub源码 代码是基于以下问题,给出的解决方案: 用php写一个函数,获取一个文本文件最后$n行内容,要求尽可能效率更高,并可以跨平台使用我理解的可以跨平台使用,是说的文件在windows平台和linux平台的行结束符不一致问题,在代码中我们没有体现这种不同。全部是在linux系统下的代码。跨平台问题还需要理解?<?phpheader("content-type:...原创 2018-04-03 18:25:12 · 1950 阅读 · 1 评论 -
增强版--php实现简单的基于DFA算法的敏感词过滤
之前写过一版的敏感词过滤: 原始版本博客 原始版本GitHub源码但是许多人反馈有问题,仔细检查后,果然发现有问题,所以写了增强版: 增强版GitHub源码&lt;?php/** * 敏感词查找 * * 假设需要查找的敏感词有: * 1.a b c d e * * 注:1的左对齐子集 * 2.a b c * 3.a b...原创 2018-05-11 23:02:46 · 1792 阅读 · 1 评论 -
红黑树实现[PHP]
红黑树的实现GitHub源码class Node{ private $id; /** * @var * 1 => red * 2 => black */ private $color = 1; private $value = null; public $parent = 0; ...原创 2018-10-18 18:48:57 · 1196 阅读 · 0 评论 -
跳跃表实现[PHP]
跳跃表的简单实现,参考redis跳跃表实现GitHub源码class Node{ private $id; public $value; public $level; public $forward = []; public function __construct($value, $level) { $this->id...原创 2018-09-26 18:19:18 · 901 阅读 · 0 评论 -
桶排序[PHP]
桶排序 GitHub源码计算序列最小值min, 最大值max根据min, max和指定的需要构造的桶的数量n,计算每个桶的区间:range = ceil(max - min + 1)遍历序列,将序列中的值分布到各个桶中: 桶标号从0开始, (value - min) / range每个桶独立排序将结果输出例如对于序列 5, 4, 10, 30, 20, 15, 36min...原创 2018-09-15 10:51:43 · 432 阅读 · 0 评论 -
计数排序[PHP]
计数排序 GitHub源码获取序列中的最小值min和最大值max O(n)统计min - max之间所有值在序列中的出现次数 O(n)顺序输出min - max的所有值,次数为0不输出,其余次数为多少就输出多少 O(k) k为数据范围例如序列为: 2, 4, 6, 9, 4, 8min = 2, max = 9, n为6,k为8统计出现次数为 [2 => 1, 3 ...原创 2018-09-15 10:48:20 · 345 阅读 · 0 评论 -
B+树简单实现(PHP)
GitHub源码 原理参考此链接 下面是一些实现细节: 1. 注意 - 叶节点包含所有的索引和数据 - 只有叶节点才会持有具体数据,非叶节点只有索引 - 叶节点之间连接成一个链表,便于范围查询 2. 树节点结构 BTNode { id : 标识节点对象的唯一值 parent : 父节点的ID值 isLeaf : 是否是叶节点 indexNum : 当...原创 2018-09-04 19:45:50 · 1640 阅读 · 0 评论 -
B-Tree的简单实现(PHP)
B-Tree的简单实现: GitHub源码地址 注: B-Tree的原理介绍在这里就不赘述了,相信其它博客会讲的更透彻。我们主要关注实现过程的细节问题。 以下条目对应的代码实现会在代码中标出,例如第3条对应的代码中的位置标识为[3] 代码最后写了2个调试使用的代码,可能对理解实现过程和逻辑结构有帮助。B-Tree单个节点的结构是: BTNode { id...原创 2018-09-01 21:04:28 · 1197 阅读 · 0 评论 -
Laravel框架MiddleWare实现原理demo
根据Laravel框架中间件的实现机制,写的一个实现demo。 GitHub源码 - 关键在于PipeLine类的then方法: - 其中最关键的是array_reduce(array,array,array, callback, init)函数,−此函数会对array中的每个值应用init)函数,−此函数会对array中的每个值应用init)函数, - 此函数会对array中的每个值应...原创 2018-08-24 15:28:09 · 547 阅读 · 0 评论 -
仿redis的HyperLogLog数据结构
对于网站的UV计数来说,使用集合这种数据结构是可以满足的,但是使用集合会带来占用空间过大的问题。一旦数据量增大,它的某些统计特性就会涌现。HyperLogLog就是应用了大数据量的统计特性(随机次数和随机数二进制最大尾部0个数之间的关系),实现的数据量估计。 GitHub源码若想有更深入的理解,可以参考《Redis 深度历险:核心原理与应用实践》这本书,我想比我理解的更深入一些。cl...原创 2018-08-24 15:20:10 · 479 阅读 · 0 评论 -
php框架容器实现(DI)的一般方式
文章最后有一个简单的容器实现示例和使用示例,可以参考理解,对应的github源码:GitHub源码一个仿照yii2框架容器实现的代码示例:GitHub源码 ,其中register方法对应set方法,resolve方法对应set方法 或 GitHub源码一个摘自laravel框架容器实现和使用示例:GitHub源码psr-11容器GitHub地址规范1.容器类一般有get和set方...原创 2018-08-01 15:55:49 · 1769 阅读 · 0 评论 -
AWS监控SNS服务的两种方案(每日使用量和Cloud Watch)
方案一. 配置使用sns的每日使用量报告: 订阅每日使用量报告,可在控制台操作配置。 参考:https://docs.aws.amazon.com/zh_cn/sns/latest/dg/sms_stats_usage.html 1.为每日报告形成的csv文件创建s3的一个bucket 2.sms使用量报告订阅到bucket 3.在s3的指定bucket中获取csv文件 4.解析cs...原创 2018-08-01 10:47:12 · 1898 阅读 · 2 评论 -
Laravel框架的依赖注入容器(DI容器)使用示例
GitHub源码地址摘取的Laravel框架中,Container的实现代码,并参考Laravel中关于容器的使用手册,写的一个容器使用示例。 详情请移步:GitHub原创 2018-07-30 21:17:11 · 816 阅读 · 0 评论 -
使用yii2框架的ActiveRecord::find()->one()方法,出现Allowed memory exhausted错误
简介在使用yii2框架的活动记录的find()->one()方法时,系统报Allowed memory exhausted错误,也就是内存枯竭错误。当时想,框架的one()方法,只取一条数据,怎么会把内存占用满了?所幸经过各种尝试,解决了这个问题。场景:1.数据库:Mysql 2.有一个数据库表Demo,数据表结构: id name age 1...原创 2018-06-14 19:36:10 · 1577 阅读 · 1 评论 -
布隆过滤器(Bloom Filter)简单实现
参考文献: https://my.oschina.net/kiwivip/blog/133498 https://blog.youkuaiyun.com/jiaomeng/article/details/1495500 https://blog.youkuaiyun.com/hguisu/article/details/7866173 文献中探讨了布隆过滤器的原理和应用场景,以及一些实际应用场景中的增强方...原创 2018-06-13 19:37:22 · 1998 阅读 · 0 评论 -
手撸php框架6.1--构建DI容器之实现
1)首先利用php的反射类ReflectionClass,构造类A的反射对象。 2)然后利用反射对象的getConstructor方原创 2018-02-03 19:00:08 · 494 阅读 · 0 评论 -
设计模式1.1-策略模式(no setter)
策略模式:定义一个算法族(继承/实现的同一个抽象类/接口),同一族的算法(具体的类)可以相互替换,算法的改变不影响客户的使用。没有setter的策略模式,直接在构造方法中指定算法。原创 2018-01-10 10:57:42 · 247 阅读 · 0 评论 -
手撸php框架1.0--将项目提交到packgist
各位看官,作为程序员,分享自己的代码供其它同行使用,评价和完善,想必是一件很幸福的事。所以嘞,咱们要把项目提交到packgist,这样其他人就可以通过composer安装我们的框架了,是不是很酷?我们的项目是托管到github上的,怎么在github上创建仓库,提交代码,我在这里就不赘述了。我们重点看下怎么把github的项目关联到packgist上。1.初始化项目 在项目根目录下执行c原创 2018-01-21 20:59:43 · 351 阅读 · 0 评论 -
手撸php框架0.0--简介
自工作伊始,我的开发工作都是使用的Yii2.0框架。眼见工作快两年了,回头一看,自己竟然从php工程师混成了“Yii2.0框架师”,php基础知识基本忘的差不多。去年下半年,我和我们项目组的一个大牛,使用设计模式中的状态模式完成了整个项目中订单流程的重构。原创 2018-01-21 20:58:26 · 416 阅读 · 0 评论 -
php大文件快速读写的实现
使用php的标准库类SplFileObject,实现大文件的读写。因为一次请求有一定的生命周期,所以必须要在请求超时之前完成当前处理。其中,大文件的读取和写入会严重影响处理时间,因此php提供了对于大文件进行操作的面向对象的标准库类SplFileObject,完成相应的处理。原创 2017-12-28 18:12:07 · 3095 阅读 · 0 评论 -
设计模式3.1-装饰者模式
装饰者模式:动态地将责任附加到对象上在装饰者模式中,装饰者和被装饰者继承自同一个类。装饰者会持有一个被装饰者的对象,在方法中通过在调用被装饰者相应方法的前后添加自己的逻辑,从而达到添加功能的目的。装饰者模式提供了一种类似于继承的另一种扩展方式 在此示例中,具体Human和HumanDecorator同属Human抽象类。原创 2018-01-12 09:50:31 · 240 阅读 · 0 评论 -
PageRank的php简单实现
php简单实现PageRank算法原创 2017-12-25 18:11:11 · 500 阅读 · 0 评论 -
php实现简单的基于DFA算法的敏感词过滤
最近一个学Go语言朋友,给我发了一篇文章http://blog.youkuaiyun.com/chenssy/article/details/26961957,讲的是使用DFA(即Deterministic Finite Automaton,有穷自动机)算法实现敏感词的过滤。问我能不能使用php来实现,感谢chenssy大大的精彩文章,下面是我仿照版本的php实现。原创 2017-12-13 22:58:32 · 5007 阅读 · 1 评论 -
基数排序(php版)
最近看到了一个有趣的排序方法—基数排序法。直观的感觉中,冒泡排序简单直接,快速排序精巧晦涩;而基数排序不多不少,刚刚好!先简单介绍下具体流程: 示例:[20, 67, 123, 111, 2, 34, 1, 78, 0, 33, 11, 15, 83] 1.设置0-9,共10个桶,先按个位数作为标号分别放入桶中2.按0-9,同一个桶数据先后的顺序拿出形成一个新数组3.新数组,按十位数作为标号分别原创 2017-11-28 15:29:38 · 517 阅读 · 0 评论 -
Yii2.0中model的validator生成和运行浅析
1.使用方式2.运行机制原创 2017-10-16 14:14:00 · 2434 阅读 · 0 评论 -
Yii2.0的GridView使用和原理浅析
一.使用方式二.原理解析原创 2017-10-12 15:59:37 · 1076 阅读 · 0 评论 -
Yii2.0的ActionFilter类详细解读
1.涉及的属性和方法2.使用方式3.运行机制解析4.总结原创 2017-09-28 13:18:11 · 1851 阅读 · 0 评论