OOP 基础知识汇总(一) |
>>>你须要了解如下概念
面向对象&面向过程概念:
面向过程:专一于解决一个问题的过程。面向过程的最大特色,是由一个一个的函数去解决处理这个问题的一系列过程。
面向对象:专一于由哪一个对象来处理一个问题。面向对象的最大特色,是有一个个具备属性和功能的类,从类中拿到对象,进而处理问题。php
【面向对象】函数
一、什么是类?
具备相同属性(特征)和方法(行为)的一系列个体的集合,类是一个抽象的概念
二、什么是对象?
从类中,拿到的具备具体属性值的个体,称为对象。对象是一个具体的个体。
例如:人类,都有姓名、性别、年龄,可是这些属性都不能有具体的值。
张三,是人类中的一个对象!姓名张3、性别男、年龄23,将类的每个属性具体赋值后,就成了张三这个对象。
三、类和对象的关系?
类是对象的抽象化!对象是类的具体化!
类仅仅代表这类对象有哪些属性,可是不能有具体的值,因此类是抽象的。
而对象,是将类的全部属性赋值后,产生的具体的个体,全部对象是具体的。
类的声明与实例化: this
一、如何声明一个类:spa
class 类名{orm
访问修饰符 $属性[=默认值];
[访问修饰符] function 方法(){}
}
二、声明一个类的注意事项:
① 类名只能有字母数字下划线组成、开头不能是数字,必须符合大驼峰法则;
② 类名必须使用class修饰,类名后面必定不能有();
③ 属性必需要带访问修饰符,方法能够不带访问修饰符;
三、实例化对象及对象属性方法的调用?
$对象名 = new 类名(); //()能够不带
类外部调用属性和方法:
$对象名 -> 属性名; // 使用->调用属性时,属性名不能带$
类内部调用属性和方法:
$this -> 属性名;对象
构造函数:
一、什么是构造函数?
构造函数是类中的一个特殊函数,当咱们使用new关键字实例化对象时,至关于调用了类的构造函数;
二、构造函数有什么做用?
实例化对象时,自动调用,用于给对象的属性赋初值!
三、构造函数的写法?
① 构造函数名,必须与类同名
[public] function Person($name){
$this -> name = $name;
}
② 使用魔术方法__construct
[public] function __construct($name=""){
$this -> name = $name;
}资源
四、构造函数注意事项:get
① 第一种写法,构造函数名必须与类同名!!!!!!
② 若是一个类没有手写构造函数,则系统默认会有一个空参构造,所以可使用new Person();
若是咱们写了带参数的构造函数,则将不会再有空参构造,也就是不能直接使用new Person(); Person后面的()中的参数列表,必须符合构造函数的要求!!!
③ 若是两种构造函数同时存在,将使用__construct。
五、析构函数:__destruct():
① 析构函数在对象被销毁释放以前自动调用!
② 析构函数不能带有任何的参数
③ 析构函数经常使用于对象使用完之后,释放资源、关闭资源等!
六、魔术方法:
PHP中,给咱们提供一系列用__开头的函数,这些函数无需本身手动调用,会在合适的时机自动调用,这类函数称为魔术函数。
例如:function __construct(){} 在类new一个对象时自动调用
function __destruct(){} 在对象被销毁时自动调用
咱们要求,除了魔术方法以外,自定义的函数与方法不能使用__开头。
最后,通常对于功能比较复杂的类,咱们会单独的写到一个类文件中。
类文件的命名,统一小写,使用“类名小写.class.php”的方式命名。
在其余文件中使用这个类时,能够用include导入这个.class.php文件io
封装的基本概念
一、什么是封装?
经过访问修饰符,将类中不须要外部访问的属性和方法进行私有化处理,以实现访问控制。
注意:是实现访问控制,而不是拒绝访问。 也就是说,咱们私有化属性以后,须要提供对应的方法,让用户经过咱们提供的方法处理属性。
二、封装的做用?
① 使用者只关心类可以提供的功能,而没必要关心功能实现的细节!(封装方法)
② 对用户的数据进行控制,防止设置不合法数据,控制返回给用户的数据(属性封装+set/get方法)
三、实现封装操做?
① 方法的封装
对于一些只在类内部使用的方法,而不像对外部提供使用。那么,这样的方法咱们可使用private进行私有化处理。
private function formatName(){} //这个方法仅仅能在类内部使用$this调用
function showName(){
$this -> formatName();
}
② 属性的封装+set/get方法 为了控制属性的设置以及读取,能够将属性进行私有化处理,并要求用户经过咱们提供的set/get方法进行设置table
private $age;
function setAge($age){
$this->age = $age;
}
function getAge(){
return $this->age;
}
$对象 -> getAge();
$对象 -> setAge(12);
③ 属性的封装+魔术方法
private $age;
function __get($key){
return $this->$key;
}
function __set($key,$value){
$this->$key=$value;
}
$对象->age; // 访问对象私有属性时,自动调用__get()魔术方法,而且将访问的属性名传给__get()方法;
$对象->age=12; // 设置对象私有属性时,自动调用__set()魔术方法,而且将设置的属性名以及属性值传给__set()方法;
注意:在魔术方法中,可使用分支结构,判断$key的不一样,进行不一样操做。
四、关于封装的魔术方法:
① __set($key,$value):给类私有属性赋值时自动调用,调用时给方法传递两个参数:须要设置的属性名、属性值;
② __get($key):读取类私有属性时自动调用,调用时给方法传递一个参数:须要读取的属性名;
③ __isset($key):外部使用isset()函数检测私有属性时,自动调用。
>>> 类外部使用isset();检测私有属性,默认是检测不到的。false
>>> 因此,咱们可使用__isset();函数,在自动调用时,返回内部检测结果。
function __isset($key){
return isset($this->$key);
}
当外部使用isset($对象名->私有属性);检测时,将自动调用上述__isset()返回的结果!
④ __unset($key):外部使用unset()函数删除私有属性时,自动调用;
function __unset($key){
unset($this->$key);
}
当外部使用unset($对象名->私有属性);删除属性时,自动将属性名传给__unset(),并交由这个魔术方法处理。
未完待续 》》》》》》