学习要点:

1、 OOP的封装

2、 OOP的继承

3、 OOP的多态

面向对象的三个主要特性是封装、继承和多态。

一、OOP的封装

隐藏对象的字段和实现细节,仅对外公开接口,控制在程序中字段的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成 一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。

字段的作用域 1.public 公共的 (类外可以访问) 2.private 私有的 (类内可以访问) 3.protected 受保护的 (类内和子类可以访问,类外不可访问) 其实也是私有的,权限不一样而已

创建使用了私有的字段,这样外部就无法访问了

1、类内和类外的概念

【参看demo1.php】

<meta charset="utf-8">

<?php

//创建一个电脑类

class Computer{

//什么叫做类内,就是创建类的两个花括号内的范围叫做类内,其他地方则叫做类外;

//public是字段的公有化,这个字段类外即可访问,赋值和取值;

public $_name;

}

$computer = new Computer(); //这就是类外;

$computer->_name = 'dell';

echo $computer->_name;

?>

2、类外无法访问类内私有字段

【参看demo2.php】

<?php

class Computer{ //大括号里面是类内;

//private是私有化,即对字段进行封装的操作,类外无法访问,取值和赋值都不能操作;

private $_name = '联想';

}

$computer = new Computer();

echo $computer->_name;

?>

3、类外如何访问类内私有字段——通过类内公有方法

【参看demo3.php】

<meta charset="utf-8">

<?php

class Computer{

private $_name = '联想';

//这个时候我采用一个公共对外的方法来访问私有字段

//因为私有字段只能在类内访问,而对外的公共方法是类内的。

//而且公共方式又是公共的,所以类外又可以访问。

public function _run(){

//字段在类内调用的时候必须是类->字段,而$_name只是普通变量而已

//字段在类外调用的方法是对象->字段,而类内就必须使用Computer->_name

//但是在本类中可以用一个关键字来代替Computer,那就是$this

echo $this->_name;

}

}

$computer = new Computer();

$computer->_run();

?>

4、类外对类内赋值和取值——通过设置公有赋值方法和公有取值方法

【参看demo4.php】

<meta charset="utf-8">

<?php

class Computer{

private $_name;

private $_model;

private $_cpu;

private $_keyboard;

private $_show;

private $_zb;

//必须写一个对内的入口,对私有字段进行赋值

public function setName($_name){ //public换成private就会报错

//通常约定俗成,字段是什么名字,你就取什么名字;

//这里的$_name只是一个变量而已,参数而已;

//$this->_name才是类的字段;

$this->_name = $_name;

}

//必须写个对外的入口,才可以取到;

public function getName(){

return $this->_name;

}

}

$computer = new Computer();

$computer->setName('dell');

echo $computer->getName();

?>

5、设置拦截器__set()和__get()实现类外对类内不同字段的赋值和取值

扩展思考:如果类中有很多个字段需要赋值和取值,是不是需要有很多方法来对其进行赋

值和取值呢?答案当然不是;PHP内置两个拦截器(两个方法)专门用于取值和赋值;

__set()和__get();(注意:是两个下划线)

【参看demo5.php】

<meta charset="utf-8">

<?php

class Computer{

private $_name;

private $_model;

private $_cpu;

//采用拦截器进行赋值和取值

//当类外的对象直接调用私有字段时,会跟着检查是否有拦截器;如果没有拦截器直接报错;如果有拦截器就直接拦截下来;

//如果直接对$_name进行赋值,那么__set()方法就会拦截住,就不会报错了;

//赋值

public function __set($_key,$_value){//$_key属性名,$_value属性值;

//那么$_key = '_name' ,那么 $_value = '联想'

//$this->_name = '联想'

//那么$_key = '_cpu', 那么$_value = '四核'

//$this->_cpu = '四核'

//那么$_key = '_model', 那么$_value = 'i7'

//$this->_model = 'i7'

$this->$_key = $_value;

}

//取值方法1:

/*

public function getName(){

echo $this->_name;

echo $this->_model;

echo $this->_cpu;

}

*/

public function __get($_key){

return $this->$_key;

//如果$_key = '_name',那么$this->_name

//如果$_key = '_model',那么$this->_model

//如果$_key = '_cpu',那么$this->_cpu

}

//有个疑问?如果拦截器是私有private,那会出错吗

//不出错!为什么都是私有的?类外还能访问呢?下节课讲解;

}

$computer = new Computer($_key); // new Computer($_key, $value);也可以如何分析??

$computer->_name = '联想';

$computer->_cpu = '四核';

$computer->_model = 'i7';

echo $computer->_name;

echo $computer->_model;

echo $computer->_cpu;

?>

6、设置拦截器__set()和__get()私有的,类外可以实现对类内字段的赋值和取值吗

【参看demo6.php】

<meta charset="utf-8">

<?php

class Computer{

private $_name;

private $_model;

private $_cpu;

//__set()和__get()方法私有了,还是可以执行,是因为目前程序的指针已经在类内了。而类内可以执行封装的方法;

//类内执行私有方法,不会出现任何错误;

//只需要间接的拦截就可以了。拦截是在类内执行的;

//说白了,__set和__get是PHP内置的方法,具有一定的特殊性;

private function __set($_key, $_value){

$this->$_key = $_value;

}

private function __get($_key){

return $this->$_key;

}

}

$computer = new Computer();

$computer->_name = '联想';

$computer->_model = 'i7';

$computer->_cpu = '四核';

echo $computer->_name;

echo $computer->_model;

echo $computer->_cpu;

?>

7、类中常量设置及访问

【参看demo7.php】

常量不是在堆区或栈区,它是在一个数据区中;

<?php

class Computer{

const NAME = 'DELL';//const 定义常量;

}

//常量的输出方法 类::常量 (两个冒号)

echo Computer::NAME;

$computer = new Computer();

$computer ::NAME;

?>

8、普通类字段和类方法在数值累加情况

静态类成员:有时候,可能需要创建供所有类实例共享的字段和方法,这些字段和方法与所有的类实例有关,但不能由任何特定对象调用;

静态类字段、静态类方法;

【参看demo8.php】

<?php

class Computer{

public $_count = 0;

public function _add(){

$this->_count++; //$count = $count +1 $count++

}

}

//做一个累计的效果

$computer1 = new Computer();

$computer1->_add();

echo $computer1->_count;

$computer1->_add();

echo $computer1->_count;

$computer1->_add();

echo $computer1->_count;

echo "<br/>";

$computer2 = new Computer();

$computer2->_add();

echo $computer2->_count;

$computer2->_add();

echo $computer2->_count;

$computer2->_add();

echo $computer2->_count;

?>

9、静态类字段访问方法

上面$_count代码如果设置成静态字段会如何?

静态字段是在一个特定的区域——数据区;静态区只有一个,它是共享的!!!

【参看demo9.php】

<?php

class Computer{

public static $_count=0;

public function _add(){

//如果是静态成员字段,那么就应该用self调用,而不是$this

self::$_count++; //注意:slef调用时候需要有$符号;$this调用的时候不需要有$符号

//普通方法必须实例化才能调用;

}

}

//echo Computer::$_count;

$computer1 = new Computer();

$computer1->_add();

$computer1->_add();

$computer1->_add();

echo Computer::$_count;

echo "<br/>";

$computer2 = new Computer();

$computer2->_add();

$computer2->_add();

$computer2->_add();

echo Computer::$_count;

?>

10、静态类字段和静态类方法的访问方法

【参看demo10.php】

<?php

class Computer{

public static $_count = 0;

public static function _run(){

self::$_count++;

}

}

//普通方法需要实例化才能使用;

//而静态方法不需要实例化直接能使用,不需要new;参看内存说明图;

Computer::_run();

Computer::_run();

Computer::_run();

Computer::_run();

echo Computer::$_count;

?>

11、instanceof关键字使用方法

instanceof关键字:可以确定一个对象是类的实例、类的子类还是实现了某个特定的接口,并进行相应的操作;

【参看demo11.php】

<?php

class Computer{

}

$computer = new Computer();

//左边写上对象的名字,右边写上类的名字

echo ($computer instanceof Computer);

//返回值是1表示真,1表示假;

?>

转载于:https://www.cnblogs.com/hcrk/p/10788374.html

学习oop知识之OOP的封装相关推荐

  1. java oop入门_Java OOP入门起源

    1.对象的成员 a.成员属性 作用:在java中为某个对象提供描述信息. 语法:对象名.属性名; b.成员方法 作用:在java程序中为对象提供行为能力的一种表现. 语法:对象名.方法名(参数列表); ...

  2. java有哪些部分要学_java需要学习哪些知识

    原标题:java需要学习哪些知识 现在学习java的人越来越多,但是很多人学习java完全是混乱的,没有一点规划.其实java学习就是从简单到难的一个过程,java的基础很重要,所以一定要由最基础的学 ...

  3. 知识图谱·概念与技术--第1章学习笔记--知识图谱概述--知识图谱的概念,与传统语义网络的区别

    知识图谱·概念与技术--第1章学习笔记--知识图谱概述--知识图谱的概念,与传统语义网络的区别 知识图谱的概念,与传统语义网络的区别 狭义概念 作为语义网络的内涵 与传统语义网络的区别 优点 缺点 与 ...

  4. Java开发需要学习哪些知识?初学者怎么学好Java开发?

    根据IDC的统计数字,在所有软件开发类人才的需求中,对Java工程师的需求达到全部需求量的60%~70%,对软件开发人才的需求达到了20%,还同时以每年20%的速度在增长.由此,我国不仅在软件开发人才 ...

  5. Python自动化测试学习哪些知识?

    Python自动化测试学习哪些知识?先学习自动化测试基础,学习Appium操作,元素定位.操作.等待.滑动等,深入讲解PO.unittest.yaml.配置文件.测试报告等知识,基于关键字驱动.Pyt ...

  6. Java开发需要学习哪些知识?小白怎么学好Java开发?

    根据IDC的统计数字,在所有软件开发类人才的需求中,对Java工程师的需求达到全部需求量的60%~70%,对软件开发人才的需求达到了20%,还同时以每年20%的速度在增长.由此,我国不仅在软件开发人才 ...

  7. STM32学习——基础知识

    STM32学习--基础知识 1. 芯片运作原理 ICode用于读取Flash中的指令(就是编写的代码)ICode一条条读取代码然后执行 DCode:读取数据数据分为常量与变量,常量存在Flash中,变 ...

  8. 基础元件学习——发光二极管知识

    系列文章目录 本系列文章是我在学习电路基础知识过程中顺道记录下一些重点,感觉比较新颖,遂记之. 本文为基础元件学习中的一部分 基础元件学习--元器件学习内容了解 基础元件学习--电阻元件知识(一) 基 ...

  9. 分享:个人是怎么学习新知识的

    为什么80%的码农都做不了架构师?>>>    挺多童鞋问我是怎么学习新知识的,干脆写篇文章总结一下,希望对大家有所帮助.对照书.技术博客.极客时间等学习的方式我就不说了. 一.早期 ...

最新文章

  1. 不是语言之争---Go vs Erlang
  2. 在MATLAB中实现对MySQL数据库的操作
  3. mysql Range按时间分区问题 Table has no partition for value 737669
  4. Collections.sort()自定义排序方式
  5. Centos安装JDK(java环境)
  6. android语言切换快捷键,Android的语言设置两种方法
  7. c++实现rsa算法_RSA简介
  8. php版主动推送,织梦php主动推送完整实例(单篇推送版本)
  9. 软件测试 vs 软件实施,哪个工作好?
  10. HashMap的底层简单理解
  11. 【工具分享】一个阿里出品的免费在线图表制作工具(ChartCube 图表魔方)
  12. vue-Observe、Dep、Watcher
  13. 有效沟通bic法则_有效沟通bic法则_合格职场人都会的3个有效的沟通法则
  14. Java Swing 制作一个Pong小游戏
  15. 入魂一番赏android,入魂一番赏APP
  16. Tensorflow 2.* 网络训练(二) fit(x, y, batch_size, epochs, verbose, validation_split, initial_epoch... )
  17. 微信支付应用签名大小写、errorCode=-6,errorCode=-1
  18. Freeswitch 180与183
  19. layui表格重载后界面闪动解决方案
  20. 深圳湾口岸过关进入香港的交通方法

热门文章

  1. flex页面布局练习--知乎
  2. 11.14PMP试题每日一题
  3. java中VO、PO、DTO 、DO、POJO、BO、TO
  4. 罗杰斯:做你喜欢的工作,你会变成个有钱人
  5. 【HRS项目】Axure兴许问题解决---与SVN结合
  6. PAT (Advanced Level) 1002. A+B for Polynomials (25)
  7. [跟我一起涨姿势]未注册服务的RHEL6.4使用网易的CentOS源
  8. 我的模块加载系统 v17的入门教程2
  9. 修复boot分区文件被删除的方法
  10. 网络安全隐性杀手:三类危险的TXT文件