【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