【MVC in PHP】PHP特性急速回顾【下】

我们继续回顾PHP的高级特性,请接上篇博客。

PHP高级特性
1、PHP 准备工作
2、OO in PHP 基础
3、OO in PHP 高级
4、优秀的PHP MVC框架介绍 

****************************************

3、OO in PHP 高级

讨论一下OO的高级特性,主要内容为接口、抽象类。

#1 接口

简单的项目是不需要用到很多的设计模式的,所以很多人一直在写写写一直都不知道写的是啥东西。大型的项目我们不可能一个人去开发完成,而团队合作最重要的就是灵活等等分工。有一种程序员写了很多年代码以后就变成了软件架构师,这不是一般人能胜任的工作,一个优秀的架构师设计的软件框架足以称得上是艺术。我们作为初学者需要慢慢去领会软件架构的思想,接受一点关于架构和设计模式的知识对我们以后的开发会有很大的意义。现在我们要讨论的是在PHP中使用的最广泛的类接口编程技术。

接口,定义了需要实现的类成员,而在PHP中定义的必须是类方法而不能是成员属性。接口定义用关键字interface ,命名通常为I+接口名字 这样的方式,只需要给出相应的方法申明即可,并且必须是全局的,不能包含常量和静态的方法,不能包含构造函数。

interface IAnimal{
function eat();
function sleep();
function play($game);
}

就像这样子,你只需要将需要实现的方法写出来就OK了。
现在就要去实现定义好的接口了。一个类实现某一个接口需要用到关键字implements ,实现接口必须要实现该接口的所有的方法,否则会报错。

class Dog implements IAnimal {
private $name = "狗狗"
function eat(){
echo $this->name."吃饭";
}
function sleep(){
echo $this->name."睡觉";
}
function play($game){
echo $this->name."玩".$game;
}
}

这样Dog类将IAnimal接口的所有方法都做了处理,即实现了接口。这样就是一个类实现了一个接口。
要注意的是,接口之间是可以有继承关系的,用extends 关键字,类似子类父类那样,会有子接口和父接口,而一个类在实现接口时,一定要实现子接口和父接口所有的方法。
一个类可以实现多个接口,还是有implements关键字,接口和接口之间用,分开就行。继承多个接口的类必须要实现所有的方法才算继承成功。
如果懂得Java中的interface 应该是不难理解这些东西的。

#2抽象类和抽象方法
PHP中抽象类和抽象方法是主流MVC框架所采用的设计模式。类接口设计模式和抽象类设计模式最主要的区别就是接口只能提供方法列表,只定义抽象界面,而不能提供实际的功能,但是抽象类则可以在抽象的实体中实现一些功能上的东西,这样就比接口更加灵活了。抽象类不能实例化对象,但是继承了抽象类的子类可以调用抽象类中的成员变量,所以可以这么理解:抽象类=普通类+类接口,即 abstract = class + interface 。抽象类必须有一个未被实现的抽象方法,用abstract 指定,还要有普通的方法和成员变量。下面看代码实现:

abstract class Animal{
abstract function eat();
abstract function play($game);
public $name;
function sleep(){
echo $this->name."睡觉觉";
}
}

定义了一个抽象类,有两个抽象方法,一个普通方法,一个全局的成员变量。现在来继承这个抽象类。

class Dog extends Animal{
function __construct($name){
$this->name = name;
}
function eat(){
echo $this->name."吃饭";
}
function play($game){
echo $this->name."玩".$game;
}

}

这样,我们定义了一个Dog类继承了抽象类Animal ,并且实现了其未实现的抽象方法,现在来看怎么使用。一定注意抽象类是不能实例化对象的。

$dog = new Dog("狗狗");
$dog->eat();
$dog->play("PHP");
$dog->sleep();

这样使用就实现了抽象类。
总结一下,接口只能提供一些方法,要实现接口要用implements关键字,然后实现所有的方法;抽象类和普通类的最大区别是class前面加上abstract关键字,并且里面必须包含一个未被实现的方法,这方法用abstract关键字指定,用extends实现继承,在子类中要实现抽象方法,并且可以直接继承抽象类中本来的普通类成员变量。相同点就是都是对类的一种抽象,不能直接实例化对象。
完善的设计模式中,抽象类技术和类接口技术都是广泛被使用到的,我们必须要理解并且会设计。

4、优秀的PHP MVC框架介绍 

****************************************

终于可以到这里了。介绍当前最重要的几个MVC框架,你要做的是选择其中之一并学精通。掌握基本的MVC开发思想然后掌握一个框架,其实就OK了,但是我们需要了解很多很多的东西。

#1 豪门框架:Zend Framework 官网:http://www.framework.zend.com/
PHP最官方的框架,功能最多,PHP企业级项目开发的首选框架,重量级的开发工具。学习成本较高,学好了很赞。如果你用的IDE是ZS,那么ZS已经内置了ZendFramework ,谁叫人家本来就是一家子的呢……初学者如果感兴趣的话可以上手ZF。不过我没搞过。

#2 最具艺术性的框架:Laravel 中文官网: http://www.golaravel.com/
专门为WEB艺术家设计的框架,简洁,优雅,艺术范儿十足。上手快,文档全,功能强大,语法很有艺术性。如果你是Mac 用户那么绝对值得玩玩!框架是跨平台的,Windows下面部署有点儿小难,不过我相信你如果想弄得话一定能弄好的。Laravel是2013年全球最喜爱的PHP框架排行第一哦!你赶紧去下载啊!嘻嘻我玩过,很赞!

#3 小巧但功能强大的框架:CodeIgniter  中文官网:http://codeigniter.org.cn/
小巧,简洁,高效,零配置,文档完善,国内外广泛使用,恩恩对这就是CI框架。CodeIgniter最大的优点就是小巧,学习成本很低。最大的缺点就是小巧,你无法要求CI去做ZF那样的企业级项目以及Laravel那种的语法优雅但是部署运行比较麻烦的事儿。国内使用很广泛,我玩的第一个框架,还不错。初学者最好的选择。

#4 国人开发功能强大的框架:ThinkPHP 官网:http://www.thinkphp.cn/
说实话当我知道TP是国人开发的时候我真的惊呆了!我们竟然也可以拥有如此强大的框架,真的很赞!!!支持国产,那么就用TP!并且因为是国产的,文档视频社区学习资料等等都是很熟悉的可能你稍微不注意就得到了TP作者的指点呢!本系列接下来的MVC实战会以TP来做。虽然我一直没有仔细学过ThinkPHP,,估计这个系列的博客写完我就会用了呢!嘻嘻!

#5 其他有名的但是没有用过的框架:http://www.oschina.net/news/47752/top-10-php-frameworks-for-2014 这篇文章可以看看
http://www.csdn.net/article/2014-01-03/2818006-PHP-framework-Laravel 还有这一篇

总之,MVC框架熟悉一个以后会很容易掌握其他的。每一种都有自己的特点,我们要多了解然后用好一两个就OK!

****************************************
这个系列主要以学习笔记呈现,讨论的内容主要以《PHP MVC开发实战》和《PHP设计模式》这两本书为主。
欢迎持续关注!

刘凯宁@C2P
20141005

Share

【MVC in PHP】PHP特性急速回顾【上】

在读李开涌先生的《PHP MVC开发实战》,此系列为学习笔记。对李先生致谢!

PHP高级特性
1、PHP 准备工作
2、OO in PHP 基础
3、OO in PHP 高级
4、优秀的PHP MVC框架介绍 

****************************************************************

1、PHP准备工作

#1 你应该先在机器上安装必要的软件,PHP开发要使用到的软件一般为:【网络服务器】,可选Apache 和Nginx ;【PHP解释引擎】,就是PHP了;【数据库】,主要使用MySQL。然后需要运行环境:Linux 、Windows 、Mac OS 都是可以的。以上不同的开发组合,一般会冠以“LAMP”,“LXMP”,“LNMP” ,“WAMP” 等等的名号,你第一步要做的,就是在自己的电脑上安装并且配置好以上任意组合之一的环境。

#2 别担心,这些工作完全都是可以轻松而又简单的。考虑到我们主要是在Windows环境下进行开发,我建议大家去下载WAMP server 安装包,另外一个选择是 XAMPP 安装包。你应该知道怎么获取这两个软件。

#3 一个敲代码的工具。编辑器或者IDE任你选择,如果选择编辑器我推荐Sublime Text 2 or 3 ,被称为当前最性感的开发编辑器;如果是选择IDE我推荐ZendStidio,最强大最官方最专业的PHP集成开发环境,写过Java的你一定会爱上ZS的。不过很抱歉ZS不是免费的,但我相信你能够有办法让它变成免费的。

#4 一个浏览器。如果你依旧喜欢IE6,我靠你还是别做开发了。什么360、搜狗、百度甚至猎豹浏览器,都不建议做开发调试使用。下载一个Chorme或者FireFox吧,求你了。

#5 你必须要有PHP的基础。W3C School 离线版的手册如果你没有的话,请赶紧百度一下下。打开后你需要腾出来5个小时:用一个小时迅速看完HTML基础,半个小时迅速看完CSS基础,半个小时迅速看看JavaScript 是干嘛的,恩剩下的3个小时没错,PHP基础看了。至少学会写了一个还算是好看的网页,有一个表单,提交到另外一个网页上并且能够获取到相应的数据,表单能够比较好看的显示出来,并且对相关的控件能够检验是否为空神马的,知道$_GET和$_POST 是干嘛的,知道echo和var_dump 的使用方式,并且永远要记得变量前面有一个$ 符号。别告诉我你找不到PHP 。手册别丢,你接下来的很久很久很久很久很久很久时间它会一直陪着你的。

#6 请确定你已经明确前面的5点。如果你不能需要5小时解决 #5 中的问题,那么现在新的问题来了:学PHP哪家强?………………我这里有传智播客韩顺平先生的全套PHP教程,还有PHP100的全套教程,网盘上也有,账号mengqingshare@163.com 密码mqshare2014,金山快盘百度云盘打开你会发现惊喜。不用客气。只求不改密码。谢谢。

****************************************************************

2、OO in PHP 基础

终于来到了这里(其实我多么想一下子就来到这里哇哇哇)

OO,Object Oriented,面向对象。近30年计算机编程界最流行的开发方法。如果你写过Java 那么你会很开心。概念很多,重要的就那么几个:类,对象,成员变量(属性),方法,继承、构造函数、接口、访问修饰符、抽象类、异常处理。现在先看看OO基础。

#1 类,对象,属性,方法,访问修饰符

<?php
class Student{
private $name;
public $tel = '15200800000';
function setName($name){
$this->name = $name;
}
function getName(){
return $this->name;}
}

?>

以上定义了一个Student类,有一个成员变量$name,以及对应的 setter 和 getter 方法。是不是和Java刚刚学的时候很类似,你会发现下面个hi更加类似。

$stu = new Student();
$stu->setName('刘凯宁');
echo "我是哦".$stu->getNmae();
echo "我电话是".$stu->tel;

实例化一个对象然后调用相关方法。

以上代码可以放在一个文件中,但是最好是将每一个类都放在单独的文件中,调用的时候require或者include进来就对了。类的命名一般为 类名.class.php,这里类名小写。而在文件中 class 关键字后面建议大写类名。【其实就是说PHP对类名、方法名等是不区分大小写的,但是对变量是会严格区分大小写的】
PHP中调用方法或者访问属性是用->,而Java中是用 . 这个要注意。在PHP中字符串连接使用 而在Java中是用 +
要主要PHP是弱类型语言,方法是可以不指定返回值类型的,并且参数也不需要指定类型。当然你可以给参数强制指定一个类型当做默认类型,但是这个对开发者有用但是对PHP本身来说是没有区分的。
请注意$this关键字。你可能会想到Java中的那个this ,差不多就那个意思吧。后面还有self ,parent 等等,你一定会想到super什么的。现在请注意:用$this访问属性的时候不能加那个$在属性前面,这个一定要注意。
你应该注意到了那个private ,访问修饰符一般都差不很多,PHP中只有3中:public ,protected 和private ,Java多一种default。public权限最大,可以被外部访问,protected 可以被本身以及子类访问,而private只能被自己访问,这些应该是懂的。

然后来讨论一下构造函数。


function __construct($name,$tel){
$this->name = $name;
$this->tel = $tel;
}

把这个构造函数加到上面的类中。在实例化对象时候会有一点儿不同:

$stu2 = new Student('lkn','13290000987');
echo '我是'.$stu2->getName();
echo '我电话是'.$stu2->tel;

这就是PHP中构造函数的使用方式了。在Java中,是定义一个或者多个和类名一样的没有返回值的方法来做构造方法的,并且构造方法可以有不同的参数。PHP也是可以用类名这种形式的构造函数的,但是专业一点的话还是用__construct这样的方式。

#2 继承
继承可以分开来说说。
继承是OO最重要的思想之一。来看看PHP怎么实现继承的:

class Animal {
function eat(){
echo "吃东东";
}
function sleep(){
echo "睡觉啊";}
function play(){
echo "玩去了";}
}

class Dog extends Animal{
private $name;
function setName($name){
$this->name = $name;
}
function getName(){
return $this->name;}
}
}

一个Animal类,定义吃饭睡觉玩去了的方法,然后一个Dog类继承Animal类,有自己的属性和对应的setter 和 getter 方法。实例化的时候

$ani = new Animal();
$ani->eat();
$ani->sleep();
$ani->play();
$dog = new Dog();
$dog->setName('狗狗');
echo $dog->getName().$dog->eat();
echo $dog->getName().$dog->sleep();
echo $dog->getName().$dog->play();

因为Dog是继承于Animal,所以可以去调用它的方法。这就是继承了。
以上代码你可以写的更好,我只是简单回顾一下思想,求不照着写。

PHP中继承是无限制的,就是说你可以一直继承下去,只要你的修饰符权限能足够继承的条件。当然你可以中断继承,比如说指定某一个类是final的,就不允许被继承了,具体定义就是在class 前面加上 final

final class Dog{}

像这样的,就表明Dog这个类是不能往下面继承了。

在父类中会有一些公开的能被子类继承过去的属性和方法,子类继承过来以后是可以修改这些父类的属性和方法的。

 function eat(){
 echo '我要吃东东'}

把上面这个代码加到Dog类中,调用$dog->eat()的时候就会打印“我要吃东东”而不是“吃东东”。这个很简单啦。当然属性是需要修改的。

关于构造方法,如果你的子类需要父类的特性,并且要基于父类做新的开发,那么我强烈建议你的构造方法这么写

function __construct(){
		parent::__construct();
	}

这是一个没有参数的构造函数,你可以写有参数的,但是一定要记住,在构造函数中要首先去调用父类的构造函数,这个在后面的MVC实战中会经常性的遇到。

#3 静态类成员
一旦定义,只能调用不能改变的成员成为静态类成员。
静态类成员分为三种:类常量、静态属性、静态方法。
类常量用const 定义,一般建议大写,内部调用用self::类常量 ,外部调用用 类名::类常量 的方式。

const NAME = “LKN”;
//内部调用
echo self::NAME ;
//外部调用
echo Class::NAME;

内部外部指的是类的内部和外部。在类的内部,比如在某一个方法中要使用类常量就要用self::类常量,而在类的外部,不需要实例化一个类的对象就可以直接Class::类常量这样使用,这里的Class是一个类名。
静态属性和静态方法类似,用static 定义,内部调用用self::静态属性名(方法名), 外部调用用 类名::静态属性名(方法名) 的方式。

static $name = "lkn";
static function getName(){
echo self::$name;}
//外部调用时
echo Class::getName();

这里的Class是一个类名。
在继承父类以后,子类要调用父类中的静态成员就不能用self了,应该使用parent::静态属性名或者parent::静态方法名,而在调用子类本身的静态属性的时候依旧要用self的方式。就是说,只要涉及到调用父类的方法或者属性,建议都要用parent指定。
合理的使用静态类成员会给开发带来很大的便捷,并且在代码维护阶段很方便。建议修改不频繁的或者是单一功能的方法都定义成静态的。

****************************************************************
【好饿啊先去吃饭了……敬请期待下篇】

刘凯宁@C2P
20141005

Share