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,那就是$this echo $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;
提示:将成员方法私有化,也可以在类外调用,这是为什么呢?