1.什么是面向对象?
面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程
序是由单个能够起到子程序作用的单元或对象组合而成,OOP达到了软件工程的三 个目标:重用性、灵活性和扩展性。为了实现整体
运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。
2.什么是类,什么是对象,类和对象这间的关系
类的概念:类是具有相同属性和服务的一组对象的集合。它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务
两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性说明和服务说明两个主要部分。
对象的概念:对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行
操作的一组服务组成。从更抽象 的角度来说,对象是问题域或实现域中某些事物的一个抽象,它反映该事物在系统中需要保存的信
息和发挥的作用;它是一组属性和有权对这些属性进行操作的一组 服务的封装体。客观世界是由对象和对象之间的联系组成的。
类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是类.类描述了一组有相同特性(属性)
和相同行为(方法)的对象。
3.什么是面向对象编程呢?
把每个独立的功能模块抽象成类形成 对象,由多个对象组成这个系统,这些对象之间都能够接收信息、处理数据和向其它对象发送
信息等等相互作用。就构成了面向对象的程序。
4.如何抽象出一个类?
使用一个关键字class和后面加上一个你想要的类名以及加上一对大括号, 这样一个类的结构就定义出来了,只要在里面写代码就可
以了, 但是里面写什么? 能写什么?怎样写才是一个完整的类呢?上面讲过来,使用类是为了让它实例出对象来给我们用, 这就要
知道你想要的是什么样的对象了,像上面我们讲的一个装机配置单上写什么,你装出来的机子就有什么。比如说,一个人就是一个对
象,你怎么把一个你看好 的人推荐给你们领导呢?当然是越详细越好了:
首先, 你会介绍这个人姓名、性别、年龄、身高、体重、电话、家庭住址等等。
然后,你要介绍这个人能做什么, 可以开车, 会说英语, 可以使用电脑等等
5.如何实例化对象?
$对象名称 = new 类名称();
对像在PHP里面和整型、浮点型一样,也是一种数据类,都是存储不同类型数据用的,在运行的时候都要加载到内存中去用, 那么对
象在内存里面是怎么体现的呢?内存从罗辑上说大体上是分为4段, 栈空间段, 堆空间段,代码段, 初使化静态段, 程序里面不同
的声明放在不同的内存段里面,栈空间段是存储占用相同空间长度并且占用空间小的数据类型的地方,比如说整型1, 10, 100,1000,
10000, 100000等等,在内存里面占用空间是等长的,都是64位4个字节。 那么数据长度不定长,而且占有空间很大的数据类型的数
据放在那内存的那个段里面呢?这样的数据是放在堆内存里面的。栈内存是可以直接存取的,而堆内存是不 可以直接存取的内存。对于
我们的对象来说就是一种大的数据类型而且是占用空间不定长的类型,所以说对象是放在堆里面的,但对象名称是放在栈里面的,这样通
过对象名称就可以使用对象了。
6.如何去使用对象中的成员
对象->属性 、对象->方法 形式访问
7.特殊的引用“$this“的使用
现在我们知道了如何访问对象中的成员,是通过”对象->成员”的方式访问的,这是在对象的外部去访问对象中成员的形式, 那么如果
我想在对象的内部,让对象里的方法访问本对象的属性, 或是对象中的方法去调用本对象的其它方法这时我们怎么办?因为对象里面的
所有的成员都要用对象来调用,包括对象的内部成员之间的调用,所以在PHP里面给 我提供了一个本对象的引用$this, 每个对象里面
都有一个对象的引用$this来代表这个对象,完成对象内部成员的调用, this的本意就是“这个”的意思,每个对象里面各自存在一个
$this分别代表对象
8.构造方法__construct()与析构方法__destruct()
大多数类都有一种称为构造函数的特殊方法。当创建一个对象时,它将自动调用构造函数,也就是使用new这个关键字来实例化对象的
时候自动调用构造方法。构 造函数的声明与其它操作的声明一样,只是其名称必须是__construct( )。这是PHP5中的变化,以前的版
本中,构造函数的名称必须与类名相同,这种在PHP5中仍然可以用,但现在以经很少有人用了,这样做的好处是可以使构 造函数独立
于类名,当类名发生改变时不需要改相应的构造函数名称了。为了向下兼容,如果一个类中没有名为__construct( )的方法,PHP将搜
索一个php4中的写法,与类名相同名的构造方法。
对象在内存中被销毁前调用析构函数, 一个类的析构函数名称必须是__destruct( )。析构函数不能带有任何参数
9.封装性(var与public,protected,private的关系)
prvate $age; // 私有的属性年龄
function setAge($age) // 为外部提供一个公有设置年龄的方法
{
if ($age<0 || $age>130) // 在给属性赋值的时候,为了避免非法值设置给属性
return;
$this->age = $age;
}
function getAge() // 为外部提供一个公有获取年龄的方法
{
return($this->age);
}
10.__set(),__get(),__isset(),__unset()四个方法的应用
总是把类的属性定义为private,这更符合现实的逻辑。但是, 对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个
函数”__get()”和”__set()”来获取和赋值其属性,以及检查属性的”__isset()”和删除属性的方法”__unset()”。
1、__set(), __get() 是专门为类的私有属性(private、protected)设立的,对于类的公开(public)属性,外面是可以直接访问
与设置的(如:$p1->name),即不走__set(),__get()函数的!!!
2、在PHP5.3及以后,上述魔术方法(__get(),__set(),__isset(),__unset() 等)提倡是 public 类型的,并且不是 static 方法,
否则会给出警告信息
<?php
class A
{
private $name = 'qianyunlai';
public $old = '26';
private function __get($name)
{
echo $name, '<br />';
return $this->$name;
}
}
$a = new A();
print_r($a->name);
?>
输出:
( ! ) Warning: The magic method __get() must have public visibility and cannot be static in
D:\PHP\xampp\htdocs\discuz\discuzx3.0\123.php on line 6
name
qianyunlai
11.类的继承
class 类名 extends 类名{}
PHP和Java语言里面没有多继承,只有单继承,也就是说,一个类只能直接从一个类中继承数据, 这就是我们所说的单继承。
12.重载新的方法(parent::)
PHP中的方法是不能重载的, 所谓的方法重载就是定义相同的方法名,通过“参数的个数“不同或“参数的类型“不 同,来访
问我们的相同方法名的不同方法。但是因为PHP是弱类型的语言, 所以在方法的参数中本身就可以接收不同类型的数据,又因
为PHP的方法可以接收不定个数的参数,所以通过传递不同个数的参数调用不相同方法名的不同方法也是不成立的。所以在PHP
里面没有方法重载。不能重载也就是在你的项目中不能定义相同方法名的方法。另外,因为PHP没有名子空间的概念,在同一个
页面和被包含的页面中不能定义相同名称的方法, 也不能定义和PHP给我提供的方法的方法重名,当然在同一个类中也不能定
义相同名称的方法。
在子类这 个方法中可以调用到父类中被覆盖的方法, 也就是把被覆盖的方法原有的功能拿过来再加上自己的一点功能,可以
通过两种方法实现在子类的方法中调用父类被覆盖的方法:
构造方法在子类中如果没有声明的话,也可以使用父类中的构造方法,如果子类中重新定义了一个构造方法也会覆盖掉父类中
的构造方法,如果想使用新的构造方法为所有属性赋值也可以用同样的方式。
class Student extends Person
{
var $school; // 学生所在学校的属性
function __construct($name, $sex, $age, $school)
{
// 使用父类中的方法为原有的属性赋值
parent::__construct($name, $sex, $age);
$this->school = $school;
}
// 这个学生学习的方法
function study()
{
echo "我的名子叫:" . $this->name . " 我正在" . $this->school . " 学习";
}
// 这个人可以说话的方法, 说出自己的属性
function say()
{
parent::say();
// 加上一点自己的功能
echo "我的年龄是:" . $this->age . " 我在" . $this->school . "上学";
}
}
13.访问类型(public,protected,private)
public (公有的、默认的),protected (受保护的)和private (私有的)
private protected public
同一个类中 √ √ √
类的子类中 √ √
所有的外部成员 √
14.final关键字的应用
这个关键字只能用来定义类和定义方法, 不能使用final这个关键字来定义成员属性,因为final是常量的意思,
我们在PHP里定义常量使用的是define()函数,所以不能使用final来定义成员属性。
使用final关键标记的类不能被继承,使用final关键标记的方法不能被子类覆盖
15.static和const关键字的使用(self::const/static)
static成员能够限制外部的访问,因为static的成员是属于类的,是不属于任何对象实例,是在类第一次被加载的时
候分配的空间,其他类是无法访问的,只对类的实例共享,能一定程度对类该成员形成保护;
const是一个定义常量的关键字,在PHP中定义常量使用的是“define()”这个函数,但是在类里面定义常量使用的是“const”这个关键字,
(类内)self(代表这个静态属性所在的类)
(类外)(静态方属性所在的类)
16.__toString()方法
“__toString()”方法也是一样自动被调用的,是在直接输出对象引用时自动调用的
“$p=new Person()“中,$p就是一个引用,我们不能使用echo 直接输出$p,这样会输出
“Catchable fatal error: Object of class Person could not be converted to string”这样的错误,
如果你在类里面定义了“__toString()”方法,在直接输出对象引用的时候,就不会产生错误,而是自动调用
了”__toString()”方法, 输出“__toString()”方法中返回的字符,所以“__toString()”方法一定要有
个返回值(return 语句)。
<?php
// Declare a simple class
class TestClass
{
public $foo;
public function __construct($foo)
{
$this->foo = $foo;
}
// 定义一个__toString方法,返加一个成员属性$foo
public function __toString()
{
return $this->foo;
}
}
$class = new TestClass('Hello');
// 直接输出对象
echo $class;
?>
17.克隆对象__clone()方法
在PHP4中我们使用“clone”这个关键字克隆对象;
<?
class Person
{
// 下面是人的成员属性
var $name; // 人的名子
var $sex; // 人的性别
var $age; // 人的年龄
// 定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值
function __construct($name = "", $sex = "", $age = "")
{
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
// 这个人可以说话的方法,说出自己的属性
function say()
{
echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>";
}
}
$p1 = new Person("张三", "男", 20);
// 使用“clone”克隆新对象p2,和p1对象具有相同的属性和方法。
$p2=clone $p1;
$p2->say();
?>
PHP4定义了一个特殊的方法名“__clone()”方法,是在对象克隆时自动调用的方法,用“__clone()”方法将建立一个与原对
象拥有相同属 性和方法的对象,如果想在克隆后改变原对象的内容,需要在__clone()中重写原本的属性和方法,“__clone()”
方法可以没有参数,它自 动包含$this和$that两个指针,$this指向复本,而$that指向原本;
<?
class Person
{
// 下面是人的成员属性
var $name; // 人的名子
var $sex; // 人的性别
var $age; // 人的年龄
// 定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值
function __construct($name = "", $sex = "", $age = "")
{
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
// 这个人可以说话的方法, 说出自己的属性
function say()
{
echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>";
}
// 对象克隆时自动调用的方法, 如果想在克隆后改变原对象的内容,需要在__clone()中重写原本的属性和方法
function __clone()
{
// $this指的复本p2, 而$that是指向原本p1,这样就在本方法里,改变了复本的属性。
$this->name = "我是假的 $that->name";
$this->age = 30;
}
}
$p1 = new Person("张三", "男", 20);
$p2 = clone $p1;
$p1->say();
$p2->say();
?>
18.__call()处理调用错误
下面我们加上“__call()”方法,这个方法有2个参数,第一个参数为调用不存在的方法过程中,自动调用__call()方法时,
把这个不存在的方法的方法名传给第一个参数,第二个参数则是把这个方法的多个参数以数组的形式传进来。
<?php
//这是一个测试的类,里面没有属性和方法
class Test
{
// 调用不存的方法时自动调用的方法,第一个参数为方法名,第二个参数是数组参数
function __call($function_name, $args)
{
print "你所调用的函数:$function_name(参数:";
print_r($args);
echo ")不存在!<br>";
}
}
// 产生一个Test类的对象
$test=new Test();
// 调用对象里不存在的方法
$test->demo("one", "two", "three");
// 程序不会退出可以执行到这里
echo "this is a test<br>";
?>
19.抽象方法和抽象类(abstract)
定义抽象类就相当于定义了一种规范,这种规范要求子类去遵守,子类继承抽象类之后,把抽象类里面的
抽象方法按 照子类的需要实现。
<?
abstract class Demo
{
var $test;
abstract function fun1();
abstract function fun2();
function fun3()
{
...
}
}
$demo = new Demo(); // 抽象类不能产生实例对象,所以这样做是错的,实例化对象交给子类
class Test extends Demo
{
function fun1()
{
...
}
function fun2()
{
...
}
}
$test = new Test(); // 子类可以实例化对象,因为实现了父类中所有抽象方法
?>
20.PHP5接口技术(interface)
接口是一种特殊的抽象类,抽象类又是一种特殊的类,所以接口也是一种特殊的类,为 什么说接口是一种特殊
的抽象类呢?如果一个抽象类里面的所有的方法都是抽象方法,那么我们就换一种声明方法使用“接口”;也就
是说接口里面所有的方法必须 都是声明为抽象方法,另外接口里面不能声明变量(但可声明常量constant),而
且接口里面所有的成员都是public权限的。
PHP中不仅一个类可以实现多个接口,也可以在继承一个类的同时实现多个接口, 一定要先继承类再去实现接口;
<?php
// 使用extends继承一个类,使用implements实现多个接口
class Four extends 类名一 implemtns 接口一, 接口二, ...
{
// 所有接口中的方法都要实现才可以实例化对象
...
}
?>
21.多态的应用
所谓多态性是指一段程序能够处理多种类型对象的能力
比如说在公司上班,每个月财务发放工资,同一个发工资的方法,在公司内不同的员工或是不同职位的员工,
都是通过这个方法发放的,但是所发的工资都是不相同的。所以同一个发工资的方法就出现了多种形态
22.把对象串行化serialize()方法,__sleep()方法,__wakeup()方法
有时候需要把一个对象在网络上传输,为了方便传输,可以把整个对象转化为二进制串,等到达另一端时,
再还原为原来的对象,这个过程称之为串行化
__sleep()函数不接受任何参数, 但返回一个数组
__wakeup()方法做一些对象醒来就要做的动作。
<?
class Person
{
// 下面是人的成员属性
var $name; // 人的名子
var $sex; // 人的性别
var $age; // 人的年龄
// 定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值
function __construct($name = "", $sex = "", $age = "")
{
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
// 这个人可以说话的方法, 说出自己的属性
function say()
{
echo "我的名子叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>";
}
// 指定串行化时把返回的数组中$name和$age值串行化,忽略没在数组中的属性$sex
function __sleep()
{
$arr = array("name", "age"); // 此时,属性$sex将被删除!!!
return($arr);
}
// 重新生成对象时,并重新赋值$age为40
function __wakeup()
{
$this->age = 40;
}
}
$p1 = new Person("张三", "男", 20);
// 把一个对象串行化,返一个字符串,调用了__sleep()方法,忽略没在数组中的属性$sex
$p1_string = serialize($p1);
echo $p1_string . "<br>"; // 串行化的字符串我们通常不去解析
$p2 = unserialize($p1_string); // 反串行化形成对象$p2重新赋值$age为40
$p2->say();
?>
23.自动加载类 __autoload()函数
_autoload() 是专门为 类的不存在 而设计的!!!很多框架利用这个函数,实现 类文件的自动加载 !!!
PHP面向对象-----(总体学习路线)
最新推荐文章于 2025-01-19 18:52:38 发布