OOP封装
面向对象的三个主要特性是封装、继承、多态
OOP的封装
隐藏对象的字段和实现细节,仅对外公开接口,控制在程序中字段的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。字段的作用域:1. ???public 公共的 (类外可以访问的)2. ???private 私有的 (类内可以访问)3. ???protected 受保护的(类内和子类可以访问,类外不可以访问)什么是类内,就是创建类的花括号内的范围叫做类内,其他地方叫做类外。创建使用了私有字段,这样外部就无法访问了
示例
class Computer{// 类的字段(成员)//private 是私有化,即对字段进行封装的操作,类外无法访问,取值和赋值都不能操作private $_name = ‘联想‘;private $_mode = ‘I7‘;}$computer1 = new Computer();//此时无法访问echo $computer1->_name;#通过公共方法作为入口,访问私有字段,而必须使用$this关键字。class Computer{//类的字段(成员)private $_name="联想";//这时采用一个对外的公共方法来访问私有字段//因为私有字段只能在类内访问,而对外的公共方法是类内的//更而公共方法又是公共的,所以类外又可访问。public function _run(){//字段在类内调用的时候,必须是类->字段,而$_name只是一个普通变量而已。//字段在类外调用的方法是对象->字段,而类内就必须使用Computer->_name//但在本类中,可以用一个关键字来代替Computer,那就是$thisecho $this->_name;}}$computer1 = new Computer();echo $computer1->_run();
对私有字段的赋值和取值
可以设计两个公共方法,一个方法是setName(),用于赋值,一个方法是getName(),用于取值。
class Computer{// 类的字段(成员) ???private $_name = "联想";// 构造方法 ???public function __construct() ???{ ???????echo "<meta charset=utf8>"; ???}// 赋值public function setName($name){//这里的$_name 只是一个变量而已,参数而已//this->_name才是类的字段 ???????$this->_name=$name;}// 取值 ???public function getName(){ ???????return $this->_name; ???}}$computer1 = new Computer();$computer1->setName("dell");echo $computer1->getName();
拦截器
如果有十个字段那么就必须要有二十个方法才能够赋值和取值,php内置了两个方法(拦截器)专门用于取值和赋值:__set(),__get()
class Computer{ ???private $_name ; ???private ?$_cpu; ???private ?$_model; ???public function __construct() ???{ ???????echo "<meta charset=utf8>"; ???} ???//当类外的对象直接调用私有字段时,会跟着去检查拦截器, ???//如果直接对$_name进行赋值,那么 __set()方法就会拦截住,就不会报错了 ???//采用拦截器赋值和取值 ???//赋值 ???public function __set($name, $value) ???{ ???????//如果$name = ‘_name‘,如果$value="联想" ???????// $this->_name=‘联想‘ ???????//如果$name=‘_cpu‘,如果$value="4核" ???????//$this->_cpu =‘4核‘ ???????//如果$name=‘_model‘,如果$value=‘i7‘ ???????//$this->_model=‘i7‘ ???????$this->$name = $value; ???} ???//取值 ???public function __get($name) ???{ ???????//如果$key = ‘_name‘ 那么$this->_name ???????//如果$key = ‘_cpu‘ 那么$this->_cpu ???????//如果$key = ‘_model‘ 那么$this->_model ???????return $this->$name; ???}}$computer1 = new Computer();$computer1->_name = "联想";$computer1->_model = "i7";$computer1->_cpu = "4核";echo $computer1->_name;echo $computer1->_model;echo $computer1->_cpu;
提示:将成员方法私有化,也可以在类外调用,这是为什么呢?
php面向对象特性(一)
原文地址:https://www.cnblogs.com/anyux/p/8227945.html