• php面向对象特性(一)


    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;

    提示:将成员方法私有化,也可以在类外调用,这是为什么呢?

  • 相关阅读:
    Android开发--Layout元素
    Android开发--RelativeLayout的应用
    group by调优的一些测试
    mysql explain中key_len的计算
    mysql索引长度的一些限制
    order by调优的一些测试
    metadata lock
    JDBC连接数据库
    Java—Map.Entry
    innodb buffer pool
  • 原文地址:https://www.cnblogs.com/anyux/p/8227945.html
Copyright © 2020-2023  润新知