`

第18章 面向对象的特性

 
阅读更多

Demo1.php

<?php
	header('Content-Type:text/html; charset=utf-8;');
	//创建一个电脑类
	class Computer {
		//什么叫做类内,就是创建类的花括号内的范围叫做类内,其他地方则类外。
		//public 是对字段的公有化,这个字段类外即可访问,赋值和取值
		public $_name = '联想';
	}
	$computer = new Computer();
	$computer -> _name = 'Dell';
	echo $computer->_name;
?>

 

Demo2.php

<?php
	header('Content-Type:text/html; charset=utf-8;');
	class Computer {
		//private 是私有化,即对字段进行封装的操作,类外无法访问,取值和赋值都不能操作
		private  $_name = '联想';
	}
	$computer = new Computer();
	echo $computer->_name;
?>

 

Demo3.php

<?php
	header('Content-Type:text/html; charset=utf-8;');
	class Computer {
		private  $_name = '联想';
		//这个时候我采用一个公共对外的方法来访问私有字段
		//因为私有字段只能在类内访问,而对外的公共方法是类内的。
		//更而公共方法又是公共的,所以类外又可访问。
		public function _run(){
			//字段在类内调用的时候必须是类 -> 字段,而$_name只是一个普通变量而已。
			//字段在类外调用的方法是对象 -> 字段,而类内就必须使用 Computer -> _name
			//但是在本类中,可以使用一个关键字来代替字来代替 Computer ,那就是 $this
			echo $this ->_name;
		}
	}
	$computer = new Computer();
	$computer -> _run();
?>

 

Demo4.php

<?php
	header ( 'Content-Type:text/html; charset=utf-8;' );
	class Computer {
		private $name;
		private $model;
		private $cpu;
		private $keyboard;
		private $show;
		private $zb;
		//必须写个对外的入口,才可以取到
		public function getName() {
			return $this->name;
		}
		//必须写一个对内的入口,对私有字段进行赋值
		public function setName($name) {
			//这里的 $name 只是一个变量而已,参数而已
			//$this->name 才是类的字段
			$this->name = $name;
		}
	
	}
	$computer = new Computer ();
	echo $computer->getName();
	$computer->setName('Dell');
	echo $computer->getName();
?>

 

Demo5.php

<?php
	header ( 'Content-Type:text/html; charset=utf-8;' );
	class Computer {
		private $_name;
		private $_model;
		private $_cpu;
		//当类外的对象直接调用私有字段时,会跟着去检查是否有拦截器,
		//如果直接对 $_name 进行赋值,那么__set 方法就会拦截住,就不会报错了。
		//采用拦截器进行赋值和取值
		//赋值
		private function __set($_key,$_value){
			//采用$_key = '_name',那么 $_value = '联想';
			//$this ->_name = '联想';
			$this ->$_key = $_value;
		}
		//取值
		private function __get($_key){
			return $this -> $_key;
			//如果 $_key = '_name' 那么 $this -> _name;
			//如果 $_key = '_cpu' 那么 $this -> _cpu;
			//如果 $_key = '_model' 那么 $this -> _model;
		}
	}
	$computer = new Computer ();
	$computer->_name = '联想';
	$computer->_cpu = '四核';
	$computer->_model = 'i7';
	echo $computer->_name;
	echo $computer->_cpu;
	echo $computer->_model;
?>

 

Demo6.php

<?php
	header ( 'Content-Type:text/html; charset=utf-8;' );
	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->_cpu = '四核';
	$computer->_model = 'i7';
	echo $computer->_name;
	echo $computer->_cpu;
	echo $computer->_model;
?>

 

Demo7.php

<?php
	header ( 'Content-Type:text/html; charset=utf-8;' );
	class Computer {
		const NAME = 'DELL';
	}
	//常量的输出方法 类::常量
	echo Computer::NAME;		//DELL
?>

 

Demo8.php

<?php
	header ( 'Content-Type:text/html; charset=utf-8;' );
	class Computer {
		public $_count = 0;
		public function _add(){
			$this -> _count++;	//$_count = $_count+1  $_count++
		}
	}
	//做一个累计的效果
	$computer1 = new Computer();
	$computer1 ->_add();
	$computer1 ->_add();
	$computer1 ->_add();
	echo $computer1 -> _count;
	echo '<br />';
	$computer2 = new Computer();
	$computer2 ->_add();
	$computer2 ->_add();
	$computer2 ->_add();
	echo $computer2 -> _count;	
?>

 

Demo9.php

<?php
	header ( 'Content-Type:text/html; charset=utf-8;' );
	class Computer {
		public static  $_count = 0;
		public function _add(){
			//如果是静态成员字段,那么就应该用 self 来调用,而不是 $this
			self::$_count++;
		}
	}
	//做一个累计的效果
	$computer1 = new Computer();
	$computer1 ->_add();
	echo Computer::$_count;
	$computer1 ->_add();
	echo Computer::$_count;
	$computer1 ->_add();
	echo Computer::$_count;
	echo '<br />';
	$computer2 = new Computer();
	$computer2 ->_add();
	echo Computer::$_count;
	$computer2 ->_add();
	echo Computer::$_count;
	$computer2 ->_add();
	echo Computer::$_count;
?>

 

Demo10.php

<?php
	header ( 'Content-Type:text/html; charset=utf-8;' );
	class Computer {
		public static  $_count = 0;
		public static function _add(){
			self::$_count++;
		}
	}	
	Computer::_add();
	Computer::_add();
	Computer::_add();
	echo Computer::$_count;
?>

 

Demo11.php

<?php
	header ( 'Content-Type:text/html; charset=utf-8;' );
	class Computer {
	}	
	$computer = new Computer();
	echo $computer instanceof  Computer;
?>

 

Demo12.php

<?php
	header ( 'Content-Type:text/html; charset=utf-8;' );
	//这是父类,电脑类
	class Computer {
		public $_name = '联想';
		public function _run(){
			echo '联想在运行!';
		}
	}
	//子类,笔记本电脑类
	class NoteComputer extends Computer {
		
	}
	$noteComputer = new NoteComputer();
	echo $noteComputer -> _name;
	$noteComputer -> _run();
?>

 

Demo13.php

<?php
	header ( 'Content-Type:text/html; charset=utf-8;' );
	class Computer {
		public $_name = '联想';
		public function _run(){
			echo '联想在运行!';
		}
	}
	class NoteComputer extends Computer {
		//我不需要父类的字段和方法,那么可以采用重写的方法覆盖掉父类的字段和方法
		public $_name = 'Dell';
		public function _run(){
			echo 'Dell在运行!';
		}
	}
	$noteComputer = new NoteComputer();
	echo $noteComputer -> _name;
	$noteComputer -> _run();
?>

 

Demo14.php

<?php
	header ( 'Content-Type:text/html; charset=utf-8;' );
	class Computer {
		//私有化,但是无法被子类继承,这个时候就应该用受保护的修饰符来封装
		protected  $_name = '联想';
		protected function _run(){
			return  '联想在运行!';
		}
	}
	class NoteComputer extends Computer {
		public function getTop() {
			echo $this->_name;
			echo $this->_run();
		}
	}
	$noteComputer = new NoteComputer();
	$noteComputer -> getTop();
?>

 

Demo15.php

<?php
	header ( 'Content-Type:text/html; charset=utf-8;' );
	class Computer {
		public $_name = '联想';
		public function _run(){
			return  '联想在运行!';
		}
	}
	class NoteComputer extends Computer {
		//我子类已经覆盖了父类的字段和方法,
		//但是我又要调用父类的字段和方法,那怎么办呢?
		public $_name = 'Dell';
		public function _run(){
			echo 'Dell在运行!';
			echo parent :: _run();
		}
	}
	$noteComputer = new NoteComputer();
	echo $noteComputer -> _name;
	$noteComputer -> _run();
	//DellDell在运行!联想在运行!
?>

 

Demo16.php

<?php
	header ( 'Content-Type:text/html; charset=utf-8;' );
	//final 如果加在类前面,表示这个类不能被继承
//	final class Computer {
//	}
	class Computer {
		//final 如果加在方法前面,表示不能够重写些方法
		final public function _run(){
			
		}
	}
	class NoteComputer extends Computer {
		public function _run(){
			
		}
	}
	$noteComputer = new NoteComputer();
?>

 

Demo17.php

<?php
	header ( 'Content-Type:text/html; charset=utf-8;' );
	//创建一个抽象类,只要在 class 前面加上 abstract 就是抽象类了
	//抽象类不能够被实例化,就是创建对象
	//只在类里面有一个抽象方法,那么这个类必须是抽象类,类前面必须加上 abstract
	abstract class Computer {
		public $_name = '联想';
		//抽象类里创建一个抽象方法
		//抽象方法不能够实现方法体的内容
		abstract public function _run();
		//我在抽象类里能否创建一个普通方法
		public function _run2(){
			echo '我是父类的普通方法';
		}
	}
	//类不能够实现多继承,只支持单继承。
	//抽象类是给子类用来继承的,实现一种规范和资源的共享
	class NoteComputer extends Computer {
		//抽象类的抽象方法,子类必须重写,不然会报错。
		//抽象类里的普通方法不需要重写,子类会直接继承下来
		public function _run(){
			echo '我是子类的方法';
		}
	}
	$noteComputer = new NoteComputer();
	$noteComputer -> _run();
	$noteComputer -> _run2();
	echo $noteComputer -> _name;
?>

 

Demo18.php

<?php
	/*
	 * 到底应该用抽象类还是接口呢
	 * 如果你要继承多个接口的方法规范,那么就用接口好了。
	 * 如果你要共享一个方法体内容,那么就用抽象类。
	 * */
	header ( 'Content-Type:text/html; charset=utf-8;' );
	//创建一个接口
	//接口也不能被实例化
	//接口是为了规范实现它的子类,以达到统一的目的。也可以共享数据
	interface Computer {
		//成员字段必须是变量
		const  NAME = '成员 ';
		//接口里的所有方法都是抽象方法,不能够写方法体
		//并且接口的抽象方法不需要写 abstract
		public function _run();
		public function _run2();
	}
	interface Computer2 {
		public function _run3();
	}
	//子类继承接口的说法,叫做实现,接口可以多实现
	class NoteComputer implements Computer,Computer2 {
		public function _run() {
			echo '我重写了run';
		}
		public function _run3() {
			echo '我重写了run3';	
		}
		public function _run2() {
			echo '我重写了run2';	
		}
	}
	$noteComputer = new NoteComputer();
	$noteComputer -> _run();
	$noteComputer -> _run2();
	$noteComputer -> _run3();
	echo NoteComputer::NAME;
	//接口 :: 常量
	//echo Computer::NAME;
?>

 

Demo19.php

<?php
	header ( 'Content-Type:text/html; charset=utf-8;' );
	//什么叫做多态,字面意思,多种形态
	//一个动作由不同的人去执行,而产生不同的效果或者效果,即为多态。
	//一个人通过不同的状态去执行同一种动作,形成不同的效果,也可以称作为多态。
	//园丁		剪		修理花草
	//理发师	剪		理发
	//总裁		剪		裁员
	//人		笔记本		运行  win7开机了
	//人		台式机		运行  xp开机了
	
	//创建一个接口,来规范运行的方法
	interface Computer {
		public function version();	//这个方法表示采用什么电脑
		public function work();		//这台电脑是怎么运行的
	}
	//创建一个笔记本的类实现接口
	class NoteComputer implements Computer {
		public function version() {
			echo '笔记本';
		}
		public function work() {
			echo '可以便携式运行 win7';
		}
	}
	//创建一个台式机的类实现接口
	class DesktopComputer implements Computer {
		public function version() {
			echo '台式机';
		}
		public function work() {
			echo '在工作站运行 XP';
		}
	}
	//创建一个用户
	class Person {
		//创建一个方法来接受电脑(笔记本电脑,也可以是台式电脑)
		//怎么接受,将他们的对象传进来就 OK 啦。
		public function _run($type) {
			echo '这个人的';
			$type -> version();
			$type ->work();
		}
	}
	//多态的原理,就是类都写好了,不要去修改它,只要在类外的调用参数的更改
	//而最后的结果也会得到更改,那么这个就是多态。
	//有一个接口,两个类,一个是笔记本的类,一个是台式机的类
	//创建了笔记本
	$noteComputer = new NoteComputer();
	//创建台式机
	$desktopComputer = new DesktopComputer();
	//创建一个人
	$person = new Person();
	//使用电脑
	$person -> _run($noteComputer);	//这种传递,叫做对象引用的传递
	
?>

 

 

 

 

分享到:
评论

相关推荐

    第十八章 面向对象的数据库系统.ppt

    本章主要介绍了面向对象的数据库系统(OODBMS)的核心概念和应用。 首先,面向对象程序设计方法是OODBMS的基础。这种编程方法将现实世界中的实体抽象为对象,每个对象包含数据结构(变量集合)和操作(方法集合)。...

    面向对象编程:C++与Java比较教程 英文版

    第18章深入探讨了面向对象的多线程编程,这是现代编程中的一个重要主题,特别是对于需要并发执行的任务。 第19章讨论了网络编程,即如何使用C++和Java进行网络通信。 第20章讲述了数据库编程,包括使用C++和Java...

    面向对象程序设计(李爱华)

    首先,从第二章“C++语言基础”开始,我们了解到C++是C语言的扩展,增加了类和对象等面向对象特性。C++支持结构化编程,同时引入了类的概念,使得数据和函数能够封装在一起,形成一个完整的抽象实体——对象。C++的...

    Python面向对象编程指南

    Python面向对象编程指南深入介绍Python语言的面向对象特性,全书分3个部分共18章。第1部分讲述用特殊方法实现Python风格的类,分别介绍了__init__()方法、与Python无缝集成—基本特殊方法、属性访问和特性及修饰符、...

    C++面向对象程序设计第6版答案

    《C++面向对象程序设计第6版答案》是学习C++编程的重要参考资料,它涵盖了第六版教材中的关键概念和练习解答。这份资源包含了从Chapter02到Chapter18的各个章节习题答案,帮助读者深入理解和掌握面向对象编程的核心...

    VisualC++面向对象与可视化程序设计(第2版)课后习题程序代码

    这个压缩包文件包含的是从第四章到第十四章的程序代码,这意味着我们可以从中学习到一系列关键的面向对象编程和可视化设计的概念。下面,我们将详细讨论这些章节可能涉及的知识点: 1. **第四章:面向对象编程基础*...

    面向对象程序设计基础(C++)

    最后,第十一章和第十二章可能探讨C++标准库的使用,特别是STL(Standard Template Library),包括容器(如vector、list、set)、迭代器、算法和函数对象等,这些都是高效编程的重要工具。 中山大学的这个教程通过...

    《面向对象程序设计》实验指导书(修订日期:2015.11.18).doc

    C++是C语言的扩展,增加了类、继承、多态和模板等面向对象特性。理解内存管理(堆和栈)、指针操作、异常处理以及标准模板库(STL)是掌握C++的关键。 1.4 VC2010中初学者常见错误、警告和问题 初学者常遇到的问题...

    PHP程序设计第2版

    第18章 会话处理器 第19章 用Smarty模板化 第20章 Web服务 第21章 安全PHP编程 第22章 SQLite 第23章 PDO介绍 第24章 MySQL介绍 第25章 安装和配置MySQL 第26章 众多MySQL客户端 第27章 MySQL存储引擎和数据类型 第...

    面向对象程序实用用教程

    面向对象编程(Object-Oriented Programming,简称OOP)是一种重要的编程范式,它基于“对象”的概念,通过封装、继承和多态等核心特性,实现了代码的复用和模块化。以下是对给定标题和描述中涉及的知识点的详细说明...

    Java技术教程.基础篇

    第五章 java语言中的面向对象特性 第六章 数组 第七章 字符串处理 第八章 异常处理 第九章 java输入、输出及文件操作 第十章 对象串行化 第十一章 线程 第十二章 图形用户界面 第十三章 用Swing创建用户界面 第十四...

    C++基础(面向对象语言).pdf

    C++是一种强大的、通用的编程语言,以其面向对象特性而著名,同时也支持过程化编程和泛型编程。它是C语言的扩展,由Bjarne Stroustrup在1983年设计并发展起来,旨在提供更高级别的抽象和更高效的程序设计能力。 **...

    Visual C#.NET从入门到精通

    第5章 面向对象的编程 第6章 类和对象 第7章 派生类 第8章 接口 第9章 字符串、日期、时间和时间段 第10章 数组和索引器 第11章 集合 第12章 委派和事件 第13章 异常与调试 第二部分 高级C#编程 第14章 线程 第15章 ...

    C++Primer 第四版课后习题解答(第1~18章完整答案)完整版

    第十二章“类和数据抽象”介绍了面向对象编程的基础,如封装、继承和多态。习题解答将涉及类的设计、对象的创建和使用,以及虚函数和抽象类的应用。 第十三章“复制控制”讲解了构造函数、析构函数、拷贝构造函数和...

    Java开发详解.zip

    020501_【第5章:面向对象基础】_面向对象、类与对象的定义笔记.pdf 020502_【第5章:面向对象基础】_类与对象的进一步研究笔记.pdf 020503_【第5章:面向对象基础】_封装性笔记.pdf 020504_【第5章:面向对象基础】...

    C++ 面向对象教程 21 courses#

    第1章 对象的演化 1 1.1 基本概念 1 1.1.1 对象:特性+行为 1 1.1.2 继承:类型关系 1 1.1.3 多态性 2 1.1.4 操作概念:OOP程序像什么 3 1.2 为什么C++会成功 3 1.2.1 较好的C 3 1.2.2 采用渐进的学习方式 4 1.2.3 ...

Global site tag (gtag.js) - Google Analytics