PHP中oop面向对象基础知识(一)
| OOP 基础知识汇总(一) |
>>>你需要了解以下概念
面向对象&面向过程概念:
面向过程:专注于解决一个问题的过程。面向过程的最大特点,是由一个一个的函数去解决处理这个问题的一系列过程。
面向对象:专注于由哪个对象来处理一个问题。面向对象的最大特点,是有一个个具有属性和功能的类,从类中拿到对象,进而处理问题。
【面向对象】
1、什么是类?
具有相同属性(特征)和方法(行为)的一系列个体的集合,类是一个抽象的概念
2、什么是对象?
从类中,拿到的具有具体属性值的个体,称为对象。对象是一个具体的个体。
例如:人类,都有姓名、性别、年龄,但是这些属性都不能有具体的值。
张三,是人类中的一个对象!姓名张三、性别男、年龄23,将类的每一个属性具体赋值后,就成了张三这个对象。
3、类和对象的关系?
类是对象的抽象化!对象是类的具体化!
类仅仅表明这类对象有哪些属性,但是不能有具体的值,所以类是抽象的。
而对象,是将类的所有属性赋值后,产生的具体的个体,所有对象是具体的。
类的声明与实例化:
1、如何声明一个类:
class 类名{
访问修饰符 $属性[=默认值];
[访问修饰符] function 方法(){}
}
2、声明一个类的注意事项:
① 类名只能有字母数字下划线组成、开头不能是数字,必须符合大驼峰法则;
② 类名必须使用class修饰,类名后面一定不能有();
③ 属性必须要带访问修饰符,方法可以不带访问修饰符;
3、实例化对象及对象属性方法的调用?
$对象名 = new 类名(); //()可以不带
类外部调用属性和方法:
$对象名 -> 属性名; // 使用->调用属性时,属性名不能带$
类内部调用属性和方法:
$this -> 属性名;
构造函数:
1、什么是构造函数?
构造函数是类中的一个特殊函数,当我们使用new关键字实例化对象时,相当于调用了类的构造函数;
2、构造函数有什么作用?
实例化对象时,自动调用,用于给对象的属性赋初值!
3、构造函数的写法?
① 构造函数名,必须与类同名
[public] function Person($name){
$this -> name = $name;
}
② 使用魔术方法__construct
[public] function __construct($name=""){
$this -> name = $name;
}
4、构造函数注意事项:
① 第一种写法,构造函数名必须与类同名!!!!!!
② 如果一个类没有手写构造函数,则系统默认会有一个空参构造,因此可以使用new Person();
如果我们写了带参数的构造函数,则将不会再有空参构造,也就是不能直接使用new Person(); Person后面的()中的参数列表,必须符合构造函数的要求!!!
③ 如果两种构造函数同时存在,将使用__construct。
5、析构函数:__destruct():
① 析构函数在对象被销毁释放之前自动调用!
② 析构函数不能带有任何的参数
③ 析构函数常用于对象使用完以后,释放资源、关闭资源等!
6、魔术方法:
PHP中,给我们提供一系列用__开头的函数,这些函数无需自己手动调用,会在合适的时机自动调用,这类函数称为魔术函数。
例如:function __construct(){} 在类new一个对象时自动调用
function __destruct(){} 在对象被销毁时自动调用
我们要求,除了魔术方法之外,自定义的函数与方法不能使用__开头。
最后,一般对于功能比较复杂的类,我们会单独的写到一个类文件中。
类文件的命名,统一小写,使用“类名小写.class.php”的方式命名。
在其他文件中使用这个类时,可以用include导入这个.class.php文件
封装的基本概念
1、什么是封装?
通过访问修饰符,将类中不需要外部访问的属性和方法进行私有化处理,以实现访问控制。
注意:是实现访问控制,而不是拒绝访问。 也就是说,我们私有化属性之后,需要提供对应的方法,让用户通过我们提供的方法处理属性。
2、封装的作用?
① 使用者只关心类能够提供的功能,而不必关心功能实现的细节!(封装方法)
② 对用户的数据进行控制,防止设置不合法数据,控制返回给用户的数据(属性封装+set/get方法)
3、实现封装操作?
① 方法的封装
对于一些只在类内部使用的方法,而不像对外部提供使用。那么,这样的方法我们可以使用private进行私有化处理。
private function formatName(){} //这个方法仅仅能在类内部使用$this调用
function showName(){
$this -> formatName();
}
② 属性的封装+set/get方法 为了控制属性的设置以及读取,可以将属性进行私有化处理,并要求用户通过我们提供的set/get方法进行设置
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的不同,进行不同操作。
4、关于封装的魔术方法:
① __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(),并交由这个魔术方法处理。
未完待续 》》》》》》
PHP中oop面向对象基础知识(一)的更多相关文章
- c#中的面向对象基础知识总结
面向对象 1.面向过程----->面向对象 1. 面向过程:面向的是完成这件事儿的过程,强调的是完成这件事儿的动作. 面向对象:意在写出一个通用的代码,屏蔽差异. 我们在代码中描述一个对象,通 ...
- ASP.NET中的C#基础知识
ASP.NET中的C#基础知识 说明:asp.net作为一种开发框架现在已经广为应用,其开发的基础除了前端的html.css.JavaScript等后端最重要的语言支持还是C#,下面将主要用到的基础知 ...
- Python 面向对象基础知识
面向对象基础知识 1.什么是面向对象编程? - 以前使用函数 - 类 + 对象 2.什么是类什么是对象,又有什么关系? class 类: def 函数1(): pass def 函数2(): pass ...
- MySQL中索引的基础知识
本文是关于MySQL中索引的基础知识.主要讲了索引的意义与原理.创建与删除的操作.并未涉及到索引的数据结构.高性能策略等. 一.概述 1.索引的意义:用于提高数据库检索数据的效率,提高数据库性能. 数 ...
- day29—JavaScript中DOM的基础知识应用
转行学开发,代码100天——2018-04-14 JavaScript中DOM操作基础知识即对DOM元素进行增删改操作.主要表现与HTML元素的操作,以及对CSS样式的操作.其主要应用知识如下图: 通 ...
- javascript中BOM部分基础知识总结
一.什么是BOM BOM(Browser Object Document)即浏览器对象模型. BOM提供了独立于内容 而与浏览器窗口进行交互的对象: 由于BOM主要用于管 ...
- Jquery源码中的Javascript基础知识(三)
这篇主要说一下在源码中jquery对象是怎样设计实现的,下面是相关代码的简化版本: (function( window, undefined ) { // code 定义变量 jQuery = fun ...
- Java中浮点数的基础知识
偶然查看Math.round的JDK public static int round(float a) { if (a != 0x1.fffffep-2f) // greatest float val ...
- Android中的一些基础知识(三)
最近在回顾Android的基础知识,就把一些常见的知识点整理一下,以后忘了也可以翻出来看一看. 在TextView中显示图像(使用< img>标签) 在TextView中显示图片的方法有许 ...
随机推荐
- List泛型集合对象排序
本文的重点主要是解决:List<T>对象集合的排序功能. 一.List<T>.Sort 方法 () MSDN对这个无参Sort()方法的介绍:使用默认比较器对整个List< ...
- NetCore入门篇:(一)Net Core环境安装
一.下载Visual Studio 2017 1.下载地址:https://www.visualstudio.com/zh-hans/downloads/ 2.选择要下载的版本 二.安装Net Cor ...
- .Net Core2.0中使用ADO.NET
学习了解.NET CORE有段时间,没有用其做项目的主要原因就是这么多年积累的类库兼容问题.今天就先解决SqlHelper的兼容性: 建立类库,目标框架选择.NET Core2.0,复制粘贴代码. 问 ...
- UWP开发入门(六)——对多设备不同分辨率显示效果的讨论
本篇不涉及具体代码,而是把实际开发UWP APP的过程中,遇到的不同设备,不同分辨率显示效果差异的问题进行讨论.希望能够抛砖引玉,和各位擦出一些火花. 蜀黍我目前是在做一套牛逼的UWP APP啦,目标 ...
- iis部署 .net core webapi
iis部署 .net core webapi 1.修改应用程序池: IIS 发布站点,这里就不介绍 IIS 安装等.这里要修改的是应用程序池,选择“无托管代码”: 2.下载安装.net core托管捆 ...
- AOP面向切面的基石——动态代理(一)
其实动态代理在Java里不是什么新技术了,早在java 1.2之后便通过 java.lang.reflect.InvocationHandler 加入了动态代理机制. 下面例子中,LancerEvol ...
- Django 使用getattr() 方法获取配置文件的变量值
在django项目的开发过程中,有时需要获取配置文件里的变量值,可以通过下面这样的方式去进行获取 from django.conf import settings item = getattr(set ...
- 这几天bug多,自我检讨一下
这段时间(主要指4月底到5月初)写的bug超过以往总和,觉得很有必要停一下,找找原因.所谓前车之鉴后车之师,不能也不应该在同一地方跌倒N次吧: 为什么bug频出? 深究原因,并不是代码量大.功能多,反 ...
- module.export与export的区别?
对于大多数node初学者而言, module.exports应该都是理解的, 但多出来一个exports获取就有些疑问了 疑问一: 既然有module.exports了为什么还要有exports? 疑 ...
- thuwc2019总结
275,是我的自己的估分 而350,是面试线 就发挥而言,这次的发挥相当糟糕,第一天选择全场打暴力而不打签到题正解,第二天因A题思路想偏造成2h额外时间花费.第二题与第三题之间,我选择了难打的第三题而 ...