PHP5类实例教程【整理版】
看到一个类教程,感觉算是比较全面了,所以就整理成了word,需要的可以下载。
从OOP(面向对象)的视角看,不应区分语言。无论是C++、无论是Java、无论是.net还有更多面向对象的语言,只要你了解了OOP的真谛,便可以跨越语言,让你的思想轻松的跳跃。便没有对于Java、.net 、 PHP 之间谁强谁弱的争执了。
希望这个介绍PHP5面向对象编程(OOP)的资料能让初学者受益,能让更多的PHPer开始转向OOP的编程过程。
相对PHP4,PHP5在面向对象方面改变了很多。我们将只介绍PHP5环境下的面向对象。而我们必须改变自己来跟随PHP5的发展。如果代码结果在你的环境下执行不一致,请确认你的环境为PHP5。
我们假设读者没有任何面向对象的知识,即使你是第一次听说OOP,也可以读懂这文章。但我希望你必须对PHP有一些了解。
在后面我们将使用一些例子,来逐渐分析PHP5的OOP基础。
面向对象只解决了两个问题,代码的可扩展性、 代码的可维护性。
15 个一定要会的 Windows7 快捷键
任何的操作系统、软件、游戏,只有熟练使用快捷键,才能最大效率的工作、娱乐,我们不能把所有的时间都浪费在一台机器上,这是不行的。快捷键带给我们的不只是快速,还能感受到机器带来的快感。很难想象一个不用键盘的魔兽争霸玩家。@Appinn
![15 个一定要会的 Windows7 快捷键[图] | 小众软件 > pcskill](http://www.bixuda.com/wp-content/uploads/auto_save_image/2010/09/024608xnK.png)
via GuidingTech
1. Ctrl + Shift + N – 创建一个新的文件夹
你需要在文件夹窗口中按 Ctrl + Shift + N 才行,在 Chrome 中是打开隐身窗口的快捷键。
2. Ctrl + Shift + 左键 – 用管理员权限打开程序 (Ctrl+Shift+Click to Open a Program As Administrator)
有些程序,需要右键选择 Windows7 的管理员权限才可以正常运行,而这个蛋疼的快捷键我没有测试成功,@sfufoet 在受限制帐户下测试的软件 AirVideoServer 可以在 Touch 上成功连接 AirVideoServer 并播放视频。
3. Shift+ 鼠标右键 – 增强版右键发送到
右键发送到 是一个很常用的功能,一般情况下可以发送到:桌面快捷方式、邮件联系人、压缩文档、移动设备等等。而通过 Shift+ 鼠标右键 的发送到,增加了 Windows7 个人文件夹内的所有内容,包括:我的文档、我的照片、我的音乐、桌面等等
![15 个一定要会的 Windows7 快捷键[图] | 小众软件 > pcskill](http://www.bixuda.com/wp-content/uploads/auto_save_image/2010/09/024609Nzg.png)
4. Shift + 右键 – 在当前文件夹用命令行打开。
![15 个一定要会的 Windows7 快捷键[图] | 小众软件 > pcskill](http://www.bixuda.com/wp-content/uploads/auto_save_image/2010/09/024610J1j.png)
开始 > 运行 > cmd 就是命令行界面,传说中的 DOS 命令。最常用的可能就是 ping 了吧?用命令行来修改文件扩展名也是好办法,ren name.txt name.bat 就可以把一个文本文件改成批处理文件了。而 Shift + 右键在当前文件夹用命令行打开的作用就是不用频繁的 cd 打开各级文件夹了。
5. Win + 空格 – 闪现桌面
效果与鼠标停留在任务栏最右端相同,松开 Win 键即恢复窗口。恩,你可以用来看看桌面背景的美女。
6. Win+ 上/下/左/右 – 移动当前激活窗口
其中,Win +左/右 为移动窗口到屏幕两边,占半屏,Win + 上 为最大化当前窗口,下为恢复当前窗口
7. 针对双显示器: Win + Shift + 左 – 移动当前窗口到左边的显示器上
针对让人羡慕的双显示器,可以很方便的移动当前窗口到另外一个显示器上,比如把视频窗口移到一边去,还可以继续上网。
8. 针对双显示器: Win + Shift + 右 – 移动当前窗口到右边的显示器上
我认为是老外为了凑数才把这个快捷键单独列出来的。
9. Win + T – 显示任务栏窗口微缩图并回车切换
![15 个一定要会的 Windows7 快捷键[图] | 小众软件 > pcskill](http://www.bixuda.com/wp-content/uploads/auto_save_image/2010/09/0246111VE.png)
多按几次 T 可以在不同的任务栏窗口中显示,回车则切换。很方便的快捷键。切换窗口还可以用 Win + Tab。
10. Shift + 左键 – 在任务栏对已打开的程序/文件夹再打开一次
话比较绕,比如你对着任务栏里的 Chrome Shift + 左键 则会新打开一个窗口。而对着记事本按也会再打开一个记事本。
11. Win + B – 移动光标到系统托盘
针对键盘爱好者,不需要在狂按 TAB 键才切换到系统托盘了。Win + B 直达托盘,之后就可以用方向键控制了,也可以控制时间区域。
12. Win + P – 在显示器与投影间相互切换
13. Win + 1, Win + 2 – 在任务栏中快速切换程序
任务栏从左到右 1,2,3,快速切换用的。对当前窗口的作用是最小化,另外一个最小化快捷键是 Win + M。
14. Win + Pause – 打开系统属性
通过开始菜单 > 计算机右键属性,是一个东西
15. Ctrl + Shift + Esc – 快速打开 Windows 任务管理器
俗话说最好的留在最后,自从升级 Windows7 后,想调用任务管理器,需要先 Ctrl + Alt + Del 标准快捷键,再点击任务管理器,并且屏幕还会被锁定。而今天才知道的 Ctrl + Shift + Esc 让我泪流满面啊。。。
![15 个一定要会的 Windows7 快捷键[图] | 小众软件 > pcskill](http://www.bixuda.com/wp-content/uploads/auto_save_image/2010/09/0246125ZS.png)
PHP5 面向对象程序设计之:this, self, parent, static
PHP5 是一具备了大部分面向对象语言的特性的语言,比PHP4 有了很多的面向对象的特性,但是有部分概念也比较绕人,所以今天拿出来说说,说
的不好,请高手见谅. (阅读本文,需要了解PHP5 的面向对象的知识)
首先我们来明白上面
PHP5 是一具备了大部分面向对象语言的特性的语言,比PHP4 有了很多的面向对象的特性,但是有部分概念也比较绕人,所以今天拿出来说说,说
的不好,请高手见谅. (阅读本文,需要了解PHP5 的面向对象的知识)
首先我们来明白上面三个关键字: this,self,parent,从字面上比较好理解,是指这,自己,父亲,呵呵,比较好玩了,我们先建立几个概念,这三个
关键字分别是用在什么地方呢?我们初步解释一下,this 是指向当前对象的指针(我们姑且用C 里面的指针来看吧),self 是指向当前类的指针
,parent 是指向父类的指针。我们这里频繁使用指针来描述,是因为没有更好的语言来表达,呵呵,语文没学好。 -_-#
这么说还不能很了解,那我们就根据实际的例子结合来讲讲。
(1)this
———— PHP代码 ————
1 2
3 class UserName
4 {
5 //定义属性
6 private $name;
7
8 //定义构造函数
9 function __construct( $name )
10 {
11 $this->name = $name; //这里已经使用了this 指针
12 }
13
14 //析构函数
15 function __destruct(){}
16
17 //打印用户名成员函数
18 function printName()
19 {
20 print( $this->name ); //又使用了this 指针
21 }
22 }
23
24 //实例化对象
25 $nameObject = new UserName( "heiyeluren" );
26
27 //执行打印
28 $nameObject->printName(); //输出: heiyeluren
29
30 //第二次实例化对象
31 $nameObject2 = new UserName( "PHP5" );
32
33 //执行打印
34 $nameObject2->printName(); //输出:PHP5
35 ?>
————————————
我们看,上面的类分别在11 行和20 行使用了this 指针,那么当时this 是指向谁呢?其实this 是在实例化的
时候来确定指向谁,比如第一次实例化对象的时候(25 行),那么当时this 就是指向$nameObject 对象,那么执
行18 行的打印的时候就把print( $this->name ),那么当然就输
出了"heiyeluren"。第二个实例的时候,print( $this->name )变成了print( $nameObject2->name ),
于是就输出了"PHP5"。所以说,this 就是指向当前对象实例的指针,不指向任何其他对象或类。
(2)self
首先我们要明确一点,self 是指向类本身,也就是self 是不指向任何已经实例化的对象,一般self 使用来指向类中的静态变量。
———— PHP代码 ————
1 2
3 class Counter
4 {
5 //定义属性,包括一个静态变量
6 private static $firstCount = 0;
7 private $lastCount;
8
9 //构造函数
10 function __construct()
11 {
12 $this->lastCount = ++self::$firstCount; //使用self 来调用静态变量,
//使用self 调用必须使用::(域运算符号)
13 }
14
15 //打印最次数值
16 function printLastCount()
17 {
18 print( $this->lastCount );
19 }
20 }
21
22 //实例化对象
23 $countObject = new Counter();
24
25 $countObject->printLastCount(); //输出 1
26
27 ?>
————————————
我们这里只要注意两个地方,第6 行和第12 行。我们在第二行定义了一个静态变量$firstCount,并且初始值为0,那么在12 行的时候调用了
这个值得,使用的是self 来调用,并且中间使用"::"来连接,就是我们所谓的域运算符,那么这时候我们调用的就是类自己定义的静态变量
$frestCount,我们的静态变量与下面对象的实例无关,它只是跟类有关,那么我调用类本身的的,那么我们就无法使用this 来引用,可以使
用self 来引用,因为self是指向类本身,与任何对象实例无关。换句话说,假如我们的类里面静态的成员,我们也必须使用self
来调用。
(3)parent
我们知道parent 是指向父类的指针,一般我们使用parent 来调用父类的构造函数。
———— PHP代码 ————
1 2
3 //基类
4 class Animal
5 {
6 //基类的属性
7 public $name; //名字
8
9 //基类的构造函数
10 public function __construct( $name )
11 {
12 $this->name = $name;
13 }
14 }
15
16 //派生类
17 class Person extends Animal //Person 类继承了Animal 类
18 {
19 public $personSex; //性别
20 public $personAge; //年龄
21
22 //继承类的构造函数
23 function __construct( $personSex, $personAge )
24 {
25 parent::__construct( "heiyeluren" ); //使用parent 调用了父类的构造函数
26 $this->personSex = $personSex;
27 $this->personAge = $personAge;
28 }
29
30 function printPerson()
31 {
32 print( $this->name. " is " .$this->personSex. ",this year" .$this->personAge );
33 }
34 }
35
36 //实例化Person 对象
37 $personObject = new Person( "male", "21");
38
39//执行打印
40 $personObject->printPerson(); //输出:
41
42 ?>
————————————
我们注意这么几个细节:成员属性都是public 的,特别是父类的,是为了供继承类通过this 来访问。我们注意关键的地方,第25 行:
parent::__construct( "heiyeluren" ),这时候我们就使用parent 来调用父类的
构造函数进行对父类的初始化,因为父类的成员都是public 的,于是我们就能够在继承类中直接使用this 来调用。
总结:
this 是指向对象实例的一个指针,self 是对类本身的一个引用,parent 是对父类的引用。
(4) static
static 关键字在类中是,描述一个成员是静态的,static 能够限制外部的访问,因为static 后的成员是属于
类的,是不属于任何对象实例,其他类是无法访问的,只对类的实例共享,能一定程序对该成员尽心保护。类的静
态变量,非常类似全局变量,能够被所有类的实例共享,类的静态方法也是一样的,类似于全局函数。类的静态方
法能访问类的静态的属性。另外说明的是,static 的成员,必须使用self 来访问,使用this 会出错。
另外,还有一个比较重要的特点就是,如果一个方法使用了static,那么这个方法就能够在不需要实例化对象的前
提下直接使用该方法.
(关于this 和self 的异同,请参考:
http://blog.csdn.net/heiyeshuwu/archive/2004/11/03/165828.aspx)
(5)const
const 是一个定义常量的关键字,类似于C 中的#define,能够定义一个常量,如果在程序中改变了它的值,那么
会出现错误。
举例说明上面的代码:(注:以下代码来自phpe.net)
———— PHP代码 ————
class Counter
{
private static $count = 0;//定义一个静态属性
const VERSION = 2.0;//定义一个常量
//构造函数
function __construct()
{
self::$count++;
}
//析构函数
function __destruct()
{
self::$count--;
}
//定义一个静态的方法
static function getCount()
{
return self::$count;
}
}
//创建一个实例
$c = new Counter();
//执行打印
print( Counter::getCount(). "
n" ); //使用直接输入类名来访问静态方
法Counter::getCount
//打印类的版本
print( "Version useed: " .Counter::VERSION. "
n" );
?>
PHP5中面向对象部分的特性——abstract抽象、final最终和static静态【转】
1.abstract
一. 面向对象程序通过类的分层结构构建起来. 在单重继承语言如PHP中, 类的继承是树状的. 一个根类有一个或更多的子类,再从每个子类继承出一个或更多下一级子类. 当然,可能存在多个根类,用来实现不同的功能. 在一个良好设计的体系中,每个根类都应该有一个有用的接口, 可以被应用代码所使用. 而抽象类就可以提供多个实用的接口.如果你建立了一个只有抽象方法的类,那么你就定义了一个接口(interface).
在抽象类中定义的方法,也都是抽象方法,当然,抽象方法与普通的方法不一样,它只是子类中普通方法的一个占位符(只是占个地主不启作用),没有任何代码,也没有"{}"包含,而是以";"结束的.
- abstract class aaa{
- abstract function bbb();
- }
当然,如果一个类中有一个或多个抽象的方法,那么这个类就成了抽象类.抽象类不能实例化,只能继承,然后,实例化子类.值得注意的是,它的子类必须覆写所有方法(all method),这样,子类就成为普通的类,才可以实例化.否则,子类中只要有一个抽象方法,那么子类必须声明是抽象类,在class 关键字前加上 abstract.
二.抽象的类的声明方法:
1.使用abstact 限定语.
- //定义抽象类aaa为基类
- abstract class aaa {
- abstract function bbb();
- abstract function ccc();
- }
- //定义普通类childfromaaa
- //继承aaa抽象类
- class childfromaaa extends aaa {
- //重写所有抽象类中的方法
- public function bbb(){
- //.....
- }
- public function ccc(){
- //...
- ....
- }
- }
- //实例化子类
- $child = new childfromaaa; //right
2. PHP中有interface 和implements关键字. 你可以用interface来代替抽象类, 用implements来代替extends来说明你的类定义或使用一个接口.
- //定义抽象基类
- interface Foo {
- function a(Foo $foo);
- }
- //定义另一个抽象类
- interface Bar {
- function b(Bar $bar);
- }
- //定义子类childfromaaa
- //继承aaa抽象类(接口)
- //实现多类继承
- class FooBar implements Foo, B ar {
- function a(Foo $foo) {
- // ...
- }
- function b(Bar $bar) {
- // ...
- }
- }
- $a = new FooBar;
- $b = new FooBar;
- $a->a($b);
- $a->b($b);
2.final
final / final关键字
PHP5中新增加了final关键字,它可以加在类或类方法前。标识为final的类方法,在子类中不能被覆写。标识为final的类,不能被继承,而且其中的方法都默认为final类型。
Final方法:
<?php
class Foo {
final function bar() {
// …
}
}
?>
Final类:
<?php
final class Foo {
// class definition
}
// 下面这一行是错误的
// class Bork extends Foo {}
?>
3.static
) static
static关键字在类中是,描述一个成员是静态的,static能够限制外部的访问,因为static后的成员是属于类的,是不属于任何对象实例,其他 类是无法访问的,只对类的实例共享,能一定程序对该成员尽心保护。类的静态变量,非常类似全局变量,能够被所有类的实例共享,类的静态方法也是一样的,类 似于全局函数。类的静态方法能访问类的静态的属性。另外说明的是,static的成员,必须使用self来访问,使用this会出错。
(关于this和self的异同,请参考: http://blog.csdn.net/heiyeshuwu/archive/2004/11/03/165828.aspx )
MVC和MVP的一些思考【转】
前言
这篇文章是我近期对MVC和MVP的一些思考,在使用MVC/MVP模式的过程中曾经走过一些弯路。现在虽然改正了某些弯路,但不保证改正了所有的弯路(例如对渲染的理解),所以请阅读这篇文章的朋友不吝发挥你们的质疑。
写这篇文章也是想知道自己还有什么地方是错的,我的最终方案是否可行?
有交流才会有进步。你有一个苹果,我有一个苹果,我们交换后仍各有一个苹果,你有一个思想,我有一个思想,我们交换后......会有N个思想 :p
1. MVC的理解误区
以下是我以前对MVC模式的理解误区:
1. 认为Model是指失血模型的实体类(Entity),是作为View和Controller之间的传输数据。
2. 把业务逻辑全部放在Controller端,认为Controller是用来写UI的业务逻辑的。
这两个误区本质上都是对Model的作用不明导致的。
Model在MVC架构中起的作用非常重要,它才是UI业务逻辑真正的实现层。所以Model的实际上是Business Model(业务模型)。
而Controller仅仅起一个“桥梁”作用,它负责把View的请求转发给Model,再负责把Model处理结束的消息通知View。Controller就是一个消息分发器。Controller是用来解耦View和Model的,具体一点说,就是为了让UI与逻辑分离(界面与代码分离)。
2. MVC与VCP的区别
MVC的View直接与Model打交道,Controller只转发请求(View的请求)和通知(Model处理完之后的通知),不传递数据(业务结果),而是由View直接向Model拿数据。
MVP的View不与Model直接联系,所有的请求、结果通知、数据传递都是通过Controller转发,View和Model彼此不知道对方的存在。
3. MVC与MVP的相同点
无论是MVC还是MVP,View和Controller都是紧密联系的,在WinForm模式下更显得突出,View和Controller直接绑定在一起了(在一个类里面)。
MVC/MVP都是通过“通知”机制(观察者模式,在C#中使用事件)来解决View和Controller的交互。
4. MVP框架的设计
在MVP框架里,用Presenter代替MVC的Controller,而且View不再与Model交互。
4.1. Presenter
Presenter的作用比Controller大得多,Controller只是一个纯粹的消息分发器,而Presenter还负责传递Model的处理结果给View,并指导View的渲染。
注意,渲染我理解为UI的展现方式。
4.2. Presenter与Model
Presenter与Model使用接口隔离,Presenter直接调用Model的接口方法(比如IUserModel的FetchUserList()、SaveUser()等)。
4.3. Presenter与View
View与Presenter的交互使用观察者模式,有两种方式实现:
1. View主动使用Presenter。
View主动构造Presenter,并在内部调用Presenter的方法。即先有View再有Presenter。这种情况下,View明确知道自己要使用哪些Presenter。
2. Presenter主动使用View。
Presneter主动创建View,View里面定义有一堆的事件,Presenter注册这些事件。这种情况下,View不知道自己会被哪些Presenter使用。
第二种方式比第一种方式耦合性低,但View里要写一堆的事件,Presenter类里要捕获一堆的事件,感觉写起来很烦琐,代码不雅观。
5. Controller/Presenter的意义
以下Controller/Presenter简称为C/P。
C/P存在的意义是为了解耦View和Model。如果C/P不存在的话,View就直接访问Model,而View的变化是频繁的,不同的系统,View的展现方式不一样,让Model去控制View的渲染,会降低Model的重用性。如果Model不管View的渲染,由View自己渲染,那么就是WinForm的解决方式,即View和C/P经绑定(合并为一个类)。
6. 为什么要用MVC/MVP模式?
老实说,到目前为止,我依然看不出WinForm把Model分离之后,与标准的MVC/MVP有什麽差距。在WinForm分离Model之后,两者的交互可以用接口隔离,也可以用观察者模式让Form与Model一对多。再用IoC替代View直接构造Model的实例,那么WinForm代表的View+C/P(Form)已经与Model完全解耦了,View+C/P层连Model层都不需要引用(但要引用IModel层)。
这里关键是使用IoC技术,否则WinForm确实会导致View与Model直接耦合,更换Model,或者改变Model的接口会导致View要修改。注意,我们分离出来的Model,并不完全是为了使UI与代码分离,我们更注重Model的重用性,力求一个Model被多个View享用,甚至是不同系统的View享用。这就要求我们改动View的渲染时不用改动Model,同样地,我们改动Model的内部逻辑时,也不影响View的渲染。
嗯,或许还有一点:View通过Controller/ Presenter交互,使得系以统可以有一个共同的“入口”,系统可以在入口处做拦截,利于日志和权限的处理。但我们可以用AOP技术替代C/P的入口。
7. 新方案
由此看来,IoC+AOP可以完全替代C/P,而且框架上更“干净”,开发人员写起来更自由。
转自:http://dotnet.csdn.net/page/fa58fc72-35f6-4720-8afd-a269d43f37e0
Web SSH 客户端Ajaxterm安装(亲测)
Ajaxterm是一款基于Web的SSH客户端软件,它是采用Python编写的,这也就保证了它能在多种Linux发行版的系统中使用,同时它的安装非常简单。
1.下载
- wget http://antony.lesuisse.org/software/ajaxterm/files/Ajaxterm-0.10.tar.gz
2.安装
- tar zxvf Ajaxterm-0.10.tar.gz
- cd Ajaxterm-0.10
- ./configure --prefix=/usr
- make
- make install
3.配置
Ajaxterm需要运行在python2.5以上的环境,如果你的系统python的版本低于2.5的话,运行后不能成功登录,会提示"Login incorrect"错误。
要安装新版本的python
- $rpm -Uvh http://yum.chrislea.com/centos/5/i386/chl-release-5-3.noarch.rpm
- $rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CHL
- $rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
- $yum install libffi
- $yum install python26
同时,Ajaxterm需要做相应的配置:
修改/etc/init.d/ajaxterm文件,在前面(注释后面)添加配置 DAEMON=/usr/bin/python2.6(根据你安装的最新版本的python,这里是2.6)。
ajaxterm=/usr/local/share/ajaxterm/ajaxterm.py 这个路径也要改正确
4.运行
经过上面的步骤,就可以成功启动Ajaxterm,操作Ajaxterm可以查帮助命令:
- $/etc/init.d/ajaxterm --help
- Usage: ajaxterm {start|stop|restart|condrestart}
5.设置Nginx代理
Ajaxterm默认使用的是8022端口,一般防火墙访问的端口有限制,80,443这些不会封,这时我们可以考虑配置web服务器反响代理的方式通过80端口访问Ajaxterm。官方提供配置apahce代理的方法,而我使用的web服务器是nginx,可以通过如下方式配置:
在nginx.conf文件中添加一个server配置节,内容如下:
- server
- {
- listen 80;
- server_name ssh.example.com;
- location / {
- proxy_pass http://127.0.0.1:8022;
- }
- }
然后重新加载nginx配置文件,就可以通过ssh.example.com访问你的linunx了。
最后的效果如下,完全是一个web版的putty。
转载至,(大盛博客)
nginx/apache 中防止绑定别人恶意解析过来的域名
最近为了符合国家某某部门的需求,需要禁止别人而已解析非本站的域名到本站,需要做一些域名绑定的操作,故对公司各个项目做了域名绑定处理。
nginx
server {
listen 80 default;
root /dev/null;
location / {
return 404;
access_log off;
}
}
apache
# vhost.conf
<Virtualhost *:80>
ServerName joinus.jobkoo.com
ServerAlias wanmei.jobkoo.com,test.jobkoo.com,*.jobkoo.com
RewriteEngine on
# 只要不是下面列出的域名均报错指向error.html文件,这个文件并不存在,因此会报404
# 错误。正好符合国家要求
RewriteCond %{HTTP_HOST} !^joinus|wanmei|test|demo\.jobkoo\.com [NC]
RewriteRule ^/(.*) /error.html [L]
# 判断Port是否为443,不是的话跳转到443端口
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/?(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
DocumentRoot "/data/web/www"
</VirtualHost>
检测是否配置成功
curl –I domain
