面向对象编程
面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。
面向对象一直是软件开发领域比较热门的话题。首先,面向对象比较符合人类看待事物的一般规律。其次,采用面向对象方法可以使系统的各部分各司其职、各尽所能。为编程人员敞开一扇大门,使其编程的代码更简洁、更易于维护,并且具有更强的重用性。但PHP并非是真正面向对象编程的语言,PHP是一个混合型的语言,你可以使用面向对象,也可以使用传统的过程化编程。
类和对象
类的声明
<?php
class Person{
var $name; //名称
public $sex; //性别
protected $age;//年龄
//声明一个构造方法,在创建对象时为成员属性赋初值。
function __construct($name = "无名",$sex = "保密",$age = 1){
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
function say(){
echo $this->name."说";
}
function eat(){
echo $this->name."吃";
}
//声明一个析构方法,在对象销毁前自动调用。
function __destruct(){
echo $this->name."去世";
}
}
$p1 = new Person("张三","男",17);
$p1->say();
$p2 = new Person("李四","男",17);
$p3 = new Person("王五","女",16);
/*
* 运行结果为:
* 张三说
* 王五去世
* 李四去世
* 张三去世
*/
在PHP中声明一个类使用class关键字,在类中声明成员属性时变量前一定要使用关键字,如:public,protected,private等关键字,经过关键字修饰的成员变量都有一定的意义。若不需要特定意义的修饰,就使用var关键字,一旦成员属性有其他的关键字修饰就需要去掉var。
私有属性专用魔术方法
<?php
class Person{
private $name; //名称
private $sex; //性别
private $age;//年龄
//声明一个构造方法,在创建对象时为成员属性赋初值。
function __construct($name = "无名",$sex = "保密",$age = 1){
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
//在类的外部直接为成员属性赋值时,自动调用。
function __set($name, $value){
if($name == "age"){
if($value > 28 || $value < 17){
echo "年龄在17 - 26 之间";
return;
}
}
$this->$name = $value;
}
//在类的外部直接获取成员属性时,自动调用。
function __get($name){
if($name == "age"){
return $this->$name + 2;
}
return $this->$name;
}
//在类的外部使用isset()方法测试成员属性时,自动调用。
function __isset($name){
return isset($this->$name);
}
//在类的外部使用unset()方法测试成员属性时,自动调用。
function __unset($name){
unset($this->$name);
}
function say(){
echo $this->name."说";
}
function eat(){
echo $this->name."吃";
}
//声明一个析构方法,在对象销毁前自动调用。
function __destruct(){
echo $this->name."去世";
}
}
$p1 = new Person("张三","男",17);
$p1->age = 14; //年龄在17 - 26 之间
echo $p1->age; //19
var_dump(isset($p1->mail)); //bool(false)
__get(),__set(),__isset(),__unset()这四个方法都是我们添加到类里面的,在需要时自动调用,来完成对象外部对对象内部私有属性的操作。需要注意的是:1、__set(),__get()是专门为类的私用属性(private,protected)设立的。对于public的属性,外部可以直接访问和设置 2、在PHP5.3以后__get(),__set(),__isset(),__unset()这四个方法只能是public类型的,且不可用static修饰,否则会报错。
常见关键字和魔术方法
关键字 | 类 | 类方法 | 类成员 | 描述 |
final | √ | √ | X | 加在类或类方法前,修饰类或方法不可被继承或覆盖,不可以修饰成员属性。 |
static | X | √ | √ | 修饰类方法或成员属性为静态,static修饰的类方法和成员属性在多个对象之 间共享,且可以使用类名直接访问:类名::静态成员属性,类名::静态方法()。 |
const | |
| √ | 将类中的成员属性定义为常量,在声明常量时不要使用‘$’符号,并且一定要 赋初值,后期没有办法为常量赋值。 |
serialize()函数和unserialize()函数配合在一起使用,serialize()函数就是将PHP中的变量(数组,对象)等等的值序列化为字符串后存储起来,这样比较有利于存储和传递PHP的值,同时不丢失其类型和结构。unserialize()函数可以将已序列化的变量,恢复成原有的PHP变量。
__wakeup():unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用该方法,用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。
$name = ['朱','孝','远'];
$serialize_name = serialize($name);
var_dump($serialize_name); //string(48) "a:3:{i:0;s:3:"朱";i:1;s:3:"孝";i:2;s:3:"远";}"
$unserializename = unserialize($serialize_name);
var_dump($unserializename); //array(3) { [0]=> string(3) "朱" [1]=> string(3) "孝" [2]=> string(3) "远" }
看一个序列化对象的例子
class person {
var $name;
var $age;
var $sex;
function __construct($name = "无名氏",$age = null,$sex = null){
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
}
function show_info(){
echo 'name:'.$this->name.',age: '.$this->age.',sex: '.$this->sex.'<br/>';
}
}
$person = new person('朱某某',21,'男');
var_dump($person); //object(person)#1 (3) { ["name"]=> string(9) "朱某某" ["age"]=> int(21) ["sex"]=> string(3) "男" }
$person->show_info(); // name:朱某某,age: 21,sex: 男
$str = serialize($person);
var_dump($str); //string(79) "O:6:"person":3:{s:4:"name";s:9:"朱某某";s:3:"age";i:21;s:3:"sex";s:3:"男";}"
$p = unserialize($str);
$p->show_info(); // name:朱某某,age: 21,sex: 男
抽象类和接口
抽象类
接口
<?php
/**
* Class person
* 类中还有抽象方法,类必须使用abstract修饰
*/
abstract class person{
protected $name;
protected $age;
protected $sex;
protected $id;
abstract function say();
abstract public function eat();
abstract function look();
}
interface WorkerInterface{
function work();
}
interface TeacherInterface{
function teaching();
}
class Worker extends Person implements WorkerInterface{
protected $workerid;
public function __construct($name, $age, $sex, $id,$workerid){
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
$this->id = $id;
$this->workerid = $workerid;
}
function say(){
echo "工人说";
}
public function eat(){
echo "工人吃";
}
function look(){
echo "工人看";
}
function work(){
echo '工人工作';
}
}
class Teacher extends Person implements TeacherInterface{
protected $teacherid;
public function __construct($name, $age, $sex, $id,$teacherid){
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
$this->id = $id;
$this->teacherid = $teacherid;
}
function say(){
echo "教师说";
}
public function eat(){
echo "教师吃";
}
function look(){
echo "教师看";
}
function teaching(){
echo '教师教学';
}
}
$w = new Worker('张三', 19, '男', '20170518001', '20170518111');
$t = new Teacher('李霞', 22, '女', '20170518002', '20170518121');
$w->work();
$t->teaching();