首页 > 其他分享 >第二章 面向对象的特性

第二章 面向对象的特性

时间:2023-06-26 22:36:30浏览次数:36  
标签:php name 特性 echo 面向对象 add computer new 第二章


demo1.php

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

 

demo2.php

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

 

demo3.php

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

 

demo4.php

<?php
	class Computer {
		private $_name;
		private $_model;
		private $_cpu;
		private $_keyboard;
		private $_show;
		private $_zb;
		//必须写一个对内的入口,对私有字段进行赋值
		public function setName($_name) {
			//这里的$_name只是一个变量而已,参数而已
			//$this->_name才是类的字段
			$this->_name = $_name;
		}
		//必须写个对外的入口,才可以取到
		public function getName() {
			return $this->_name;
		}
	}
	$computer = new Computer();
	$computer->setName('dell');
	echo $computer->getName();
?>

 

demo5.php

<meta charset="UTF-8">
<?php
	class Computer {	
		private $_name;
		private $_model;
		private $_cpu;
		//当类外的对象直接调用私有字段时,会跟着去检查是否有拦截器,
		//如果直接对$_name进行赋值,那么__set()方法就会拦截住,就不会报错了。
		//采用拦截器进行赋值和取值

		//赋值
		public function __set($_key,$_value) {
			//那么$_key = '_name',那么$_value = '联想';
			//$this->_name = '联想'
			//那么$_key = '_cpu',那么$_value = '四核'
			//$this->_cpu = '四核'
			//那么$_key = '_model',那么$_value = 'i7'
			//$this->_model = 'i7'
			$this->$_key = $_value;
		}
		
		//取值
		public 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

<meta charset="UTF-8">
<?php
	class Computer {	
		private $_name;
		private $_model;
		private $_cpu;
		//__set()和__get()方法私有了,还是可以执行,是因为
		//因为目前程序的指针已经在类内了。而类内可以执行封装的方法
		//类内执行私有方法,不会出现任何错误。
		//它只需要间接的拦截就可以了。拦截是在内类执行的。
		//所白了,__set()和__get()是PHP内置的方法,具有一定的特殊性
		public function __set($_key,$_value) {
			$this->$_key = $_value;
		}
		public 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
	class Computer {	
		const NAME = 'DELL';
	}
	//常量的输出方法  类::常量
	echo Computer::NAME;
?>

 

demo8.php

<?php
	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
	class Computer {	
		public static $_count = 0;
		public function _add() {
			//如果是静态成员字段,那么就应该用self来调用,而不是$this
			self::$_count++;
		}
	}
	//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;
?>

 

demo10.php

<?php
	class Computer {	
		public static $_count = 0;
		public static function _run() {
			self::$_count++;
		}
	}
	Computer::_run();
	Computer::_run();
	Computer::_run();
	Computer::_run();
	echo Computer::$_count;
?>

 

demo11.php

<?php
	class Computer {	
	}
	$computer = new Computer();
	echo ($computer instanceof Computer); 
?>

 

demo12.php

<meta charset="UTF-8">
<?php
	//这是父类,电脑类
	class Computer {	
		public $_name = '联想';
		public function _run() {
			echo '联想在运行!';
		}
	}
	//子类,笔记本电脑类
	class NoteComputer extends Computer {
	}
	$notecomputer = new NoteComputer();
	echo $notecomputer->_name;
	$notecomputer->_run();
?>

 

demo13.php

<meta charset="UTF-8">
<?php
	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

<meta charset="UTF-8">
<?php
	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

<meta charset="UTF-8">
<?php
	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();
?>

 

demo16.php

<?php
	//final如果加在类前面,表示这个类不能被继承	
//	final class Computer {
//		
//	}
	class Computer {
		//final如果加在方法前面,表示不能够重写此方法。
		final public function _run() {		
		}
	}
	class NoteComputer extends Computer {
		public function _run() {
			
		}
	}
?>

 

demo17.php

<meta charset="UTF-8">
<?php
	//创建一个抽象类,只要在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->_run2();
	echo $notecomputer->_name;
?>

 

demo18.php

<meta charset="UTF-8">
<?php
	//到底应该用抽象类还是接口呢
	//如果你要继承多个类的方法规范,那么就用接口好了。
	//如果你要共享一个方法体内容,那么就用抽象类。
	//创建一个接口
	//接口也不能被实例化
	//接口是为了规范实现它的子类,以达到统一的目的。也可以共享数据
	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 _run2() {
			echo '我重写了run2';
		}
		public function _run3() {
		}
	}
	$notecomputer = new NoteComputer();
	$notecomputer->_run();
	//接口::常量
	//echo Computer::NAME;
?>

 

demo19.php

<meta charset="UTF-8">
<?php
	//什么叫做多态,字面意思,多种形态
	//一个动作由不同的人去执行,而产生不同的效果或者结果,即为多态。
	//一个人通过不同的状态去执行同一种动作,形成不同的结果,也可以称作为多态。
	//园丁              剪              修理花草
	//理发师          剪               理发
	//总裁              剪               裁员
	//人            笔记本             运行            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);  //这种传递,叫做对象引用的传递
?>

 

 

 

 

 

标签:php,name,特性,echo,面向对象,add,computer,new,第二章
From: https://blog.51cto.com/u_16171388/6558641

相关文章

  • 第一章 面向对象的基础
    Demo1.php<?php //怎样去创建一个类格式:修饰符class类名{} //我们去创建一个电脑的类,这类可以创建出对象(生产出电脑) classComputer{//类名第一个字母大写 } //创建一台电脑出来,也就是对象的声明 //格式:变量=new类名() //newComputer()表示实例化的过程(意思......
  • 第三章 面向对象的工具
    computer.class.php<?php classComputer{ public$_name='dell'; publicfunction_run(){ echo'运行'; } }?> person.class.php<?php classPerson{ }?> demo1.php<metacharset="UTF-8"><?php ......
  • 绑定方法与非绑定方法、隐藏属性、property装饰器、面向对象的三大特征
    绑定方法绑定给对象的方法特殊之处:函数的第一个形参self就是对象自己。绑定给对象的方法就会有对象来调用,会把对象自己当成第一个参数传给第一个形参self类调用,就需要传参数,方法里面有几个参数就要传几个参数classStudent():school='SH'#类的属性def_......
  • C++11特性简单介绍
    自动类型推导autoautox=10;//推导x为int类型autostr="Hello";//推导str为constchar*类型基于范围的For循环for(int&i:someDataStructure){doSomething();}for(inti:someDataStructure)doSomething();在上面的两个for循环中,第一个使用引用,第二个启用按......
  • 面向对象之对象的三大特性
    一、封装封装是一种将数据和相关方法组合成一个单独的实体的机制。它将数据(属性)和操作数据的方法(方法)封装在一个对象中,并对外部代码隐藏了内部的实现细节。通过封装,对象可以提供一个公共接口,使得外部代码可以通过该接口访问和操作对象的数据,而不需要了解其内部的具体实现。二、......
  • G-LAB 带你了解 RHEL 9 新特性
    OpenSSH:新增禁止root的密码登录Cockpit:RHEL的Web控制台DNF-3:软件安装方法NetworkManager:网络管理的主要组件Nftables:默认的用户空间防火墙WireGuard:快速、安全的VPN隧道(技术预览)Podman&Skopeo:新一代容器运行时与镜像搬运工具LVM-VDO:以逻辑卷形式使用VDORHEL9新特性与演......
  • 采用永磁同步模型的电流预测控制和滑模控制来提高系统的鲁棒性和稳态特性。滑模控制器
    采用永磁同步模型的电流预测控制和滑模控制来提高系统的鲁棒性和稳态特性。滑模控制器结合了新型趋近律和扰动观测器,以实现更好的控制效果。电流环使用了预测控制双矢量改进算法,以提高控制精度和响应速度。涉及的知识点和领域范围:原创文章,转载请说明出处,资料来源:http://imgcs.cn/......
  • java 8新特性 list转map
    List<Object> 转Map<String,List<String>>Map<String,List<String>>skillAndList=list.stream().collect(Collectors.groupingBy(Employee::getSkillId,Collectors.mapping(Employee::getStudent,Collectors.toList())));List<Obje......
  • AI绘画:Roop插件的特性与安装!
    交叉”学科”来了! 我们之前讲过可以实现单图换脸的Roop,也讲过可以通过文字描述画画的项目Stable-Diffusion-WebUI。现在这两者要通过sd-webui-roop产生交汇。我们先来简单的看一下这个插件可以干什么!   功能特点根据项目作者的说法,这个插件基于r......
  • JavaScript1.8.5新特性系列Object.keys
    以前在js-object这个分类里面也写过keys相关的api 在JavaScript1.8.5中,加入了原生的Object.keys这个api  Object.keys(obj);/*简单举例*/Object.keys({"A":"a","B":"b"});//["A","B"]兼容性写法:  if(!Object.keys){Object.keys=......