面包屑思维模型实战模型错题集结构手册流程手册自我检测专题模块
-
微信小程序前端微信小程序前端易错点收集查看
-
css/less/sass样式控制在开发过程中的一些样式控制bug规避查看
-
tp5开发小程序tp5开发小程序时错误积累查看
-
PHP错题集PHP在实际开发过程中遇到的问题查看
-
MySql数据库使用MySql在实际开发中遇到的错误总结查看
-
TP5错题集积累tp5框架在实际开发过程中遇到的问题查看
-
uni-app爬坑主要用于uni-app项目中遇到的一些问题查看
-
Vue.js易错收集vue.js项目常见错误收集整理查看
-
uni-app开发微信小程序uni-app开发微信小程序的一些爬坑积累查看
-
LinuxLinux在部署、开发、运维时遇见的错误积累查看
-
安全设计常见安全设计查看
-
Redis项目中使用redis的相关错误积累查看
-
前端特效前端特效相关错题集查看
最新博文
-
原型、原型链
软件开发prototype :每个函数对象都会有prototype,普通对象是没有这个属性的(这里为什么说普通对象呢,因为JS里面,一切皆为对象,所以这里的普通对象不包括函数对象)。它是构造函数的原型对象;
_ proto _ :每个对象都有这个属性,它指向它的构造函数的原型对象;
constructor :这是原型对象上的一个指向构造函数的属性。
每个实例原型都有一个 constructor 属性指向关联的构造函数。
在实例化的时候,prototype上的属性会作为原型对象赋值给实例。每个函数(函数对象)都有一个prototype(原型)属性这个属性都有一个指针,指向一个对象,这个对象包含由特定类型所有实例共享的属性和方法。使用原型的好处是:可以让所有对象实例共享它包含的方法和属性,可以通过in操作符和hasOwnProperty来判断给定属性是来自于原型还是实例,in- true 代表属性在对象中存在来自实例或者来自原型,hasOwnProperty- true代表属性来自于实例 是实例属性
原型链是JavaScript实现继承的重要方式,原型链的形成是真正是靠proto 而非prototype,实例与原型之间的链条,这就是原型链
函数对象 和 普通对象 都有 proto这个属性。
prototype 和_ proto _都是在创建一个函数或者对象会自动生成的属性。构造函数的 prototype 指向原型对象,原型对象有一个 constructor 属性指回构造函数,每个构造函数生成的实例对象都有一个 proto 属性,这个属性指向原型对象。
所有的实例的_ proto _都指向该构造函数的原型对象(prototype)。
所有的函数(包括构造函数)是Function的实例,所以所有函数的 _ proto _的都指向Function的原型对象。
所有的原型对象(包括 Function的原型对象)都是Object的实例,所以 _ proto _都指向 Object(构造函数)的原型对象。而Object构造函数的 _ proto _指向 null。
Function构造函数本身就是Function的实例,所以 _ proto _指向Function的原型对象。
阅读更多风口下的猪2020-02-04【软件开发】
-
GRASP面向对象设计
软件开发通用职责分配软件模式(General Responsibility Assignment Software Patterns,GRASP),面向对象的设计原则,与SOLID设计原则无关,与GoF设计模式也不太相同,GRASP更像是一个设计思想,是在面向对象设计过程中起指导的作用,是长期面向对象编程过程中经过验证且标准的最佳实践,可以说我们通常所说的设计模式是基于GRASP的。
GRASP告诉我们怎样设计问题空间中的类与分配它们的行为职责,以及明确类之间的相互关系等,下面简单介绍下GRASP的九个原则:
1.信息专家原则(information expert)
信息专家原则主要用于表明何处委派职责,职责的委派可以是一个方法,字段等。
分配职责的原则:查看给定的职责,确定履行职责所需要的信息,然后确定信息的位置并将其职责分配给它。也就是,将职责分配给拥有履行一个职责所必需所有信息的类。
2.创造者原则(creator)
创建对象是面向对象系统中最常见的活动之一。创建者原则表明对象的创建应该由哪个类负责创建的原则,如果A和B之间符合下面的规则,则表明A的创建可以分配给B:
- 实例B包含实例A或者实例B聚合实例A
- 实例B记录实例A
- 实例B频繁使用实例A
- 实例B拥有实例A初始化的全部信息并且在创建的过程中把这些信息传递给A
3.低耦合原则(low coupling)
耦合是衡量一个元素与其他元素的连接,或依赖其他元素的强弱程度。低耦合是一种评估模式,决定了如何将责任的分配
低耦合设计:
- 类与类之间的依赖尽可能要降到最小
- 修改一个类对其他类的影响应该是无影响或者要把影响降到最小
- 提高系统的复用性
4.高内聚原则(high cohesion)
高内聚是衡量对象保持适当的集中,可管理和可理解的程度,低耦合通常需要高内聚的支持。
高内聚意味着特定元素的职责是强相关且高度集中的,为了实现高内聚通常做法就是类的划分和子系统的划分,若是划分的元素低内聚也就是职责不明确,那么使用者将会难以理解,程序也难以复用,难以维护。
5.控制器原则(controller)
控制器模式是通过控制器(Controller)将系统事件或者一类用例分配给对应职责的对象,这个对象可以是类或模块或子系统,控制器不与UI进行交互,它只负责系统事件的调配。
基于用例的控制器应该负责处理该类别的所有用例,并且是支持多用例的(如,用户相关的用例,新增用户和修改用户等应该统一交给用户控制器处理)
虽然控制器不与UI交互,但控制器通常用于UI层之外的第一层,也就是我们经常使用的MVC软件架构种的
C
层(即控制器层),控制器层起组织协调的作用,负责事件的分发委派并返回处理结果。6.多态性原则(polymorphism)
多态性原则即面向对象的三大特征之一,指的是不同的类型实现统一的接口,使在系统运行期间相同消息发送给不同类型的实例而会有不同行为。
在具有多态性的场景下应该使用多态性操作,而不应该使用具体某个类型(如表现在Java中就是使用接口编程,即IOP)
7.纯虚构(pure Fabrication)
纯虚构是指一个不代表处理某个问题领域的类,专门用于实现
高内聚低耦合
,提高复用性,这总类在领域驱动设计中被称为服务(Service)。为了实现
高内聚
类通常根据功能被划分称为功能集中的类,而这种划分导致使用方需要更多的类从而提高了耦合度,这与低耦合相矛盾,而通过纯虚构可以构造出"虚构类",这种类不是针对某个问题,而是某些能力/功能的抽象划分。(实际使用中例如我们通常使用的分层系统,数据库访问层就属于纯虚构的一种实现)8.中介原则(Indirection)
中介模式是指通过一个
中介
来实现两个对象之间的交互实现低耦合。其目的是为了避免两个对象之间产生直接耦合,降低对象之间的耦合度。同样的,在MVC设计模式中,控制器(Controller)起到的作用就是作为中介连接其数据模型(Model)与视图(View)
9.受保护变量原则(protected Variations)
与开闭原则类似,通过使用接口封装系统中存在的不稳定点,并且使用多态操作来使用此接口,从而避免不稳定点影响其他对象(类,模块,子系统等)
阅读更多风口下的猪2020-02-04【软件开发】
-
S.O.L.I.D设计原则
软件开发#单一职责原则(Single responsibility principle)
一个类或则一个模块应当只有一种职责,其提供的服务应该与其责任保持一致,如果存在多种责任则应考虑对其拆分。
#开闭原则(Open/closed principle, OCP, Open for extension, close for modification)
软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的
开闭原则主要思想就是对于扩展的包含,对于修改的限制,新增功能的同时避免修改已有的实现,尽量做到对外提供的功能不变
#里氏替换原则(Liskov substitution principle)
程序中的对象应该是可以在不改变程序正确性的前提下被它的子类所替换的
里氏替换原则认为子类的功能应该可以完全替换父类并且不会影响程序的正确性,简单理解就是子类在继承父类的同时不能改变父类已有的功能,加上开闭原则子类只能对父类进行扩展而不能对父类的功能进行修改。
#接口隔离原则(Interface segregation principle,ISP)
多个特定功能接口要好于一个宽泛用途的接口
接口隔离强调将大而全的接口拆分成小而精的接口,使用方只需关系自己需要的接口,通过接口隔离有利于系统的解耦,增加程序的易用性和拓展性。
#依赖反转原则(Dependency inversion principle,DIP)
1.高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口</br>
2.抽象接口不应该依赖于具体实现。而具体实现则应该依赖于抽象接口依赖反转原则是指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象。
阅读更多风口下的猪2020-02-04【软件开发】
-
面向对象编程解决的问题
软件开发面向对象思想早在20世纪50年代末和60年代初就已经被提出,第一个真正实现面向对象的语言Smalltalk,也就在20世纪70年代出现;面向对象的提出就是为了提高软件的重用性、灵活性和扩展性。
早期的编程范式就是过程式编程,因为计算机运行的时候就是一行一行指令执行,所以传统的编程方式就是把程序看成一系列函数的集合,或者直接向机器发出指令(如,汇编语言),这就是面向过程的编程。而随着计算机的发展,以及过程式编程暴露出来的问题,如无法复用,不灵活,不符合人类的思维方式等等,这就是面向对象思想产生的原因,人们希望编程是更加灵活更加符合人类思维方式的,面向对象编程本质可以看成是由各种独立而互相调用的对象组成的程序,而且事实证明,面向对象确实比过程式更加灵活,更加容易维护。
由于面向对象的各种特点,使得面向对象编程更加容易学习,是复杂的问题简单化,是程序更加便于分析、设计和理解。
面向对象编程,实际上是为了迎合软件项目开发过程中的模块化多人开发、项目节点控制、版本升级、维护便利等场景需求。
阅读更多风口下的猪2020-02-04【软件开发】
-
面向对象特征
软件开发对象的四大特征分别是:封装、继承、多态、抽象。
但面向对象编程的特征则是:封装、继承、多态。而抽象、组合,则是面向对象编程的一个结果现象。
- 封装(Encapsulation)
通过对象隐藏程序的具体实现细节,将数据与操作包装在一起,对象与对象之间通过消息传递机制实现互相通信(方法调用),具体的表现就是通过提供访问接口实现消息的传入传出。
封装常常会通过控制访问权限来控制对象之间的互访权限,常见的访问权限:公有(
public
),私有(private
),保护(protected
)。某些语言可能还会提供更加具体的访问控制,如,Java的package
。封装的意义:由于封装隐藏了具体的实现,如果实现的改变或升级对于使用方而言是无感知的,提高程序的可维护性;而且封装鼓励程序员把特定数据与对数据操作的功能打包在一起,有利于应用程序的
去耦
。- 继承(Inheritance)
支持类的语言基本都支持继承,继承即类之间可以继承,通过继承得到的类称为子类,被继承的类为父类,子类相对于父类更加具体化。
子类具有自己特有的属性和方法,并且子类使用父类的方法也可以覆盖(重写)父类方法,在某些语言中还支持多继承,但是也带来了覆盖的复杂性。
继承的意义:继承是代码复用的基础机制
- 多态(Polymorphism)
多态发生在运行期间,即子类型多态,指的是子类型是一种多态的形式,不同类型的对象实体有统一接口,相同的消息给予不同的对象会引发不同的动作。
多态的意义:提供了编程的灵活性,简化了类层次结构外部的代码,使编程更加注重
关注点分离
(Separation of concerns,SoC)- 抽象(Abstraction)
能够把复杂问题通过抽象简单化,可以为具体问题找到最恰当的类定义,并且可以在最恰当的继承级别解释问题。
- 组合(Composition)
对象可以在其实例变量中包含其他对象
阅读更多风口下的猪2020-02-04【软件开发】
-
面向对象编程简介
软件开发面向对象编程(Object-oriented Programming,缩写:OOP)是软件工程中一种具有对象
概念的编程范式(Programming Paradigm),同时也是一种程序开发的抽象方针,与之对应的编程范式还有:函数式编程(Functional Programming);过程式编程(Procedural Programming);响应式编程(Reactive Programming)等。面向对象编程特点
(1)一切皆为对象
在面向对象编程世界里,一切皆为对象,对象是程序的基本单元,对象把程序与数据封装起来提供对外访问的能力,提高软件的重用性,灵活性和扩展性。例如,Java中的
java.lang.Object
对象,可以表示Java中的一切对象(注意区分8种基本数据类型)。在面向对象编程中,通常把对象的数据(字段)称为
属性
,把对象的行为称为方法
。(2)对象与类
在面向对象编程中,最常见的表现就是基于
类(Class)
来表现的,每一个对象实例都有具体的类,即对象的类型。使用类的面向对象编程也称为基于类的编程(Class-based programming)
,如常见的Java,C++;而与之类似的有基于原型的编程(Prototype-based programming)
,如JavaScript。- 类:定义对象的数据格式(属性类型)和可用过程(方法),同时也可能包含类成员的数据(如,常量)和过程(如,静态方法),类其实就是对象的类型/原型(prototype)。
- 对象:类的实例,通过类实例化出来的具体实例。
如,Java中
Object obj = new Object();
,其中Object
就是类,而obj
就是具体对象实例。
阅读更多风口下的猪2020-02-04【软件开发】
-
后端创建一个websocket协议的接口,则客户端socket实例中,url的scheme必须为ws或wss
socket后端创建一个websocket协议的接口,则客户端socket实例中,url的scheme必须为ws或wss
阅读更多风口下的猪2020-02-03【socket】
-
在workerman开发中遇到的问题与解决方法
socket1 workerman无法正常访问
问题描述:在阿里云ECS上部署了workerman的应用(ECS是专有网络),在ECS安全组里已经允许workerman需要的全部端口,但是外网一直不能正常打开(注,其他服务,比80端口外部是可以用访问的)。telnet连接显示“No route to host”,而且我是关闭了centos7的firewalld防火墙的,这让我很困惑。
问题原因:
因为对centos7了解不多,关闭firewalld.service后,并没有关闭iptable.service导致的。
解决问题:
1、安全组入方向,设置workerman 的端口范围;
2、关闭firewalld防火墙和修改/etc/sysconfig/iptables规则。
2 workerman 不能关闭怎么办
问题描述:启动脚本里执行Worker::stopAll()并不能停止workerman,Worker::stopAll()只有在运行workerman的主进程里执行才有效,外部其它进程执行没有效果。
停止Workerman的流程是
1、找到Workerman主进程pid
2、给pid发送SIGINT信号(posix_kill(SIGINT, pid))
3、workerman主进程收到SIGINT信号后自身执行Worker::stopAll()完成服务停止。
这三个步骤workerman内部应封装好,调用流程是
1、设置$argv = 'stop';
2、运行Worker::runAll();
3 workerman无法使用怎么办
问题描述:启动后报错类似如下:php start.php start
PHP Warning: stream_socket_server(): unable to connect to tcp://xx.xx.xx.xx:xxxx (Address already in use)
in ...workerman/Worker.php on line xxxx
关键字:Address already in use
失败原因:端口被占用,无法启动。
可以通过命令netstat -anp | grep 端口号来找出哪个程序占用了端口。然后停止对应的程序释放端口解决。
如果不能停止对应端口的程序,可以通过更换workerman的端口解决。
如果是Workerman占用的端口,又无法通过stop命令停止(一般是丢失pid文件或者主进程被开发者kill了导致),可以通过运行以下两个命令杀死Workerman进程。
kill all php
ps aux|grep WorkerMan|awk '{print $2}'|xargs kill -9
如果确实没有程序监听这个端口,那么可能是开发者在workerman里设置了两个或两个以上的监听,并且监听的端口相同导致,请开发者自行检查启动脚本是否监听了相同的端口。
现象2
启动后报错类似如下:
PHP Warning: stream_socket_server(): unable to connect to tcp://xx.xx.xx.xx:xxx (Cannot assign requested address) in ...
workerman/Worker.php on line xxxx
或者
PHP Warning: stream_socket_server(): unable to connect to tcp://xx.xx.xx.xx:xxxx (在其上下文中,该请求的地址无效)
in ...workerman/Worker.php on line xxxx
关键字:Cannot assign requested address或者该请求的地址无效
失败原因:
启动脚本监听ip参数写错,不是本机ip,请填写本机ip机或者填写 0.0.0.0(表示监听本机所有ip)即可解决。
提示:Linux系统可以通过命令 ifconfig查看本机所有网卡ip。
如果您是云服务器(阿里云/腾讯云等)用户,注意您的公网ip实际可能是个代理ip(例如阿里云的专有网络),公网ip并不属于当前的服务器,所以无法通过公网ip监听。虽然不能用公网ip监听,但是仍然可以通过0.0.0.0来绑定。
现象3
Waring stream_socket_server has been disabled for security reasons in ...
失败原因:
stream_socket_server 函数被php.ini禁用
解决方法
1、运行php --ini 找到php.ini文件
2、打开php.ini找到disable_functions一项,将stream_socket_server禁用项删掉
现象4
PHP Warning: stream_socket_server(): unable to connect to tcp://0.0.0.0:xxx (Permission denied)
失败原因
linux下监听端口如果小于1024,需要root权限。
解决办法
使用大于1024的端口或者使用root用户启动服务。
4 workerman可以一直运行么
workerman可以一直运行,以daemon(守护进程)方式启动workerman即可后台一直运行。
启动停止workerman:
启动
以debug(调试)方式启动
php start.php start
以daemon(守护进程)方式启动
php start.php start -d
停止
php start.php stop
重启
php start.php restart
平滑重启
php start.php reload
查看状态
php start.php status
debug和daemon方式区别:
1、以debug方式启动,代码中echo、var_dump、print等打印函数会直接输出在终端。
2、以daemon方式启动,代码中echo、var_dump、print等打印会默认重定向到/dev/null文件,可以通过设置Worker::$stdoutFile = '/your/path/file';来设置这个文件路径。
3、以debug方式启动,终端关闭后workerman会随之关闭并退出。
4、以daemon方式启动,终端关闭后workerman继续后台正常运行。
5 workerman无法socket怎么办
Workerman是一款纯PHP开发的开源高性能的PHP socket 服务器框架。被广泛的用于手机app、手游服务端、网络游戏服务器、聊天室服务器、硬件通讯服务器、智能家居、车联网、物联网等领域的开发。但是在配置workerman情况下,不免有些意想不到的错误,下面小编整理网上资料并整合自身遇到的问题,给出以下几种常用的解决方案。
问题描述:
现象1
启动后报错类似如下:
php start.php start
PHP Warning: stream_socket_server(): unable to connect totcp://xx.xx.xx.xx:xxxx (Address already in use)
in /home/workerman-chat/Workerman/Worker.php on line xxxx
关键字:Address already in use
失败原因:端口被占用,无法启动。
可以通过命令netstat -anp | grep 端口号来找出哪个程序占用了端口。
然后停止对应的程序释放端口解决。
如果不能停止对应端口的程序,可以通过更换workerman的端口解决。
如果是Workerman占用的端口,又无法通过stop命令停止(一般是丢失pid文件或者主进程被开发者kill了导致),可以通过运行以下两个命令杀死Workerman进程。
`kill all php
ps aux|grep WorkerMan|awk '{print $2}'|xargs kill -9`
现象2
启动后报错类似如下:
PHP Warning: stream_socket_server(): unable to connect to tcp://xx.xx.xx.xx:xxx (Cannot assign requested address)
in /home/GatewayWorker/Workerman/Worker.php on line xxxx
关键字:Cannot assign requested address
失败原因:
启动脚本ip参数写错,不是本机ip,请填写本机ip机或者填写 0.0.0.0(表示监听本机所有ip)即可解决。
提示:Linux系统可以通过命令 ifconfig查看本机所有网卡ip。
如果您是腾讯云用户,注意您的公网ip实际是代理服务器ip,公网ip并不属于你的服务器,所以无法通过公网ip绑定,但是可以通过0.0.0.0来绑定。
现象3
启动后报错类似如下:
Waring stream_socket_server has been disabled **for**security reasons in...
失败原因:
stream_socket_server 函数被php.ini禁用
解决方法
1、运行php --ini 找到php.ini文件
2、打开php.ini找到disable_functions一项,将stream_socket_server禁用项删掉
现象4
启动后报错类似如下:
PHP Warning: stream_socket_server(): unable to connect to tcp://0.0.0.0:xxx (Permission denied)
失败原因
linux下监听端口如果小于1024,需要root权限。
解决办法
使用大于1024的端口或者使用root用户启动服务。
现象5
启动后报错类似如下:
WebSocket connection to 'ws://x.x.x.x:2346/'failed:
Error in connection establishment:net::ERR_NAME_NOT_TIMED_OUT
失败原因
服务器防火墙挡住了设置的端口,这里于2346为例。
解决办法
进入Linux vim编辑服务器防火墙文件,添加你需要开发的服务器端口保存后重启防火墙。
[root@iZwz9xxxxxxxxxxxxxxxxxx conf]# iptables -nvl #查看允许访问的端口
[root@iZwz9xxxxxxxxxxxxxxxxxx conf]# vim /etc/sysconfig/iptables #编辑
[root@iZwz9xxxxxxxxxxxxxxxxxx conf]# /etc/init.d/iptables restart #重启
6 workerman无法监听怎么办
问题描述:根据手册一步一步走下来,但是发现在启动监听的时候,发生了错误:
[thinkexceptionThrowableError]
Fatal error: Call to undefined **function**WorkermanLibpcntl_signal()
本地运行环境:win10+php7,已经用composer下载了workerman-for-win了
解决办法:
如果是在windows下面composer安装的话,在文档第一步
composer **require**topthink/think-worker
的时候,它还会顺带下载workerman/workerman,但是因为是在windows下面运行,所以要删除掉workerman/workerman,再进行下一步。
workerman/workerman-**for**-win
这时,你再启动监听就可以了!
————————————————
原文链接:https://blog.csdn.net/qq_43162613/article/details/103963859
阅读更多风口下的猪2020-02-03【socket】
-
workerman的在Windows下与Linux下区别
socket1、win版本count属性无效,全部为单进程
2、不支持start stop reload restart status命令
3、cmd命令行启动,后面可接多个文件,例如 php start_web.php start_gateway.php start_worker.php
4、无法守护进程,cmd窗口关掉后服务即停止
5、每个启动文件只能实例化一个容器(Worker/WebServer/Gateway/BusinessWorker),需要实例化多个容器时
需要拆成多个文件,例如 start_web.php start_gateway.php start_worker.php 分别初始化web gateway worker
阅读更多风口下的猪2020-02-03【socket】
-
支付宝当面付,没有同步回调
支付支付宝当面付-扫码支付没有同步回调,也就是说支付完成后不能页面跳转。
在实际项目开发中,为了较好的交互性,肯定是要给客户端返回支付成功的消息。扫码付款没有同步回调,但是有异步回调,异步回调接口在验证请求端是支付宝官方后,更改数据库订单相关信息,这就回到了处理订单消息那套上去了。两个方法:
(1)二维码支付页面,开启ajax轮询数据库,将消息返回给客户端;(不推荐)
(2)服务器端使用websocket。
阅读更多风口下的猪2020-02-02【支付】
-
使用支付宝当面付PHP-SKD-DEMO包调用返回“商户门店编号无效”解决
支付这几行注释掉或者删除掉就可以了
$storeId = "test_store_id"; $alipayStoreId= "test_alipay_store_id"; $providerId = ""; $extendParams = new ExtendParams(); $extendParams->setSysServiceProviderId($providerId); $extendParamsArr = $extendParams->getExtendParams();
阅读更多风口下的猪2020-02-02【支付】