前言
何为面向对象,何为面向过程,是我们学计算机的人都应该思考认识的一个问题。
世间有山上山下之分,又有富贵贫贱之别,可是苦难的分量,未必有大小之分。落在每个人头上,有人听了一句言语的难熬,可能就是别人挨了一刀的疼痛,这很难去用道理解释什么,都是一般的难熬。
变量
全局和局部变量
在函数外定义的变量成为全局变量,全局作用域,正常情况下只能在函数外使用。
在函数内定义的变量称之为局部变量,正常情况下只能在函数内使用。
正常请求下,我们的变量在运行完当前页面后销毁。如果不想变量被销毁可以使用静态变量。
1. local(局部)
2. global(全局)
3. static(静态)
$GLOBALS
PHP同时在名为 $GLOBALS[index] 的数组中存储了所有的全局变量,下标索引为变量名,这样通
过去数组在函数内也可以访问到外部变量,并能够用于更新全局变量。
PHP面向对象
面向对象(OPP)程序编程,使代码更简洁,更易于维护,并且具有更强的可重用性。
面向对象是一种抽象化的编程思想,编程思想有面向对象和面向过程。
面向过程:编程思路集中在过程上。
面向对象:编程思路集中在参与的对象。
面向过程:点菜—做菜——上菜——吃饭——结账——收拾
面向对象:客人,厨师 ,服务员
面向对象编程的优点:
多人合作方便
减少代码冗余,灵活性高(灵活性)
代码的可重用性发挥到极致(重用性)
可扩展性强(拓展性)
类和对象
类是对一类事物的抽象描述,共性的描述,具有一系列共同特征的集合,一种模板。
对象用于表示现实中该类事物的个体,也就是具体化了类的描述,
关系:类是对象的模板,对象根据类创建,一个类可创建多个对象。(通过学生类,创建出来的小明和小王就叫对象)
类是具有相同属性和行为的一组对象的集合。 比如(人类、犬类)
对象是具体存在的事物,对象是由属性(变量)和方法(函数)组成的。(比如:人类中的男人、女人)
分析:厨师类 —— 厨师对象 —— 做菜方法
结论:我们在开发的时候,先写类,通过类创建对象,然后调用对象的属性和方法实现功能。类—— 对象——调用成员
面对对象内容
类 − 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作
对象 − 是类的实例
成员变量 − 定义在类内部的变量。该变量值对外是不可见的,但是可通过成员函数访问,在类被实例化为对 象后,该变量即可称为对象的属性
成员函数 − 定义在类的内部,可用于访问对象的数据
继承 − 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的 时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加 入若干新的内容
父类 − 一个类被其他类继承,可将该类称为父类,或基类,或超类
子类 − 一个类继承其他类称为子类,也可称为派生类
多态 − 多态性是指相同的函数或方法可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性
重载 − 简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数 或者方法之间,互相称之为重载函数或者方法
抽象性 − 抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关
面向对象关键字
类:class,是定义面向对象主体的最外层结构,用来包裹主体的数据和主体功能(函数)。
对象:Object,是某类事物的具体代表,也就是实际数据和功能操作的具体单元。
实例化:new,从一个抽象的概念(类)得到一个符合抽象概念的具体实例(对象)的过程。
类成员:member,指类class结构的所有内容,类成员里面有三种:属性、方法、常量
成员方法:本质是在class结构中创建的函数
成员属性: 本质是在class结构中创建的变量
类常量:const,本质上在类class结构中创建的常量。
类定义
定义类的基本语法:class类名{}
类无法直接访问,需要得到类的具体对象才能访问,可以通过 实例化 来实现的对象的创建: new 类名()
代码
<?php
class Person{
}
new Person();
new Person;
?>
对象创建后可以直接使用或者打印,但是为了后续方便使用,通常使用变量保存实例化对象
代码
<?php
class Person{
}
$woman = new Person; //保存对象
var_dump($woman);
?>
//打印结果
object(My) 对象(类名)#成员变量个数。
类成员
类成员,定义在类结构{}中的成员。类成员三种: 成员属性(变量)、成员方法(函数)、类常量 。
成员变量
就是在类结构{}下直接定义的变量,类的变量使用 var 或 public 来声明,变量也可以初始化值,成员变量可赋值也可以不赋值。
成员变量必须通过对象才能进行访问,也就是需要先通过实例化得到对象,然后通过对象实现成员变量的增删改查:
语法:$对象名->属性名 即取对象的属性。
class Person{
var $name="admin";
var $age=88;
var $id="4107271890x";
}
$woman =new Person;
echo $woman -> name; //查看
$woman ->age = 18; //修改
echo $woman -> age;
$woman -> city='sx'; //增加
echo $woman -> city;
unset($woman->id); //删除
echo $woman->id //调用失败
成员方法
就是在类结构中定义的函数,函数内部的内容与原来函数结构一样,可以有分支、循环结构等
class My{
function test(){
for ($i=1;$i<100;$i++){
echo "<br>$i";
}
}
}
$a = new My;
$a -> test();
访问修饰限定符
public 公有,类内类外都可以访问。
protected:受保护,只允许在相关类内部访问。
private:私有,只允许在定义类内部访问。
公有举例
class Money{
#属性
public $count = 100;
#方法
public function getCount(){
echo __METHOD__;
}
}
# 实例化对象
$s =new Money;
#访问
echo $s->count;
$s->getCount();
私有距离
class Money{
#属性
protected $count = 100;
#方法
private function getCount(){
echo __METHOD__;
}
}
# 实例化对象
$s =new Money;
#访问
echo $s->count; //报错
$s->getCount(); //报错
如果一个方法没有访问修饰符,则默认是public
属性必须指定访问修饰符,若没有访问修饰符,会报错。var是public别名
私有方法前面最好加下划线,如:private function _save(){}
类内部对象
内部对象 $this ,方法内部内置的一个对象,会自动指向来调用方法的对象。
$this 存在于方法内部(仅限内部使用),所以相当于在类的结构内部。
类内部对类成员也需要通过对象才能访问,所以必须通过 $this 内部对象访问类成员。
简述:this可以调用本类中的方法和属性,也可以调用父类中的可以调的方法和属性
访问举例(错误)
方法本质是定义在类内部的函数,因此受制于作用域的问题,在方法内部访问的变量,系统认定 为局部变量(必须内部定义或参数传入)否则就会提示未定义。
class Money{
#属性
public $count=10;
protected $dis = 0.1;
private $money=100;
public function getALL(){
echo $this->count,"<br>",$this->dis,"<br>",$this->money;
}
}
$s = new Money;
$s->getALL();
构造方法
构造方法: __construct() 是一种特殊的方法,主要是用来创建对象时初始化对象,即为对象成员变量赋初始值。构造方法在类的实例化对象后,会被自动调用。
构造方法是一种魔术方法,魔术方法是会被自动触发的。不需要手动调用。
构造方法的目标是为了实现对象的初始化。
构造方法通常是为了实现对象所需要资源的初始化(对象属性、其他资源)
代码
class Saler{
#属性
public $count;
public $money;
#构造方法
public function __construct($count,$money){
#初始化操作
$this->count = $count;
$this->money = $money;
}
}
#实例化
$a = new Saler(100,200);
var_dump($a)
析构方法
析构方法: __destructor 与构造方法相反,当对象结束其生命周期时(例如对象所在函数已经调用完
毕)系统会自动执行析构函数,应在退出前在析构函数中用来释放内存。
析构函数__destruct 析构函数没有任何参数
class Saler{
function __destruct(){
echo "bye bye!";
}
}
$a = new Saler();
范围解析操作符(类常量访问)
概念:范围解析操作符又名域运算符:由两个冒号组成 :: php调用类的内部静态成员,或者是类之间调用就要用 :: ,访问类的常量必须使用双冒号 ::
类常量是在类结构下定义得常量,类常量得定义只能使用一种方式: const 常量名 = 值、
Class Saler{
const PI = 3.1415;
}
$b = new Saler();
echo Saler::PI; //类访问
echo $b::PI; //对象访问
静态成员
声明类:属性或者方法为 static(静态) 就可以不是实例化类而直接访问。静态属性不能通过一个类实例化对象来访问(静态方法可以)。
目的:确定有些成员(属性、方法)不需要对象访问,直接通过类访问。
PHP静态成员有两种:
静态属性
静态方法
静态成员是明确用来类访问得,而不是对象。
class Money{
public static $money=1;
public static function show(){
echo Money::$money;
}
}
# 访问静态属性
echo Money::$money;
# 访问静态方法
Saler::show();
self关键字
概念:self关键字,在类得内部(方法里面)使用,代替类名得写法。
self如同$this代表内部对象一样,能够在方法内部代替当前类名。
能够保障用户方便修改类名字。
self关键字是代替类名,所以需要配合范围解析操作符 ::
class Money{
public static $money=1;
public static function show(){
echo Money::$count;
echo self::$count;
}
}
# 访问静态方法
Money::show();