`

第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);	//这种传递,叫做对象引用的传递
	
?>

 

 

 

 

分享到:
评论

相关推荐

    PYTHON 面向对象编程指南

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

    深入PHP面向对象、模式与实践 (第2版)

    书中主要介绍了如何使用面向对象技术和设计...使用CVS进行版本控制第18章 使用PHPUnit进行测试第19章 用Phing实现项目的自动构建第五部分 结论第20章 对象、模式与实践第六部分 附录附录A 参考文献附录B 简单的解析器

    Python面向对象编程指南

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

    PHP程序设计第2版

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

    Python基础编程与实践教案第二十六课时Python面向对象编程(下).doc

    教学内容 本课时讲授内容为第八章 《Python面向对象编程》的第四节继承的5小节和第五节的1小节: 1. 使用继承 2. 抽象基类 3. 多态 4. 多重继承 5. 混合继承 1. 运算符重载 3. 教学计划 1. 回顾上节教学内容,复习...

    Java技术教程.基础篇

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

    Visual C#.NET从入门到精通

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

    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 ...

    《Delphi6应用开发指南》PDF书

    目录----------第01章_走进Delphi.pdf第02章_学好面向对象的Pascal.pdf第03章_Delphi 体系结构的关键类.pdf第04章_定义多态和动态过程.pdf第05章_集合、常数与运行时类型信息编程.pdf第06章_接口的奥秘.pdf第07章_...

    PHP程序设计(第2版) 英文

    第1章 PHP概述 第2章 安装配置Apache和PHP&lt;br&gt;第3章 PHP基础 第4章 函数 第5章 数组 第6章 面向对象的PHP&lt;br&gt;第7章 高级OOP特性 第8章 错误和异常处理 第9章 字符串和正则表达式 第10章 处理...

    《高质量程序设计指南》林锐.rar

    第十二章 C++函数的高级特性 第十三章 类的构造函数、析构函数与赋值函数 第十四章 C++ STL应用编程建议 第十五章 其它编程经验 参考文献 第三部分 附录 附录 A:C++/C 试题 附录 B:C++/C 试题的答案与评分标准 ...

    PHP与MySQL程序设计(带完整书签)

    第18 章 会话处理程序 280 第19 章 用smarty 模板化 296 第20 章 web 服务 314 第21 章 保护网站安全 326 第22 章 用jquery 和php 创建ajax增强特性 334 第23 章 构建面向全世界的网站 343 第24 章 zend 框架介绍 ...

    修改代码的艺术

    第19章 对非面向对象的项目,如何安全地对它进行修改 第20章 处理大类 第21章 需要修改大量相同的代码 第22章 要修改一个巨型方法,却没法为它编写测试 第23章 降低修改的风险 第24章 当你感到绝望时 第25章 解依赖...

    Delphi 6应用开发指南

    第2章 学好面向对象的Pascal.doc 第3章 Delphi体系结构的关键类.doc 第4章 定义多态和动态过程.doc 第5章 集合、常数与运行时类型信息编程.doc 第6章 接口的奥秘.doc 第7章 抽象类和静态接口.doc 第8章 高级特性编程...

    《C++ Primer中文版(第3版)》(Stanley B. Lippman[美]、Josee Lajoie[美] 著,潘爱民、张丽 译)

    第八章 域和生命期 …… 第四篇 基于对象的程序设计 第十三章 类 第十四章 类的初始化、赋值和析构 …… 第五篇 面向对象的程序设计 第十七章 类继承和子类型 …… 英汉对照索引 ——《豆瓣读书》

    完整版 Java开发实训课程系列-Java高级应用编程 第6章 Java7新特性(共16页).ppt

    【完整课程列表】 完整版 Java开发实训课程系列-Java高级应用编程 第1章 工具类(共65页).ppt 完整版 Java开发实训课程系列-Java...完整版 Java开发实训课程系列-Java高级应用编程 第6章 Java7新特性(共16页).ppt

Global site tag (gtag.js) - Google Analytics