Lin Blog

林柏格


  • 首页

  • 关于

  • 标签

  • 分类

  • 搜索

关于JS的MVVM实现

发表于 2017-01-15 | 更新于 2019-09-30 | 分类于 求索

过去Web应用的常用开发模式是MVC,前端后台并在一起开发。随着JavaScript语言的发展,前端能做的越来越多,Web应用开发也趋向了“前后端分离”。前后端分离并不是什么新概念,实质是Web应用从B/S(浏览器/服务器)结构向C/S(客户端/服务端)结构转变 。分离后,前端就自成一个系统,大家开始探讨前端的开发模式,而其中MVVM模式备受推崇。

MVVM

MVVM,即Model-View-ViewModel,是从MVC衍生出来的开发模式。MVVM模式用ViewModel替代了Controller,ViewModel就像是Model和View之间的桥梁——数据模型通过ViewModel展示在视图中,当视图发生变化,可以通过ViewModel来触发数据更改;而数据的更改,也可以通过ViewModel来触发View变化,示意图:

MVVM

阅读全文 »

关于封装第三方类库

发表于 2017-01-07 | 更新于 2019-09-30 | 分类于 求索

在写《jQuery Ajax的封装》的时候,突然想到一些东西,于是就试着写下来……

控制反转

学习Laravel时,不可避免地一定要研究“控制反转”。
这里并不详细介绍“控制反转”,只是简单阐述一些其主要思想。
控制反转,是一种编程思想,通过“依赖注入”和“依赖查找”实现依赖倒置。本来一个实体,其控制权主要在其所依赖的其他实体身上,如果反转了这种关系,那么控制权就回到实体自己身上,实际上就是减弱对其他实体的依赖性(就是解耦吧)。
控制反转,也是一种设计模式。按照控制反转模式来编程,模块定义的步骤会变得繁杂,但是模块调用还是简便的;模块与模块之间的依赖性减弱,如果后期某个模块有所改动,对于其他模块的影响并不大。

阅读全文 »

PHP中的abstract、interface和trait

发表于 2016-12-30 | 更新于 2019-09-30 | 分类于 知道

面向对象编程,有几个重要特征:继承性,抽象性,多态性等等。这里针对PHP语言,讨论一下abstract、interface和trait,其他语言可能有偏差。

abstract

抽象类

在面向对象的概念中,所有的对象都是通过类来描绘的。具体类是实例对象的抽象化,而 抽象类 则是具体类的抽象化。
定义一个具体类,使用关键字class;定义一个抽象类,要带上关键字abstract,即abstract class。PHP语言的机制比较宽松,抽象类可以继承于其他抽象类,也可以继承于具体类,但是抽象类没有直接的实例化对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
abstract class AbstractClass1
{
// 强制要求子类定义这些方法
abstract protected function getValue();
abstract protected function prefixValue($prefix);

// 普通方法(非抽象方法)
public function printOut() {
print $this->getValue() . "\n";
}
}

class ConcreteClass1 extends AbstractClass1
{
protected function getValue() {
return "ConcreteClass1";
}

public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}

abstract class AbstractClass2 extends ConcreteClass1
{

}
阅读全文 »

Windows上编译PHP

发表于 2016-12-12 | 更新于 2019-09-30 | 分类于 躬行

平时在Windows系统上做PHP开发,都是直接使用WAMP的继承环境。最近需要用到一个PHP扩展,也没找到现成的DLL文件,于是想着自己编译一个。首先,需要安装一个Visual Studio

Visual Studio

上大学的时候,老师教我们用 VC6.0 ,我就在自己电脑上装了个 Visual Studio 2010*,功能全选,占了好十几GB空间,然后就没怎么用了,看来只是想体验一下进度条的优雅。后来用上了 *Sublime ,以为此生足矣,没想到今天还是要求 Visual Studio 2015, 不愧为天下第一IDE。

安装过程略去:
初始化Visual Studio

阅读全文 »

PHP中的$this、self和parent

发表于 2016-11-12 | 更新于 2019-09-30 | 分类于 知道

可继承性是面向对象编程的重要特征。在开发过程中,由于类与类之间继承关系,我们很容易弄混对象属性的真实归属,到底自己代码所调用的是父类属性还是子类属性呢?这里针对PHP语言,讨论一下$this、self和parent这三个关键字的作用。

基本概念

声明一下,以下的所有描述都是基于PHP的E_STRICT模式,也希望大家的PHP
代码运行于E_STRICT模式下,否则代码很容易产生二义。

首先,$this、self和parent只能在类定义内部使用。

$this是一个伪变量,不能也不需要手动赋值。在类内部定义方法时,$this自动指向了主叫对象,即是主叫对象的引用。如果没有实例化对象,$this就是空值;在静态方法中$this一直是空值,不管是被类名调用,还是被实例化对象调用。

与$this不同,self不是一个变量,不能作为参数传递予函数。在类定义内部,self指向了当前的类。无关有没有实例化对象,self是当前类的引用。在代码上,使用self的地方,都可以用当前类名代替,且运行结果不会改变;然而,使用$this->的地方,如果是在调用类方法(不是类属性),也可以用self::代替,虽然语法上没有错误,但是逻辑上会有差异,详见下面 $this与self。

parent也不是一个变量,也不能作为参数传递予函数。在类定义内部,parent指向了当前类的直接父类,如果当前类没有父类,使用parent则会报错。

阅读全文 »

HTML中单引号的转义符

发表于 2016-11-12 | 更新于 2019-09-30 | 分类于 躬行

就在今天(2016-11-12),一个正常运行了几个月的Web管理系统,突然出现了一个BUG,而且只针对个别用户,其他用户使用正常;排查了一下,发现问题就出在HTML的转义符上。

HTML的转义符

就算没查看过HTML的符号表,HTML写的多了,也自然会知道空格的转义符是&nbsp;。其他一些常用的转义符还有:

显示 转义实体名称 转义实体编号
“ &qout; "
& & &
< < <
> > >
… … …

有些符号没有转义的实体名称,但一定有转义的实体编号,可以查看HTML ASCII 参考手册。
这里先说明单引号'的转义符是&#39;, 下面再来陈述今天遇到的BUG。

阅读全文 »

批量更新短ID

发表于 2016-11-12 | 更新于 2019-09-30 | 分类于 躬行

生成唯一码(ID)的方案有很多,一般要减少冲突,就要增加码长。可是,很多应用场景中(比如把唯一码附在URL中),我们就需要比较短的唯一码。

Hashids

这里先推荐一个生成短ID的开源库——Hashids,它的实现原理大概是根据长的唯一码,通过转码,生成短的唯一码。如果想要得到尽量短的唯一码,那么原码应该是纯数字ID。

Mysql的自增ID

以Mysql的自增ID作为原码,借助Hashids,就可以得到比较短的唯一码。插入一条记录再更新字段,其实现过程是先Insert,然后Update。但是,如果是批量插入记录,那又应该怎样更新短ID字段呢?

阅读全文 »

CONCAT 和 GROUP_CONCAT

发表于 2016-10-06 | 更新于 2019-09-30 | 分类于 知道

在MySQL数据库中查询数据的时候,如果查询语句里使用了GROUP BY,那么SELECT表字段时只能获取分组内第一条记录的数据值,要怎样才能得到分组内所有记录的字段数据值呢?

CONCAT

MySQL中,主要的连接字符串函数,就是 CONCAT。CONCAT函数用于将多个数据值连接成一个字符串。语法:

1
CONCAT(str1, str2, …)

注意:如果有任何一个参数为NULL,那么返回结果就是NULL。
怎样避免参数为NULL的情况,当然是使用CASE WHEN:

1
CONCAT(CASE WHEN str1 is NULL THEN "NULL" ELSE str1 END, CASE WHEN str2 is NULL THEN "NULL" ELSE str2 END, …)
阅读全文 »

SELECT INTO 和 INSERT SELECT INTO

发表于 2016-10-06 | 更新于 2019-09-30 | 分类于 知道

开发中经常会碰到把已存在记录的数据赋给新记录的场景,怎样才能把SELECT和INSERT合并到一个执行语句中呢?

SELECT INTO

语法:

1
SELECT `t1`.`column1` AS column1, `t1`.`column2` AS column2, 'column3' AS column3 INTO `Table2` FROM `Table1` AS t1;

注意:执行过程中,会创建表Table2,所以,执行前要求表Table2不存在。

INSERT SELECT INTO

语法:

1
Insert INTO `Table2` (column1, column2, ...) SELECT value1,value2,... FROM `Table1`;

注意:执行前要求表Table2存在切有固定结构;SELECT前面没有VALUES关键字;FROM后面可以跟更复杂的查询语句。

jQuery Ajax的封装

发表于 2016-08-20 | 更新于 2019-09-30 | 分类于 躬行

程序开发时,经常引入第三方类库。如果类库中的一些函数调用得非常频繁,那么就应该考虑自己封装一下,这样对于后面的代码迭代,会带来很大便利。这里针对jQuery.ajax,讨论一下其如何封装,对于其他类库或许也适用。

$.ajax

jQuery的ajax的确是个好东西,主要实现异步HTTP请求的功能,相信大家都有用过,并且觉得好用。jQuery从1.5.0版本开始,引入了deferred对象,$.ajax(都知道$是jQuery的别称)的调用就变得更加简单快捷。比如,发起一个POST请求:

1
2
3
var url  = '/';
var data = {};
$.post(url, data).done(function() {}).fail(function() {});

$.ajax本身就是对 XMLHttpRequest 的封装,并且已经封装得非常好。借用$.ajax,我们只需要一两行代码就能完成一个异步HTTP请求;$.ajax在很多应用场景中也适用,那么,为什么还要自己再封装一层呢?

阅读全文 »
1…345
林毅锋

林毅锋

阿牛不说话
45 日志
8 分类
36 标签
RSS
GitHub E-Mail
友情链接
  • 赖同学
© 2015 – 2019 林毅锋
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Muse v7.1.2